《数据结构》实验报告.docx
- 文档编号:28998812
- 上传时间:2023-07-20
- 格式:DOCX
- 页数:25
- 大小:21.52KB
《数据结构》实验报告.docx
《《数据结构》实验报告.docx》由会员分享,可在线阅读,更多相关《《数据结构》实验报告.docx(25页珍藏版)》请在冰豆网上搜索。
《数据结构》实验报告
——实验报告
《数据结构》
目录
《数据结构》1
第1章大整数加法1
(一)实验目的与要求1
(二)实验内容与步骤1
(三)具体步骤1
步骤111
步骤122
步骤134
步骤144
步骤155
步骤165
步骤177
(四)实验结果分析8
(五)收获与体会9
第2章栈序列匹配10
(一)实验目的与要求10
(二)实验内容与步骤10
(三)具体步骤10
步骤2110
步骤2210
步骤2311
步骤2412
步骤2512
步骤2613
(四)实验结果分析13
(五)收获与体会13
第3章二叉排序树16
(一)实验目的与要求16
(二)实验内容与步骤16
(三)具体步骤16
步骤3116
步骤3116
步骤3116
步骤3116
步骤3116
步骤3116
步骤3116
(四)实验结果分析16
(五)收获与体会16
第4章最小生成树17
(一)目的与要求17
(二)实验背景:
17
(三)内容与步骤:
17
(四)具体步骤17
步骤4117
步骤3117
步骤3117
步骤3117
步骤3117
步骤3117
步骤3117
(五)实验结果分析17
(六)收获与体会17
第1章大整数加法
(一)实验目的与要求
1.线性表的链式存储结构及其基本运算、实现方法和技术的训练。
2.单链表的简单应用训练。
3.熟悉标准模版库STL中的链表相关的知识。
(二)实验内容与步骤
1.编程实现单链表的基本操作。
2.利用单链表存储大整数(大整数的位数不限)。
3.利用单链表实现两个大整数的相加运算。
4.进行测试,完成HLOJ()951502-线性表大整数A+B。
5.用STL之list完成上面的任务。
6.尝试完成HLOJ951602-线性表大菲波数。
(三)具体步骤
步骤11
先明确单链表的基本操作有哪些,并写出实现单链表基本功能的结构体(struct/class)。
Code:
classNode
{
public:
intNumber;
Node*Next;
Node();
};
classLinkedList
{
public:
Node*This;
public:
LinkedList();
voidpush_back(intGoal);
voidpush_front(intGoal);
voidinsert(intLocation,intGoal);
voiderase(intLocation);
voidclear();
voidreverse();
voidTraverse();
boolempty(){return(bool)Length;}
intsize(){returnLength;}
private:
Node*Head,*Tail;
intLength;
};
步骤12
现在,只需要具体实现步骤11每个函数的功能即可。
Code:
Node:
:
Node()
{
Number=0;
Next=NULL;
}
LinkedList:
:
LinkedList()
{
Head=newNode;
Head->Number=0;
Head->Next=NULL;
Tail=NULL;
This=Head;
Length=0;
}
voidLinkedList:
:
push_back(intGoal)
{
Node*s=newNode;
s->Number=Goal;
if(Head->Next==NULL)Head->Next=s;
elseTail->Next=s;
Tail=s;
Length++;
}
voidLinkedList:
:
push_front(intGoal)
{
Node*s=newNode;
s->Number=Goal;
s->Next=Head->Next;
Head->Next=s;
Length++;
}
voidLinkedList:
:
insert(intLocation,intGoal)
{
Node*p=Head;
Node*s=newNode;
s->Number=Goal;
while(--Location&&p!
=NULL)p=p->Next;
if(Location==0&&p!
=NULL)
{
s->Next=p->Next;
p->Next=s;
Length++;
}
}
voidLinkedList:
:
erase(intLocation)
{
Node*p=Head;
while(--Location&&p!
=NULL)p=p->Next;
if(Location==0&&p!
=NULL)
{
Node*q=p->Next;
p->Next=q->Next;
deleteq;
Length--;
}
}
voidLinkedList:
:
clear()
{
Node*p=Head->Next;
Node*q=NULL;
if(p==NULL)return;
else
{
q=p->Next;
while(q!
=NULL)
{
deletep;
p=q;
q=q->Next;
}
deletep;
Length=0;
}
}
voidLinkedList:
:
reverse()
{
intT=Length;
if(Head->Next==NULL)return;
Node*p=Head->Next;
while(--T)
{
p=Head->Next;
for(inti=0;i { swap(p->Number,p->Next->Number); p=p->Next; } } } voidLinkedList: : Traverse() { //视情况而定,暂定; } 步骤13 利用步骤12实现的单链表的基本操作实现大整数存储的功能,具体是将一个字符串的每一位按顺序插入到单链表的尾部。 Code: LinkedListResetNumber(stringGoal) { LinkedListNumber; for(inti=0;i returnNumber; } 步骤14 将步骤13中利用单链表存储的大整数,以传递参数的方式进行大整数运算。 因为是倒序相加,所以在这里需要将步骤13中插入的方式进行更改。 Code: LinkedListReverseResetNumber(stringGoal) { LinkedListNumber; for(inti=0;i returnNumber; } LinkedListBigNumberAdd(LinkedList&A,LinkedList&B) { LinkedListC; A.This=A.This->Next; B.This=B.This->Next; intremainder=0,sum=0; while(A.This! =NULL&&B.This! =NULL) { if(A.This! =NULL&&B.This==NULL)sum=A.This->Number+remainder; elseif(A.This==NULL&&B.This! =NULL)sum=B.This->Number+remainder; elsesum=A.This->Number+B.This->Number+remainder; remainder=sum/10; C.push_front(sum%10); if(A.This! =NULL)A.This=A.This->Next; if(B.This! =NULL)B.This=B.This->Next; } if(remainder! =0)C.push_front(remainder); returnC; } 步骤15 将步骤11步骤12实现的各项操作加入到运行函数run()中,实现951502-线性表大整数A+B具体题目。 Code: #include #include usingnamespacestd; voidrun(intnow); LinkedListResetNumber(stringGoal); LinkedListReverseResetNumber(stringGoal); LinkedListBigNumberAdd(LinkedList&A,LinkedList&B); intmain() { #ifndefONLINE_JUDGE FILE*stream; freopen_s(&stream,"G: //C++实验报告/input_实验一_大整数加法.txt","r",stdin); freopen_s(&stream,"G: //C++实验报告/output_实验一_大整数加法.txt","w",stdout); #endif intTotal; cin>>Total; for(intnow=1;now<=Total;now++)run(now); return0; } voidrun(intnow) { stringa,b; LinkedListA,B,C; cin>>a>>b; A=ReverseResetNumber(a); B=ReverseResetNumber(b); C=BigNumberAdd(A,B); C.Traverse(); } 步骤16 使用list完成步骤11-步骤15已经完成的任务,体会list的高效与方便。 Code: vector voidrun(intnow) { scan_f(); process(); print_f(); Clear(); } voidscan_f() { inti; stringa,b; cin>>a>>b; for(i=a.size()-1;i>=0;i--)NumA.push_back(a[i]-'0'); for(i=b.size()-1;i>=0;i--)NumB.push_back(b[i]-'0'); } voidprocess() { if(NumB.size() inti=0,k; intremainder=0; for(k=0;k { intsum=0; if(i! =NumA.size()) { sum+=NumA[i]+NumB[k]+remainder; i++; } elsesum=NumB[k]+remainder; NumC.push_back(sum%10); remainder=sum/10; } if(remainder>0)NumC.push_back(remainder); } voidprint_f() { for(inti=NumC.size()-1;i>=0;i--)cout< cout< } voidClear() { NumA.clear(); NumB.clear(); NumC.clear(); } 步骤17 使用vector完成951602-线性表大菲波数。 Code: #include #include #include #include #include usingnamespacestd; vector voidrun(intnow); voidpretreatment(); voidprint_f(vector vector intmain() { #ifndefONLINE_JUDGE FILE*stream; //freopen_s(&stream,"g: //input.txt","r",stdin); //freopen_s(&stream,"g: //output.txt","w",stdout); #endif pretreatment(); intTotal; cin>>Total; for(intnow=1;now<=Total;now++)run(now); return0; } voidrun(intnow) { intn; cin>>n; print_f(indexes[n]); } voidprint_f(vector { for(inti=0;i { if(i==0)cout< elsecout< } cout< } voidpretreatment() { indexes[1].push_back (1); indexes[2].push_back (1); for(inti=3;i<=1000;i++) indexes[i]=BigNumberAdd(indexes[i-1],indexes[i-2]); } vector { vector vector : reverse_iteratora_pointer=a.rbegin(),b_pointer=b.rbegin(); intindexes1=1,indexes2=1,remainder=0; while(a_pointer! =a.rend()||b_pointer! =b.rend()) { intsum=0; if(a_pointer! =a.rend()&&b_pointer==b.rend())sum=*a_pointer+remainder; elseif(a_pointer==a.rend()&&b_pointer! =b.rend())sum=*b_pointer+remainder; elsesum=*a_pointer+*b_pointer+remainder; remainder=sum/10000000; result.push_back(sum%10000000); if(a_pointer! =a.rend())a_pointer++; if(b_pointer! =b.rend())b_pointer++; } if(remainder! =0)result.push_back(remainder); reverse(result.begin(),result.end()); returnresult; } (四)实验结果分析 最终实验进行的很顺利,没有什么特别大的问题。 特别提示一下,我在此对大整数加法进行了相应的改进。 在使用STL标准库的时候,我发现,如果拿数组进行存储,不妨将多位数字同时添加进入到一个二维的动态数组中,使它们在相加的时候发挥int型进行可加的最大效率。 显然的,如果说对156********15+456123468412134进行计算,我们完全可以将这两串数字进行合适的划分,而不需要一位一位的划分。 比如在我的实例中,我对其是这样划分的。 156432,1873215+4,5612346,8412134。 这样我们只需要将对应位数加起来,并且将情况分类讨论一下,大大提高了计算多位数的效率。 虽然这不是一个很复杂的方式,但也是一个使用计算机运算的技巧。 这样的数据对于计算机而言,它进行int型范围内的加法时,效率是非常高的,即使位数很多,计算时间也控制在10毫秒之内的,可见其计算机强大的运算能力。 比如步骤16中,计算出1000个斐波那契数列只运行了不超过500毫秒。 如果用一般的加法运算,时间会超过4秒以上。 PS: 上述的所有测试均会根据个人电脑配置不同而发生改变,仅供参考。 在步骤11中,所列功能并未在步骤12中完全实现。 在步骤16中,计算过程不需要对格式进行要求,但是在最后输出时,需要对格式进行一些限制。 (五)收获与体会 在经过许久的学习之后,再一次对大整数加法进行接触,我将其进行了一系列的优化,即使变动很小,但效率大幅增加,可想而知,程序优化的步伐是永无止境的,我也将继续学习,以达到我自己定下的长远目标。 第2章栈序列匹配 (一)实验目的与要求 1.栈的顺序存储结构及其基本运算、实现方法和技术的训练。 2.栈的简单应用训练。 3.熟悉标准模版库STL中的栈相关的知识。 (二)实验内容与步骤 1.编程实现顺序栈及其基本操作。 2.对于给出的入栈序列和出栈序列,判断2个序列是否相容。 即: 能否利用栈将入栈序列转换为出栈序列。 3.进行测试,完成HLOJ9525-栈与队列栈序列匹配。 4.用STL之stack完成上面的任务。 5.尝试完成HLOJ9522-栈与队列胡同。 (三)具体步骤 步骤21 思考顺序栈的基本操作有哪些,将基本操作一一列出。 Code: constintMAX_Stack_Size=3000000; classElement { public: Element(); intData; }; classStack { public: Stack(); voidClear(); inttop(); voidpush(intGoal); voidpop(); boolempty(); private: Element*Base; intTop; }; 步骤22 逐一实现步骤21中的具体操作。 Code: Element: : Element() { Data=0; } Stack: : Stack() { Base=newElement[MAX_Stack_Size]; Top=-1; } voidStack: : Clear() { while(empty()==false)pop(); } intStack: : top() { returnBase[Top].Data; } voidStack: : push(intGoal) { if(Top! =MAX_Stack_Size-1) { Top++; Base[Top].Data=Goal; } } voidStack: : pop() { if(Top! =-1) { Top--; } } boolStack: : empty() { if(Top==-1)returntrue; elsereturnfalse; } 步骤23 根据题意,写出HLOJ9522的主要实现函数,并对其他情况进行判断即可。 Code: boolprocess(vector { //Number1为入栈序列Number2为出栈序列 if(Number1.size()! =Number2.size())returnfalse; vector : iteratorNumber1_pointer=Number1.begin(); vector : iteratorNumber2_pointer=Number2.begin(); StackNote; while(Number2_pointer! =Number2.end()) { if(! Note.empty()&&Note.top()==*Number2_pointer) { Note.pop(); Number2_pointer++; } elseif(Number1_pointer! =Number1.end()) { Note.push(*Number1_pointer); Number1_pointer++; } elsebreak; } returnNote.empty(); } 步骤24 将步骤23中实现的函数加以对应的内容输出,并更改数组内对应的数据类型,即可。 (PS: 此时也同样需要更改Stack类中的数据类型)Code: boolprocess(stringA,string
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 实验 报告