实验报告大整数.docx

上传人:b****7 文档编号:9564645 上传时间:2023-02-05 格式:DOCX 页数:18 大小:35.24KB
下载 相关 举报
实验报告大整数.docx_第1页
第1页 / 共18页
实验报告大整数.docx_第2页
第2页 / 共18页
实验报告大整数.docx_第3页
第3页 / 共18页
实验报告大整数.docx_第4页
第4页 / 共18页
实验报告大整数.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

实验报告大整数.docx

《实验报告大整数.docx》由会员分享,可在线阅读,更多相关《实验报告大整数.docx(18页珍藏版)》请在冰豆网上搜索。

实验报告大整数.docx

实验报告大整数

实验报告

题目:

班级:

计算机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)中创建了一个新链表。

而后我改了这个错误,再次运行发现结果正确了,由此,我懂得了做实验应该细心,仔细发现错误,切记不能照搬照抄老师的代码。

有时即使编译没有错误,运行结果出来时还是会有错误。

所以以后的实验我不仅要细心,更要谨慎。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 文学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1