实验报告大整数Word文档下载推荐.docx
《实验报告大整数Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《实验报告大整数Word文档下载推荐.docx(18页珍藏版)》请在冰豆网上搜索。
![实验报告大整数Word文档下载推荐.docx](https://file1.bdocx.com/fileroot1/2023-2/4/6d01597f-d067-46eb-a880-c1fa60bfeb3c/6d01597f-d067-46eb-a880-c1fa60bfeb3c1.gif)
抽象数据类型线性表的定义如下:
ADTList{
数据对象:
D={ai|ai∈ElemSet,i=1,2,...,n,n≥0}
{称n为线性表的表长;
称n=0时的线性表为空表。
}
数据关系:
R1={<
ai-1,ai>
|ai-1,ai∈D,i=2,...,n}
{设线性表为(a1,a2,...,ai,...,an),称i为ai在线性表中的位序。
基本操作:
}ADTList
LinkList{
LNode*head;
//头指针(带头结点)
LNode*tail,*cur;
//尾指针,当前指针
//intlength;
//链表长度
boolInit();
//初始化
初始条件:
无
操作结果:
初始化
voidClear();
已存在
//清除单链表
voidCreate(intn);
初始条件:
无
//建立含n个结点的单链表
intLocate(inte);
//查找
//清除线性表
voidInsertBefore(inti,inte);
//插入元素
初始条件:
boolDelete(inti,int&
e);
//删除元素
voidTraverse();
//遍历,并输出内容
boolEmpty();
//判断空表
boolGetElem(inti,int&
//获取元素
voidcreatelistbyorder(strings);
//字符串创建链表
};
LinkList
2、主程序的处理流程
intmain()
{
线性表LA,LB,LC初始化;
读入2个字符串;
将这2个字符串创建成链表;
分别用2个指针指向线性表表头;
进行运算;
遍历被插入的链表LC(即输出运算结果);
return0;
三、详细设计
1、线性表的实现
structLinkList{
//初始化
//清除线性表
//建立含n个结点的单链表
//遍历,并输出内容
//判断空表
boolGetElem(inti,int&
voidcreatelistbyorder(strings);
//字符串创建链表
boolLinkList:
:
Init()
{
head=newLNode;
head->
next=NULL;
returntrue;
voidLinkList:
InsertBefore(inti,inte)
LNode*p=head;
while(p->
next!
=NULL&
&
i>
1)
{
p=p->
next;
i--;
}
if(p==NULL||i<
1)return;
LNode*s=newLNode;
s->
data=e;
next=p->
p->
next=s;
Delete(inti,int&
e)
intj=0;
j<
i-1)
p=p->
++j;
//寻找第i个结点,并令p指向其前趋
if(!
(p->
next)||j>
i-1)returnfalse;
//删除位置不合理
LNode*q=p->
next=q->
//删除并释放结点
e=q->
data;
deleteq;
Clear()
LNode*p;
while(head->
=NULL)
p=head->
head->
next=p->
}
intLinkList:
Locate(inte)
LNode*p=head->
while(p!
=NULL&
p->
data!
=e)
j++;
returnj;
Create(intn)
head=newLNode;
next=NULL;
//先建立一个带头结点的单链表
for(inti=n;
i>
0;
-
LNode*p=newLNode;
cin>
>
//输入元素值
p->
next=head->
next=p;
//插入
Traverse()
=NULL)
cout<
<
data<
endl;
Empty()
if(head->
next=NULL)returntrue;
elsereturnfalse;
GetElem(inti,int&
e)//获取元素
if(i<
1)returnfalse;
1)
if(p==NULL)returnfalse;
elsee=p->
createlistbyorder(strings)
for(inti=0;
i<
s.size();
i++)
{
LNode*p=head;
LNode*q=newLNode;
q->
data=s[i]-'
0'
;
next=q;
3、主程序
intmain()
{
LinkListLA,LB,LC;
LA.Init();
LB.Init();
LC.Init();
strings1,s2;
cin>
s1>
s2;
LA.createlistbyorder(s1);
LB.createlistbyorder(s2);
LNode*it1=LA.head->
LNode*it2=LB.head->
intcarry=0;
while(it1!
=NULL||it2!
intc=carry;
if(it1!
{
c=c+it1->
it1=it1->
}
if(it2!
c=c+it2->
it2=it2->
carry=c/10;
c=c%10;
LC.InsertBefore(1,c);
if(carry>
0)
LC.InsertBefore(1,carry);
LC.Traverse();
return0;
测试结果:
总代码:
#include<
iostream>
string>
usingnamespacestd;
structLNode
intdata;
//数据域
LNode*next;
//指针域
};
实验心得:
拿到这个实验,我首先看了老师上课的课件,弄懂能够使这个实验实现的思想:
即把输入数据当做2个字符串处理,而后我又发现把字符串转化成线性表处理会更加简单。
即把输入的2个字符串转化为线性表LA,LB;
然后将他们各个位置对应相加插入线性表LC。
实现这个操作需要用到boolInit();
这几个函数,因此我又翻看了以前的笔记,将这几个函数在intmain()外写好。
当我把所有需要的函数写好,在编译没有错误的时候,我进行了数据测试,结果发现只能输入,而不能输出结果,经过数次检查后我仍然找不到错误,然后我又试着用老师教过的调试方法,结果发现输入正确,然而初始化这部并未实现,于是就去上面的函数查找错误,结果发现我在InsertBefore(inti,inte)中创建了一个新链表。
而后我改了这个错误,再次运行发现结果正确了,由此,我懂得了做实验应该细心,仔细发现错误,切记不能照搬照抄老师的代码。
有时即使编译没有错误,运行结果出来时还是会有错误。
所以以后的实验我不仅要细心,更要谨慎。