武汉理工大学继续教育学院
学生实践课程报告
学习中心(函授
站)
主要内容
课程实践
专 业
计算机应用技术
学 号
姓 名
辅导教师
年
月
日
1
主要内容及完成情况
一、课程训练目标
本课程的实践环节训练目标如下:
1、通过该课程的课程设计加深学生对课堂知识的理解;通过算法设计、编程提高学生的动手能力;
2、通过要求学生结合程序设计、数据结构、计算机原理等相关知识进行综合训练,提高学生综合
应用能力。
二、要求完成的主要任务
1.在学习完数据结构的双向循环链表后,为了能够加深对双向循环链表的理解和应用,本课程
设计用双向循环链表实现任意长度证书相加的操作。
2.本设计要求利用双向循环链表,设计一个实现任意长的整数进行加法运算的演示程序。要求输
入和输出每四位一组,组间用逗号隔开。如:1,0000,0000,0000,0000。
3.设计与编码在 VC++6.0 平台上开发、调试、模拟运行。
三、应完成的设计成果
1、需求分析
需要开发一个程序,该程序能够实现任意长的整数加法,该程序能够正确执行加法运算,并将结
果按照每四位加逗号的形式输出。如:1,0000,0000,0000,0000。
(l)输入的形式和输入值的范围
输入按照-XXXX,XXXX,XXXX,XXXX,XXXX,XXXX,XXXX,XXXX...的格式输入,范围不限。
(2)输出的形式
输出按照输入按照-XXXX,XXXX,XXXX,XXXX,XXXX,XXXX,XXXX,XXXX...的格式输出。
(2)程序所能达到的功能
程序能够将用户输入的-XXXX,XXXX,XXXX,XXXX,XXXX,XXXX,XXXX,XXXX...形式的两个加数存入
双向循环链表,并调用求和函数,将两个整数相加,并以-
XXXX,XXXX,XXXX,XXXX,XXXX,XXXX,XXXX,XXXX...格式输出两个整数相加的结果。
2、概要设计
(1)抽象数据类型定义
定义双向链表:
typedef struct DualNode
{
int data;
struct DualNode *prior, *next;
}DualNode, *DualList;
(1)函数定义
DualList InitList(int sign) //初始化双向链表
void InsertNodeAtTail(DualList L, int data) //在链表尾部插入新节点
void InsertNodeAtHead(DualList L, int data) //在链表头部插入新节点
void PrintList(DualList L) //顺序输出链表
DualList InputData() //链表赋值
void DelNode(DualList L, DualNode *p) //删除链表节点
2
void Add(DualList a, DualList b, DualList c) //操作数做加法
void Sub(DualList a, DualList b, DualList c) //操作数做减法
DualList AddList(DualList a, DualList b) //两个任意长整数链表相加
3、详细设计
(1)模块设计
初始化双向链表子模块:
DualList InitList(int sign)
{
//头结点存放符号位,1 为正,-1 为负
DualList L;
L = (DualList)malloc(sizeof(DualNode));
L->next = L->prior = L;
L->data = sign;
return L;
}
在链表尾部插入新节点:
void InsertNodeAtTail(DualList L, int data)
{
//尾插,用于存储数据的输入
DualNode *s;
s = (DualList)malloc(sizeof(DualNode));
s->data = data;
s->next = L;
s->prior = L->prior;
L->prior->next = s;
L->prior = s;
}
在链表头部插入新节点:
void InsertNodeAtHead(DualList L, int data)
{
// 即插在头结点之后,用于计算结果的存储
DualNode *s;
s = (DualList)malloc(sizeof(DualNode));
s->data = data;
s->next = L->next;
s->prior = L;
L->next->prior = s;
L->next = s;
}
顺序输出链表:
void PrintList(DualList L)
{
//打印结果
int FirstTime = 1;
DualNode *p = L;
if (p->data == -1) printf("-");
p = p->next;
while(p != L)
{
if (FirstTime)
{
FirstTime = 0;
printf("%d", p->data);
}
else
{
printf(",%4d", p->data);
}
p = p->next;
}
printf("\n");
}
链表赋值:
DualList InputData()
{
int FirstNum = 1, data;
char c;
DualList L;
L = (DualList)malloc(sizeof(DualNode));
L->next = L->prior = L;
3
printf("Please Input as Format: -1234,1234,1234\n");
if ((c = getchar()) == '-')
L = InitList(-1);
else
L = InitList(1);
if (isdigit(c))
// 退格处理
ungetc(c, stdin);
do{
scanf("%d", &data);
InsertNodeAtTail(L, data);
}while((c = getchar()) != '\n');
printf("Your Input is:\n");
PrintList(L);
return L;
}
删除链表节点:
void DelNode(DualList L, DualNode *p)
{
p->prior->next = p->next;
p->next->prior = p->prior;
free(p);
}
操作数做加法:
void Add(DualList a, DualList b, DualList c)
{
DualList pa, pb;
int carry = 0, tmp;
pa = a->prior;
pb = b->prior;
while((pa != a) && (pb != b))
{
tmp = pa->data + pb->data + carry;
if (tmp >= 10000)
{
carry = 1;
tmp -= 10000;
}else
carry = 0;
InsertNodeAtHead(c, tmp);
pa = pa->prior;
pb = pb->prior;
}
while(pa != a)
{
// pb = b
tmp = pa->data + carry;
if (tmp >= 1000)
{
carry = 1;
tmp -= 10000;
}
else
carry = 0;
InsertNodeAtHead(c, tmp);
pa = pa->prior;
}
while(pb != b)
{
// pa = a
tmp = pb->data + carry;
if (tmp >= 1000)
{
carry = 1;
tmp -= 10000;
}
else
carry = 0;
InsertNodeAtHead(c, tmp);
pb = pb->prior;
}
if (carry != 0)
InsertNodeAtHead(c, 1);
}
操作数做减法:
void Sub(DualList a, DualList b, DualList c)
{
DualList pa, pb, pc;
int borrow = 0,tmp;
pa = a->prior;