完整word版长整数四则运算实验报告文档格式.docx
《完整word版长整数四则运算实验报告文档格式.docx》由会员分享,可在线阅读,更多相关《完整word版长整数四则运算实验报告文档格式.docx(9页珍藏版)》请在冰豆网上搜索。
(默认较长的数作为被加数、被减数)
三、详细设计
typedefstructDoubleNode//定义链表元素
voidInitNode(DLNode**head)//初始化链表
intInsertNode(DLNode*head,intn,DataTypex)//向链表第N个位置插入元素X
intdigit(intn)//判断整数N有几位
voidPrintNode(DLNode*head)//打印链表
voidDestroyNode(DLNode**head)//销毁链表
voidadd(DLNode*h1,DLNode*h2)//两数相加
voidjian(DLNode*h1,DLNode*h2)//两数相减
intmain()//入口函数
四、调试分析
由于在程序设计时,对于指针的不了解,编程时使用双重指针,无形中给自己增添了更多麻烦。
老师在检查的过程中指出并教导了这一点。
五、测试结果
1、输入0和0做加法运算,输出“0”,结果如下图:
2、输入2345,6789和-7654,3211做减法运算,输出“1,0000,0000”,结果如下图:
3、输入1,0000,0000,0000和9999,9999做减法运算,输出“9999,0000,0001”,结果如下图:
4、输入1,0001,0001和1,0001,0001做减法运算,输出“0”,结果如下图:
5、输入1,1111和1,1111做减法运算,输出“0”结果如下图:
六、心得体会
本次实验主要是针对双向链表的练习,通过这次试验我们大家对于双向循环链表有了更深刻的记忆。
另在讲解的过程中,老师指出了我们在编程中存在的不足点,我们对于指针跟双重指针有了更清晰的认识。
在与同学的交流中,也更清楚的认清了自己的不足,以后会更加努力的。
七、附录
#include<
stdio.h>
string.h>
stdlib.h>
#include<
math.h>
#defineN100
typedefintDataType;
typedefstructDoubleNode//定义链表元素
{DataTypedata;
structDoubleNode*prior;
structDoubleNode*next;
}DLNode;
voidInitNode(DLNode**head)//初始化链表
{
if((*head=(DLNode*)malloc(sizeof(DLNode)))==NULL)
exit
(1);
(*head)->
prior=*head;
next=*head;
}
intInsertNode(DLNode*head,intn,DataTypex)//向链表第N个位置插入元素X
{DLNode*p,*nt;
inti=0;
p=head->
next;
while(p!
=head&
&
i<
n)
{
p=p->
i++;
}
if(i!
=n)
printf("
插入位置错误\n"
);
return0;
if((nt=(DLNode*)malloc(sizeof(DLNode)))==NULL)
exit
(1);
nt->
data=x;
nt->
prior=p->
prior;
prior->
next=nt;
next=p;
p->
prior=nt;
return1;
intdigit(intn)//判断整数N有几位
inti;
for(i=1;
;
n/=10,i++)
if(n/10==0)
returni;
}
voidPrintNode(DLNode*head)//打印链表
{DLNode*p=head->
while(p->
data==0)//去掉前面的一串0
{p=p->
if(p==head)
{printf("
0\n"
return;
%d"
p->
data);
//最前面的一个数进行特殊处理,不用补零
p=p->
while(p!
=head)//打印后面的数字
"
if(p->
data==0)
0000"
continue;
for(i=0;
4-digit(p->
i++)//补零
0"
printf("
\n"
voidDestroyNode(DLNode**head)
{DLNode*p,*p1;
p=(*head)->
=*head)
{p1=p;
free(p1);
free(p);
head=NULL;
{DLNode*p1=h1->
prior,*p2=h2->
while(p1!
=h1&
p2!
=h2)//每个链表元素相加
{p1->
data+=p2->
data;
p1=p1->
p2=p2->
p1=h1->
while(p1!
=h1->
next)//处理链表元素
{if(p1->
data>
=10000)
{p1->
data+=p1->
data/10000;
p1->
data%=10000;
}if(p1->
data<
0)//处理负数
{if(h1->
next!
=0)
{p1->
data-=1;
p1->
data+=10000;
}p1=p1->
if(h1->
next->
=10000)//处理最前面的数
{InsertNode(h1,0,h1->
data/10000);
h1->
if(h1->
=-10000)
h1->
data%=-10000;
PrintNode(h1);
=h2)//每个链表元素相减
data-=p2->
p2=p2->
p1=h1->
if(p1->
data/-10000);
PrintNode(h1);
DLNode*head1,*head2;
InitNode(&
head1);
head2);
chardata1[N],data2[N];
chard1[10],d2[10];
inti,j,k;
intxun;
while
(1)
输入数据:
scanf("
%s%s"
data1,data2);
InitNode(&
i=0;
k=0;
while(data1[i]!
='
'
)//将数1用链表储存
for(j=0;
j<
10;
j++)
d1[j]=0;
j=0;
while(data1[i]!
data1[i]!
'
)
d1[j++]=data1[i++];
if(data1[i]=='
if(data1[0]=='
-'
)//处理正负数
j=-(int)fabs(atoi(d1));
//将字符串转换成整数
elsej=atoi(d1);
InsertNode(head1,k++,j);
k=0;
while(data2[i]!
)//将数2用链表储存
d2[j]=0;
j=0;
data2[i]!
d2[j++]=data2[i++];
if(data2[i]=='
)i++;
if(data2[0]=='
)//处理正负数
j=-(int)fabs(atoi(d2));
elsej=atoi(d2);
InsertNode(head2,k++,j);
选择加减法:
1—加法,2-减法\n"
scanf("
&
xun);
switch(xun)
case1:
if(strlen(data1)>
strlen(data2))//较长的数作为被加数
add(head1,head2);
elseadd(head2,head1);
break;
case2:
strlen(data2))//较长的数作为被减数
jian(head1,head2);
elsejian(head2,head1);
default:
break;
}
DestroyNode(&
return0;