实验报告大整数.docx
《实验报告大整数.docx》由会员分享,可在线阅读,更多相关《实验报告大整数.docx(18页珍藏版)》请在冰豆网上搜索。
![实验报告大整数.docx](https://file1.bdocx.com/fileroot1/2023-2/4/6d01597f-d067-46eb-a880-c1fa60bfeb3c/6d01597f-d067-46eb-a880-c1fa60bfeb3c1.gif)
实验报告大整数
实验报告
题目:
班级:
计算机092班姓名:
徐丽莉学号:
09136218完成日期:
2010.11.13
目的与要求:
1、线性表的链式存储结构及其基本运算、实现方法和技术的训练。
2、单链表的简单应用训练
3、熟悉标准模版库STL中的链表相关的知识
需求分析
1、编程实现单链表的基本操作
2、利用单链表存储大整数(大整数的位数不限)
3、利用单链表实现两个大整数的相加、相减运算(减法运算可选做)
4、进行测试。
5、用STL之list完成上面的任务。
6、尝试完成HLoj1020。
输入:
123123
12341234
输出:
246
2468
概要设计
抽象数据类型线性表的定义如下:
ADTList{
数据对象:
D={ai|ai∈ElemSet,i=1,2,...,n,n≥0}
{称n为线性表的表长;称n=0时的线性表为空表。
}
数据关系:
R1={|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&e);
初始条件:
已存在
操作结果:
//获取元素
voidcreatelistbyorder(strings);
初始条件:
无
操作结果:
//字符串创建链表
};LinkList
2、主程序的处理流程
intmain()
{
线性表LA,LB,LC初始化;
读入2个字符串;
将这2个字符串创建成链表;
分别用2个指针指向线性表表头;
进行运算;
遍历被插入的链表LC(即输出运算结果);
return0;
}
三、详细设计
1、线性表的实现
structLinkList{
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&e);//获取元素
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;
s->next=p->next;
p->next=s;
}
boolLinkList:
:
Delete(inti,int&e)
{
LNode*p=head;
intj=0;
while(p->next!
=NULL&&j{
p=p->next;
++j;
}
//寻找第i个结点,并令p指向其前趋
if(!
(p->next)||j>i-1)returnfalse;//删除位置不合理
LNode*q=p->next;
p->next=q->next;//删除并释放结点
e=q->data;
deleteq;
returntrue;
}
voidLinkList:
:
Clear()
{
LNode*p;
while(head->next!
=NULL)
{
p=head->next;
head->next=p->next;
}
}
intLinkList:
:
Locate(inte)
{
LNode*p=head->next;
intj=0;
while(p!
=NULL&&p->data!
=e)
{
j++;
p=p->next;
}
returnj;
}
voidLinkList:
:
Create(intn)
{
head=newLNode;
head->next=NULL;//先建立一个带头结点的单链表
for(inti=n;i>0;-
{
LNode*p=newLNode;
cin>>p->data;//输入元素值
p->next=head->next;
head->next=p;//插入
}
}
voidLinkList:
:
Traverse()
{
LNode*p=head->next;
while(p!
=NULL)
{
cout<data<p=p->next;
}
}
boolLinkList:
:
Empty()
{
if(head->next=NULL)returntrue;
elsereturnfalse;
}
boolLinkList:
:
GetElem(inti,int&e)//获取元素
{
if(i<1)returnfalse;
LNode*p=head->next;
while(p!
=NULL&&i>1)
{
i--;
p=p->next;
}
if(p==NULL)returnfalse;
elsee=p->data;
returntrue;
}
voidLinkList:
:
createlistbyorder(strings)
{
for(inti=0;i{
LNode*p=head;
LNode*q=newLNode;
q->data=s[i]-'0';
q->next=p->next;
p->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->next;
LNode*it2=LB.head->next;
intcarry=0;
while(it1!
=NULL||it2!
=NULL)
{
intc=carry;
if(it1!
=NULL)
{
c=c+it1->data;
it1=it1->next;
}
if(it2!
=NULL)
{
c=c+it2->data;
it2=it2->next;
}
carry=c/10;
c=c%10;
LC.InsertBefore(1,c);
}
if(carry>0)
{
LC.InsertBefore(1,carry);
}
LC.Traverse();
return0;
}
测试结果:
总代码:
#include
#include
usingnamespacestd;
structLNode
{
intdata;//数据域
LNode*next;//指针域
};
structLinkList{
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&e);//获取元素
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;
s->next=p->next;
p->next=s;
}
boolLinkList:
:
Delete(inti,int&e)
{
LNode*p=head;
intj=0;
while(p->next!
=NULL&&j{
p=p->next;
++j;
}
//寻找第i个结点,并令p指向其前趋
if(!
(p->next)||j>i-1)returnfalse;//删除位置不合理
LNode*q=p->next;
p->next=q->next;//删除并释放结点
e=q->data;
deleteq;
returntrue;
}
voidLinkList:
:
Clear()
{
LNode*p;
while(head->next!
=NULL)
{
p=head->next;
head->next=p->next;
}
}
intLinkList:
:
Locate(inte)
{
LNode*p=head->next;
intj=0;
while(p!
=NULL&&p->data!
=e)
{
j++;
p=p->next;
}
returnj;
}
voidLinkList:
:
Create(intn)
{
head=newLNode;
head->next=NULL;//先建立一个带头结点的单链表
for(inti=n;i>0;-
{
LNode*p=newLNode;
cin>>p->data;//输入元素值
p->next=head->next;
head->next=p;//插入
}
}
voidLinkList:
:
Traverse()
{
LNode*p=head->next;
while(p!
=NULL)
{
cout<data<p=p->next;
}
}
boolLinkList:
:
Empty()
{
if(head->next=NULL)returntrue;
elsereturnfalse;
}
boolLinkList:
:
GetElem(inti,int&e)//获取元素
{
if(i<1)returnfalse;
LNode*p=head->next;
while(p!
=NULL&&i>1)
{
i--;
p=p->next;
}
if(p==NULL)returnfalse;
elsee=p->data;
returntrue;
}
voidLinkList:
:
createlistbyorder(strings)
{
for(inti=0;i{
LNode*p=head;
LNode*q=newLNode;
q->data=s[i]-'0';
q->next=p->next;
p->next=q;
}
}
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->next;
LNode*it2=LB.head->next;
intcarry=0;
while(it1!
=NULL||it2!
=NULL)
{
intc=carry;
if(it1!
=NULL)
{
c=c+it1->data;
it1=it1->next;
}
if(it2!
=NULL)
{
c=c+it2->data;
it2=it2->next;
}
carry=c/10;
c=c%10;
LC.InsertBefore(1,c);
}
if(carry>0)
{
LC.InsertBefore(1,carry);
}
LC.Traverse();
return0;
}
实验心得:
拿到这个实验,我首先看了老师上课的课件,弄懂能够使这个实验实现的思想:
即把输入数据当做2个字符串处理,而后我又发现把字符串转化成线性表处理会更加简单。
即把输入的2个字符串转化为线性表LA,LB;然后将他们各个位置对应相加插入线性表LC。
实现这个操作需要用到boolInit();voidInsertBefore(inti,inte);voidTraverse();这几个函数,因此我又翻看了以前的笔记,将这几个函数在intmain()外写好。
当我把所有需要的函数写好,在编译没有错误的时候,我进行了数据测试,结果发现只能输入,而不能输出结果,经过数次检查后我仍然找不到错误,然后我又试着用老师教过的调试方法,结果发现输入正确,然而初始化这部并未实现,于是就去上面的函数查找错误,结果发现我在InsertBefore(inti,inte)中创建了一个新链表。
而后我改了这个错误,再次运行发现结果正确了,由此,我懂得了做实验应该细心,仔细发现错误,切记不能照搬照抄老师的代码。
有时即使编译没有错误,运行结果出来时还是会有错误。
所以以后的实验我不仅要细心,更要谨慎。