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