数据结构课程设计报告长整数运算Word文件下载.docx
- 文档编号:16329429
- 上传时间:2022-11-22
- 格式:DOCX
- 页数:19
- 大小:61.16KB
数据结构课程设计报告长整数运算Word文件下载.docx
《数据结构课程设计报告长整数运算Word文件下载.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计报告长整数运算Word文件下载.docx(19页珍藏版)》请在冰豆网上搜索。
构造一个双向循环链表L,用a判断是正数还是负数
DestroyList(&
L)
初始条件:
双向循环两已经存在
销毁有序表L
Insert(&
L,a)
双向循环链表已经存在
在循环链表的末尾插入一个结点,且此结点的数据值为a
HeadInsert(&
在循环链表的头结点后插入一个结点,且此结点的数据值为a
CountNode(&
L)
双向循环链表存在
计算出链表中结点的个数,并返回个数
Compare(&
L1,&
L2)
L1和L2存在
比较两个双向循环链表的大小,用返回值1表示L1大于L2,返回值-1标志L1小于L2,返回值0标志L1和L2相等
ToNum(*s,i,&
e)
s为字符串中指向某个字符的指针
将s的前i个字符转换为数字,存入e中
CreatNum(&
L,&
s)
s为某个字符串,双向循环链表L存在
将字符串s转换成数字存入到循环链表L中
Add(L1,L2,op)
双向循环链表L1和L2存在,op为结果的标识符
两个链表相加,求出结果。
Sub(L1,L2,op)
双向循环链表L1和L2存在
L1减去L2,求出结果,op为结果的标识符
EraseZero(Link&
双向循环链表L存在
删去L链表头结点后,第一个数据不为零结点前的所有数据为零的结点。
如果结点数据都为零,则保存一个结点。
print(L)
从L头结点开始顺此打印每个结点中的数据
3.软件结构设计:
本程序包含四个模块:
1.主程序模块
Intmain()
接受命令
While(“命令”!
=“退出”)
输入字符串
建立双向循环链表
将字符串转换为要求的格式存入链表的每个结点
对链表中数据进行即兴操作数理
再次接受命令
2.双向链表操作模块------实现结点的插入、删除、修改
3.字符串转换存储模块----实现将字符串转换为数字按格式存储在链表中
4.数据计算模块—--------对存储在链表中的数据进行计算,得到最终期望的结果
各个模块调用的关系如下:
主程序模块
数据运算模块
双向链表操作模块
字符串转换模块
主程序模块中的函数原型:
voidInterface()-------------------操作界面函数
StatusCreatNum(Link&
L,char*s)----创建数字链表函数
LinkCompute(Link&
L1,Link&
L2,charOpe)----数据计算函数
数据运算模块:
LinkAdd(Link&
L2,charop)----加法计算
LinkSub(Link&
L2,charop)----减法运算
voidInitLinkList(Link&
L,chara)
StatusDestroyList(Link&
StatusInsert(Link&
L,Elemtypea)
intCountNode(LinkL)
BOOLCompare(Link&
voidEraseZero(Link&
StatusHeadInsert(Link&
L,Elemtypea)
L,char*s)
StatusToNum(char*s,inti,long&
e)
人机界面:
三、详细设计
1..根据分析和链表操作的特点,采用双向循环链表实现,这里头结点存储数字的符号。
typedeflongElemtype;
typedefintStatus;
typedefintBOOL;
typedefstructLNode{
Elemtypedata;
LNode*next;
LNode*prior;
}Node,*Link;
L,chara){
//对一个双向循环链表进行初始化,分配头结点
L=(Link)malloc(sizeof(Node));
//动态分配存储空间
If(!
L)returnFALSE;
if(a=='
-'
)L->
data=-1;
//L->
data存放符号节点,如果是‘-’则为,否则为0
elseL->
data=1;
L->
prior=L;
next=L;
L){
//销毁链表L
if(!
L)returnERROR;
//链表不存在
p=L->
prior;
//p指向链表头节点的前驱
while(p!
=L)//删除节点节点p
{
q=p->
free(p);
//释放节点p的空间
p=q;
}
free(L);
//释放链表L的存储空间
returnOK;
L,Elemtypea){
//分配一个结点,并将其数据值存为a,插入到链表的末尾
p=(Link)malloc(sizeof(LNode));
if(!
p)
exit(OVERFLOW);
p->
next=p->
prior=NULL;
data=a;
Linkq=L->
q->
next=p;
prior=q;
next=L;
L->
prior=p;
returnOK;
L,Elemtypea){
//分配一个结点,并将其数据值存为a,按头插入法插入
p=(Link)malloc(sizeof(LNode));
exit(OVERFLOW);
p->
Linkq=L->
next;
q->
next=q;
prior=L;
e){
//将字符串s的前i位转换为正数,并由e保存
sum=0;
for(m=1,n=1;
m<
=i;
n=n*10)//n的值每次是原来的10倍
sum+=(*(s-m)-'
0'
)*n;
//转换成相应的数字
m++;
e=sum;
L,char*s){
//将字符串转分割成很多部分,每部分转换为数字后存在一个链表结点中。
InitLinkList(L,s[0]);
if(*s=='
)
{InitLinkList(L,s[0]);
s++;
else
InitLinkList(L,s[0]);
while(*s!
='
\0'
if(*s=='
'
{ToNum(s,i,e);
Insert(L,e);
i=-1;
//因为这是已经将某一个逗号前i个字符变成数字加入
}//数字链表中,逗号不算本次
i++;
s++;
ToNum(s,i,e);
Insert(L,e);
intCountNode(LinkL){
//计算链表L的结点数
Linkp=L->
=L)
p=p->
returni;
L2){
//比较链表L1和L2的大小,如果L1大于L2,返回1,如果L2大于L1,返回-1,如果相等,返回0
if(CountNode(L1)>
CountNode(L2))
//L1大于L2
elseif(CountNode(L1)<
L2大于L1
else{
p1=L1->
next,p2=L2->
while(p1!
=L1&
&
p2!
=L2)
{
if(p1->
data>
p2->
data)
if(p1->
data<
return-1;
p1=p1->
p2=p2->
}
L1和L2相等
L2,charop)主要函数
//将字符串L1和L2的数据相加,得到的结果链表头结点指针返回
Intc=0,temp
Linkp1,p2,p3
p1=p1->
prior,p2=p2->
prior
InitLinkList(L3)
p1!
=L2
Temp=p1->
data+p2->
data+c
是否temp>
=10000
是
否
temp=temp-10000
HeadInsert(L3,temp)
c=0
HeadInsert(L3,temp)c=1
P1=p1->
priorp2=p2->
=L1
temp=p1->
data+cc=temp/10000
temp=p2->
p2=p2->
是否c=1
HeadInsert(L3,c)
LinkSub(LinkL1,LinkL2,charop)主要函数
//将字符串L1和L2的数据相减,得到的结果链表的头结点指针返回
data-p2->
data-c
是否temp<
temp=temp+10000
data-c
temp=temp+10000c=1
HeadInsert(L3,temp)
是否c=1
{//删除链表L的无效零元素结点
p=L->
next,q;
while(p->
data==0&
p->
next!
q=p;
prior=q->
free(q);
L2,charOpe)//主要函数
//对链表L1和链表L2进行计算,即相加,相减等等
EraseZero(L1)EraseZero(L2)
p1=L1->
priorp2=L2->
op=’+’
L1->
data==1&
L2->
data==1
L3=Add(L1,L2,’+’)
data==-1&
是否L1和L2相等
是
L3=
Sub(L1,L2,’’+’)
是否L1大于L2
L3=Sub(L1,L2,’-‘)
L3=Sub(L2,L1,’-‘)
data==-1
Sub(L1,L2,’+’)
Sub(L1,L2,’+‘)
Sub(L2,L1,’-‘)
data==-11&
L3=Add(L1,L2,’-‘)
op=’-‘
data==1
L3=Sub(L1,L2,'
+'
L3=Sub(L2,L1,'
L3=Add(L1,L2,'
);
voidInterface()
//界面函数,显示操作的主界面
Statusprint(LinkL){
//顺次打印链表L中的数据
EraseZero(L);
if(*s<
48&
*s!
||*s>
57)//第一个不是数字也不是-,则出错
returnERROR;
)k=0;
elsek=1;
i=1;
while(*(s+i)!
if(*(s+i)!
(*(s+i)>
57||*(s+i)<
48))
returnERROR;
i=1;
*(s+i)!
){
k++;
if(k>
5)
if(*(s+i)=='
k=4;
while(*(s+i)!
if(*(s+i)=='
if(k!
=4)
returnERROR;
k=-1;
//此时逗号字符不能在四个数字的计算之中
if(k!
=4)//最后一个逗号后必须有四个数
函数调用关系图:
四、调试分析
1.实际完成的功能有:
长整数的加法和减法,支持的数据类型是整形,能够对异常输入进行判断,打印和计算的时候能够消除可能出现的前置零。
2.程序的主要函数compute时间复杂度为O(n),其实n为计算的两个链表的结点个数的较大值。
物理存储使用的是双向链表,有两个指针域,空间消耗在合理范围之内
3.调试中由于是双向链表,在插入时应该注意将prior域进行考虑,刚开始写程序时忘记,导致输出结果错误。
清楚前置零的时候开始没有考虑输入数据全是零的时候,结果将全部的数据结点都给删除,最后没有结果输出,调试中发现这个问题,应该将每个链表至少保存一个数据结点。
4.由于时间仓促,而且长整数四则运算的乘法一直没有想到好的办法,如果再有几天时间,乘法这个功能完全可以加上。
随之就可以完成乘方的计算
5.本程序还有很大的扩充地方,应该可以将程序由正数扩充为浮点数,能够运行更复杂的数据,如求阶乘,开方等功能。
如果实现了,则这个计算器的功能方面就可以和windows系统自带的计算器媲美了。
五、测试结果
列出你的测试结果,包括输入和输出。
注意测试数据应该完整和严格,至少给出2组测试结果(含合法数据与非法数据)。
输入0;
0,输出0
输入1,0001,0001;
-1,0001,0001;
输出0
输入1,0001,0001;
-1,0001,0000;
输出1
输入-9999,9999;
-9999;
9999;
输出-1,9999,9998
非法数据
1,000;
000,1;
输出“输入错误”
六、用户手册
说明如何使用你编写的程序,详细列出每一步的具体操作步骤。
这里可以有适当的运行结果抓图。
用户手册与开发过程无关,只与使用有关,必须是StepbyStep的。
所有运行结果截图均要求有实际数据的内容,截图尺寸要求按页宽排版两张大小,且要求有每张图下面有规范的标题说明如何使用你编写的程序,详细列出每一步的操作步骤。
1.进入操作主界面
2.按照命令提示操作
⑴选1,进入加法运算
①输入第一个操作数:
并且按照提示格式输入
如果输入错误,比如1,000,则程序会提示错误,重新输入
②如果输入正确,比如输入1,0000,输入下一个数
③输入正确,如输入9999,9999则计算出结果
④输出每个链表中的结点值,便于观察比较
⑤输出结果1,0000,9999
⑵选2,进入减法运算
①输入第一个操作数,并按照提示的格式输入
如果输入错误,比如,10,000,程序会提示输入错误,重新输入
②如果输入正确,比如9999,9999,输入下一个数。
③第二个数也输入正确,比如输入10,0000,输出结果
④提示是否继续计算,选择Y或者y退出,其他任意键继续操作
七、体会与自我评价
长整数四则运算的一些思考
这次的课程设计中,长整数四则运算这个实验给了我很大的挑战,在设计中遇到了很多的困难,比如如何用如何将字符数据分割成很多部分存储进双向循环链表,如何判断输入的字符串是否是正确的;
在输入特殊数据买比如0000,00000时,程序能够消除无用的前置零得出正确的结果,我在这些问题上都考虑的很久,一点点的攻破难题,
而在这次实验中我对长正数的各种运算也有了一定的认识,对于特别长的数的计算,只能先求局部结果,最后将局部结果综合起来,得到最终结果。
比如加法就是从最低位开始计算,判断进位后再一次向高位计算,最终得到结果。
计算加法的时候,由于是每四位一个结点,所以是以万位为进制。
输出时如果一个结点中数据是以为,则前面输出三个零,如果是两位,则输出两个零,如果是三位,则输出一个零,四位数直接输出。
如果节点数据为零,则按第一种情况输出是前面加三个零即可。
为了程序的健壮性,应该考虑负数和正数相加的情况,如果一个较大的正数加上一个数值较小的负数,应该是大数减去去掉振幅符号的小数,即可。
如果是一个较小的正数加上一个数值较大的负数,则应该是去掉正负号的负数减去正数,最后在结果里加上一个负号即可。
乘法的基本思想是相加,但是在双向循环链表中,如果乘数很大的时候,单纯的相加要进行很多次,效率上完全不够满足要求,一般是用字符串直接按位相乘,按竖式结构计算。
除法的实现可以用减法,但是问题还是和乘法一样,如果数字太大的话,用双向循环链表,要进行的减法次数也是很庞大的。
以上是我对长整数四则运算的一点思考,本次实验中学到的很多的知识,对循环链表的操作也更加的熟悉,更让我增长了许多的编程经验,我相信以后的编程学习中我会表现的更加出色。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 课程设计 报告 整数 运算