数据结构实验一.docx
《数据结构实验一.docx》由会员分享,可在线阅读,更多相关《数据结构实验一.docx(9页珍藏版)》请在冰豆网上搜索。
数据结构实验一
数据结构与算法
实验报告
实验题目:
大整数加法
班级:
信息与计算科学141
姓名:
xx
学号:
141021xx
完成日期:
2014.11.03
一、需求分析
1、实验任务是利用线性表的链式存储及其相应操作对两个非负整数(位数可能超过整数类型数据存储的范围)进行相加,求出结果。
2、输入的形式和输入值的范围:
输入的形式为字符,输入值的范围为整数。
3、输出的形式:
整型。
4、程序功能:
实现任意位数的两个整数相加。
5、测试数据:
第一组
666666666666666666666666
222
第二组
12345678987654321
9876543212345678987654321
第三组
133********33333333333333333333333333333
2555555555555555555555555555555555555555
二、概要设计
1、数据类型
储存整数的单链表中的结点结构可以是:
typedefstructline
{
intdata;
structline*next;
}list,*linklist;
2、算法思想
(1)输入两个正确的整数,由于输入整数位数可能超过整数数据类型可以存储的范围,所以要用字符数组的数据类型来接受输入的两个整数。
考虑到每个长整型数的长度在输入之间是无法预知的,因此使用链表在存储空间的分配上更方便一些。
(2)对于存储在字符数组里的整数,可以根据字符数组中从高位到低位的数值位,用前插法建立单链表的方法,将整数存储于带头结点的单链表中每个结点存放一位数字,这时,从单链表的第一个结点到尾结点依次是从个位到最高位的整数,以便相加运算。
(3)对两个单链表依次扫描到尾结点,将尾结点的数值及前面相加留下的进位相加,把和的个位存储到长度长的单链表对应的结点中,同时记录进位,然后把可能有的进位依次与长单链表还未相加过的结点依次相加,若到最后一个结点相加后仍有进位,则要新增加一个结点,以存放进位。
这样两个整数的和已经存储在原来长的单链表中了。
(4)在主函数中要设置相关的数据结构,以存放两个整数和单链表,输入两个整数后,依次可调用输入整数,存储链表模块、链表输出模块、整数相加模块。
3、各子模块
(1)输入整数,存入链表模块
该模块根据字符数组从高位到低位的数值位,用前插法建立单链表。
(2)链表输出模块
输出链表使得从第一个结点到尾结点依次是从个位到最高位的整数,这样便可以进行相加。
(3)整数相加模块
对两个单链表依次扫描到尾结点,将尾结点的数值及前面相加留下的进位相加,把和的个位存储到长度长的单链表对应的结点中,同时记录进位,然后把可能有的进位依次与长单链表还未相加过的结点依次相加,若到最后一个结点相加后仍有进位,则要新增加一个结点,以存放进位。
这样两个整数的和已经存储在原来长的单链表中了。
4、主模块及与子模块的调用关系
(1)主模块
设置数据类型的结构体数组和有关变量,然后依次调用输入整数,存储链表模块、输出链表模块和、整数相加模块。
(2)各模块之间的调用关系
三、详细设计
1、数据结构
typedefstructline
{
intdata;
structline*next;
}list,*linklist;
2、输入整数,存入链表
voidinitList(linklist&l)//输入整数,存入链表
{
charc;
linklistp;
l=(linklist)malloc(sizeof(list));
l->next=0;
while((c=getchar())!
='\n')
{
p=(linklist)malloc(sizeof(list));
p->data=c-48;
p->next=l->next;
l->next=p;
}
}
3、输出单链表中的元素值
voidprint(linklistl)//输出链表
{
l=l->next;
while(l!
=0)
{
printf("%d",l->data);
l=l->next;
}
}
4、整数相加
voidadd(linklist&l,linklistl1,linklistl2)//求和
{
inta,b=0;
linklistp;
l1=l1->next;
l2=l2->next;
l=(linklist)malloc(sizeof(list));
l->next=0;
while(l1!
=0&&l2!
=0)
{
a=l1->data+l2->data+b;
l1=l1->next;
l2=l2->next;
b=a/10;
a=a%10;
p=(linklist)malloc(sizeof(list));
p->data=a;
p->next=l->next;
l->next=p;
}
if(!
l1&&!
l2)
{
if(b==1)
{
p=(linklist)malloc(sizeof(list));
p->data=1;
p->next=l->next;
l->next=p;
}
}
if(l1)
{
while(l1!
=0)
{
a=l1->data+b;
l1=l1->next;
b=a/10;
a=a%10;
p=(linklist)malloc(sizeof(list));
p->data=a;
p->next=l->next;
l->next=p;
}
if(b==1)
{
p=(linklist)malloc(sizeof(list));
p->data=1;
p->next=l->next;
l->next=p;
}
}
if(l2)
{
while(l2!
=0)
{
a=l2->data+b;
l2=l2->next;
b=a/10;
a=a%10;
p=(linklist)malloc(sizeof(list));
p->data=a;
p->next=l->next;
l->next=p;
}
if(b==1)
{
p=(linklist)malloc(sizeof(list));
p->data=1;
p->next=l->next;
l->next=p;
}
}
}
5、主程序模块
voidmain()
{
linklistl1,l2,l3;
while(cout<<"请输入第一个数")
{
cout<initList(l1);
printf("请输入第二个整数:
\n");
initList(l2);
printf("两个整数的和是:
\n");
add(l3,l1,l2);//求和
print(l3);
getchar();
printf("\n");
}
}
四、调试分析
1、遇到的问题:
对于将整数存入两个链表后,如何在链表中计算求和的处理方法不了解。
经过多方查询还有和同学沟通将其解决,办法是定义一个新的链表,将两个链表的和存入新链表中。
2、对设计和实现回顾:
对于两个位数可能超过整数数据类型可以存储范围数的加法运算,首先我对数据的输入进行分析,对于这样的数据可以采用字符串或字符数组进行存储,我选择用字符数组,这样我解决了输入问题。
实验的目的是输出两个大正数的和,这我们就要用到单链表先将存储在字符数组中的数存储于单链表中,对于单链表的操作我们必须熟练掌握。
运用单链表将整数输入输出后,得到从第一个结点到尾结点依次是从个位到最高位的整数,这样便可以进行相加。
新的问题出现,如何相加?
我采用定义一个新链表,将两个链表的和存入新链表中来实现和的输出。
3、经验和不足:
(1)在还没有想清楚的时候就急于编写代码,以至于写的程序无法运行,所用到的运算法则不对。
(2)开始写程序时源程序没有严格按单元模块结构编写,可读性较差。
(3)由于初次进行系统的程序设计,层次结构划分不太合理,应在以后的设计中强化此思维,逐渐与工程设计接轨。
五、测试结果
输入:
666666666666666666666666
222
输出:
666666666666666666666888
输入:
12345678987654321
9876543212345678987654321
输出:
9876543224691357975308642
输入:
133********33333333333333333333333333333
2555555555555555555555555555555555555555
输出:
3888888888888888888888888888888888888888
测试通过。
六、实验成绩(教师填写)
教师签名: