数据结构实验一.docx

上传人:b****6 文档编号:8180055 上传时间:2023-01-29 格式:DOCX 页数:9 大小:93.18KB
下载 相关 举报
数据结构实验一.docx_第1页
第1页 / 共9页
数据结构实验一.docx_第2页
第2页 / 共9页
数据结构实验一.docx_第3页
第3页 / 共9页
数据结构实验一.docx_第4页
第4页 / 共9页
数据结构实验一.docx_第5页
第5页 / 共9页
点击查看更多>>
下载资源
资源描述

数据结构实验一.docx

《数据结构实验一.docx》由会员分享,可在线阅读,更多相关《数据结构实验一.docx(9页珍藏版)》请在冰豆网上搜索。

数据结构实验一.docx

数据结构实验一

数据结构与算法

实验报告

实验题目:

大整数加法

班级:

信息与计算科学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

 

测试通过。

 

六、实验成绩(教师填写)

教师签名:

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 医药卫生 > 中医中药

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1