数据结构长整数四则运算Word格式文档下载.docx
- 文档编号:376703
- 上传时间:2023-04-28
- 格式:DOCX
- 页数:18
- 大小:48.27KB
数据结构长整数四则运算Word格式文档下载.docx
《数据结构长整数四则运算Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《数据结构长整数四则运算Word格式文档下载.docx(18页珍藏版)》请在冰点文库上搜索。
//记录每个节点的整数(小于10000)
LinkNode*next;
//记录下一个节点的地址
LinkNode*pre;
//记录前一个节点的地址
};
classLinkList//定义类LinkList
private:
LinkNode*head0,*head1;
//head0,head1分别记录两个整数链表的头指针
LinkNode*currptr;
LinkNode*result;
//result记录结果链表的头指针
public:
LinkList();
//构造函数,初始化链表
~LinkList();
//析构函数,释放空间
voidCreat(stringa);
//引入字符串,创立两个链表,分别表示两个整数
voidAdd();
//实现两个整数相加
voidDisplay();
//显示结果
voidaddtwo();
//节点多的作为被加数,少的作为加数,实现整//数绝对值大的加小的
voidmain()//主函数
{
……
do{
}while(Yes_No=='
y'
||Yes_No=='
Y'
);
//Yes_No不等于'
或'
时,程序退出
}
三、详细设计
#include<
iostream>
string>
math.h>
usingnamespacestd;
structLinkNode
classLinkList
//链表的实现部分
intsum(intn);
LinkList:
:
LinkList()//构造函数,初始化链表
head0=newLinkNode;
//申请一个空间记录整数的符号和节点数
head1=newLinkNode;
head0->
next=head0;
pre=head0;
//初始化链表,建立双向循环链表
head1->
next=head1;
pre=head1;
result=newLinkNode;
result->
next=result;
pre=result;
currptr=NULL;
~LinkList()//析构函数,释放空间
LinkNode*p1=head0,*p2=head1,*p3=result;
//三个指针分别指向三条链表的头指针
while(p1!
=p1->
pre)
p1->
pre->
next=p1->
next;
next->
pre=p1->
pre;
currptr=p1;
p1=p1->
deletecurrptr;
while(p2!
=p2->
pre)//逐个删除节点,释放空间
{
p2->
next=p2->
pre=p2->
currptr=p2;
p2=p2->
while(p3!
=p3->
pre)
p3->
next=p3->
pre=p3->
currptr=p3;
p3=p3->
//deletep1;
//deletep2;
//deletep3;
voidLinkList:
Creat(stringa)//引入字符串,创立两
//个链表,分别表示两个整数
inti=0,j=0,m=0,n=0,k=0,l=0,s=0,w=0;
//i记录字符串,j记录加数节点数;
s记录被加数节点数
//w标记字符串中的‘-’号
//k记录字符串中的字符转化为整数的值,l使每个节点记录4位
while(a[m]!
='
;
'
)m++;
//m记录字符串中被加数的字符数
n=m;
while(a[n]!
\0'
)n++;
//n记录字符串的总字符数
if(a[0]=='
-'
)
head0->
data=(-1);
//记录整数符号
w=1;
else
data=1;
for(i=m-1;
i>
=w;
i--)
if(a[i]!
'
)//把字符转化为整数
{
k+=(a[i]-'
0'
)*sum(l);
l++;
}
if(a[i]=='
||i==w)
currptr=newLinkNode;
//把整数存到双向循环链表中
currptr->
data=k;
pre=head0->
next=currptr;
pre=currptr;
head0=currptr;
s++;
//节点数加1
k=0;
//重新初始化k和l
l=0;
data*=s;
//存储整数符号和节点数
//与建第一个整数链表一样,建立第二个整数链表head1
k=0;
l=0;
if(a[m+1]=='
head1->
m++;
for(i=n-1;
m;
i--)
||i==m+1)
pre=head1->
head1=currptr;
j++;
data*=j;
Add()//实现两个整数相加
LinkNode*temp;
if(abs(head0->
data)>
abs(head1->
data))
//两个整数中,绝对值大的为被加数
addtwo();
elseif(abs(head0->
data)<
data))
temp=head0;
head0=head1;
head1=temp;
data)==abs(head1->
intk1,k2;
LinkNode*p=head0,*q=head1;
//如果节点数相同,则判断节点中数值大小
while(p->
data==q->
data&
&
p!
=head0->
pre&
q!
=head1->
p=p->
q=q->
k1=p->
data;
k2=q->
if(k1>
k2)
else
{
addtwo()
//节点多的作为被加数,少的作为加数,实现整数绝对值大的加小的
//默认head0存的整数绝对值比head1大
ints=0,m1=head0->
data,m2=head1->
m1=(head0->
data/abs(head0->
data));
//head0的符号
m2=(head1->
data/abs(head1->
//head1的符号
LinkNode*p=head0->
pre,*q=head1->
data=head0->
//存结果的节点数和符号
while(q!
//head0存的整数绝对值比head1大,即head0的节点数大于或等于head1
data=(p->
data)*m1+(q->
data)*m2+s;
//两整数相加
if((m1*m2)>
0)//如果符号相同
if(abs(currptr->
data)-10000>
=0)//相加后超过10000,则进位
s=currptr->
data/10000;
data=abs(currptr->
data)%10000;
}
else//abs(currptr->
data)-10000<
0,不进位
s=0;
data);
elseif(m1>
0&
m2<
0)
//符号不同,在此相当于实现两个正整数相减
if(currptr->
data<
0)//小于0,向前一位借1
data+=10000;
s=-1;
elseif(m1<
m2>
//符号不同,在此相当于实现负整数加上正整数
data>
0)//大于0,
data=10000-currptr->
s=1;
elsecurrptr->
//存入链表
pre=result->
result->
result=currptr;
}
//当head0节点数比head1长时,继续建链
while(p!
data=p->
data*m1+s;
0)
=0)
else{s=0;
currptr->
if(s!
=0)//处理相加后,进位问题
data=abs(s);
data=m1*(abs(result->
data)+1);
Display()//显示结果
LinkNode*p=result;
intFuHao=result->
data/abs(result->
//结果的符号
data==0&
=result->
//当运算后前几个节点的数据为0时,不输出
data=(abs(result->
data)-1)*FuHao;
//结果记录非0节点数
cout<
<
FuHao*p->
//首先显示符号和第一个节点中的数
if(abs(result->
data)!
=1)p=p->
//判断非0节点数是否为1
pre)//继续输出
cout<
"
"
//每4位一组,并用‘,’隔开
cout.width(4);
cout.fill('
p->
if(p==result->
abs(result->
=1)
//显示最后一个节点数据
endl;
intsum(intn)//计算10的乘方
inti,s=1;
for(i=1;
i<
=n;
i++)
s=s*10;
returns;
//主函数和其他函数的实现
***********************************************\n"
**********欢迎使用任意长整数加法系统***********\n"
\n"
在此系统中,可以输入任意长的整数。
|\n"
stringch;
charYes_No;
|输入形式为:
(-)**,****,****;
(-)*,****,****,****|\n"
即符号+数,每4位加一个'
,两个数之间用'
隔开|\n"
请输入你要计算的两个数:
cin>
>
ch;
//输入任意长字符串
LinkListList;
//定义链表对象
List.Creat(ch);
//把字符串转化为整数,并存到链表中
List.Add();
List.Display();
//输出结果
是否继续计算(Y/N):
//询问是否继续计算
Yes_No;
}while(Yes_No=='
*****************感谢使用本系统!
***************\n"
***********************************************\n"
四调试分析
在设计初期采用C语言设计,在编译上出现了好多问题,导致了代码利用率不高并且结构松散,进而采用C++的思想,利用类之后,不仅代码量减少,效率也提高了不少。
在编译的时候,程序不能很好地检测出输入形式,如果输入格式不正确,就不能很好地计算出正确结果,对于这一问题,没找到很好地解决办法。
总体来说,这个程序相对简单,但在指针的利用方面,编程的时候出现了一些问题。
经过仔细检查与多次修改,成功的解决了指针问题。
五、用户手册
1、本程序的运行环境为DOS操作系统,执行文件为长整数四则运算.exe。
2、进入演示程序后即显示文本方式的用户界面:
3、按照上面要求输入要计算的两个数即可。
输入完成后按回车键,将输出计算结果。
继续计算请按Y或y,否则请按N或n。
六、测试结果
七、附录
该程序在同一个文件,即只在.cpp文件里的以实现。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 整数 四则运算