数据结构实验报告参考模板.docx
- 文档编号:28492927
- 上传时间:2023-07-15
- 格式:DOCX
- 页数:39
- 大小:131.92KB
数据结构实验报告参考模板.docx
《数据结构实验报告参考模板.docx》由会员分享,可在线阅读,更多相关《数据结构实验报告参考模板.docx(39页珍藏版)》请在冰豆网上搜索。
数据结构实验报告参考模板
数据结构实验报告
实验名称数据结构与算法
专业班级数学与应用数学1201班
学号1304120306
姓名谢伟
指导老师陈明
1前言…………………………………………………………………….2
2数据结构与算法实验概要…………………………………………….2
2.1实验要求…………………………………………………………2
2.2主要仪器设备…………………...............................................2
2.3实验内容与简介…………………………………………………2
3数据结构设计与算法设计…………………………………………….3
3.1线性表的操作……………………………………………….......3
3.2二叉树的操作……………………………………………….......8
3.3图的遍历操作……………………………………………….....12
3.4栈的基本操作………………………………………………….19
3.5哈希表设计…………………………………………………….28
4实验总结与心得体会………………………………………………...39
5参考文献……………………………………………………………..40
1前言
数据结构是计算机程序设计的重要理论技术基础,它不仅是计算机学科的核心课程,而且已经成为其他理工专业的热门选修课。
随着计算机科学的技术和发展,计算机的功能和运算速度不断地提高,其应用于信息处理的范围日益扩大。
与之相应的,计算机的加工处理对象也从简单的数据发展到一般的符号,进而发展到更复杂的数据结构。
数据结构是计算机程序设计的重要理论技术基础,数据结构的表示和操作都涉及到算法,如何描述数据的结构和讨论有关的算法,又涉及到程序设计语言。
因此,它不仅是计算机学科的核心课程,而且已经成为其他理工专业的热门选修课。
我们通过对这门基础课程的学习,要学会分析研究计算机加工的数据结构的特性,以便为应用涉及的数据选择适合的逻辑结构,储存结构及其相应的算法,并初步掌握算法时间分析和空间分析的技术。
通过实际操作去了解数据结构原理,练习编写代码的能力,以及抽象能力。
从课程性质上讲,“数据结构”是一门专业技术基础课。
它的要求是学会分析研究计算机加工的数据结构的特性,以便为应用涉及的数据选择适当的逻辑结构,存储结构及相应的算法,并初步掌握算法的时间分析和空间分析的技术。
另一方面,数据结构的学习过程也是复杂程序设计的训练过程,要求编写的程序结构清楚和正确易读,符合软件工程的规范。
2数据结构与算法实验概要
2.1实验要求
书写类C语言的算法,并将算法转变为程序实现。
正确理解各种数据结构的逻辑特性和存储表示和基本操作的算法实现。
针对问题的不同选择合适的数据结构,提高算法设计的能力和动手实验的技能。
2.2实验仪器设备
硬件要求:
在多媒体教室讲解及演示。
为保证教学顺利进行,要求实验室提供P
Ⅲ及以上的微机。
2.3实验项目内容简介
1、线性表基本操作
(1) 熟悉线性表的基本运算在两种存储结构(顺序结构和链式结构)上的实现
(2)以线性表的各种操作(建立、插入、删除等)的实现为重点
(3) 通过本次实习帮助学生加深对c++的使用(特别是函数参数、指针类型、链表的使用)。
2、栈、队列以及递归算法的设计
(1)掌握栈和队列这两种特殊的线性表,熟悉它们的特性,在实际问题背景下灵活运用它们
(2)训练的要点是“栈”的观点及其典型用法;问题求解的状态表示及其递归算法;由递归程序到非递归程序的转化方法
3、树、图及其应用
(1) 树和图是两种非线性数据结构,广义表的实质是树结构,而稀疏矩阵的十字链表存储结构也是图的一种存储结构,故本单元是本课的实习重点。
(2) 要求我们熟悉各种存储结构的特性,以及如何应用树和图结构求解具体问题。
(3)训练的要点是:
递归算法的设计方法;表达式的求值技术;哈夫曼方法及其编译码技术;完整的应用系统的用户界面设计和操作定义方法;矩阵乘法的特殊操作顺序;路径遍历(树、图的遍历)技术。
4、查找和排序
本次实习旨在集中对几个专门的问题做较为深入的探讨和理解
重点在掌握各种内部排序算法、查找算法的思想和实现。
学生在实习中体会查找和内部排序算法思想,理解开发高效算法的可能性和寻找、构造高效算法的方法。
3数据结构设计与算法设计
3.1线性表的操作
3.1.1实验目的
1.熟悉C++语言的上机环境,掌握C++语言的基本结构。
2.会定义线性表的顺序存储结构。
(链式存储结构)
3.熟悉对顺序表(单链表)的一些基本操作。
3.1.2实验内容
单链表的基础操作包括:
查找、插入、删除、创建链表等。
源程序代码:
#include
#include
typedefstructNode
{
intdata;
structNode*next;
}Node;
Node*Serach(Node*pHead,intx)
{
Node*p=pHead;
while(p!
=NULL&&p->data!
=x)
p=p->next;
returnp;
}
voidInsert(Node*p,intx)
{
Node*s;
s=(Node*)malloc(sizeof(Node));
s->data=x;
s->next=p->next;
p->next=s;
}
voidDeleteFollowNode(Node*p)
{
Node*q;
q=p->next;
if(q!
=NULL)
{
p->next=q->next;
free(q);
}
}
voidDelete(Node*p,Node*pHead)
{
if(p==NULL)
return;
Node*qPre=pHead;
while(qPre!
=NULL&&qPre->next!
=p)
qPre=qPre->next;
if(qPre!
=NULL&&p!
=NULL)
{
qPre->next=p->next;
free(p);
}
}
Node*CreateListAhead(inta[],intn)
{
Node*s,*pHead;
inti;
pHead=(Node*)malloc(sizeof(Node));
pHead->data=0;
pHead->next=NULL;
for(i=n-1;i>=0;i--)
{
s=(Node*)malloc(sizeof(Node));
s->data=a[i];
s->next=pHead->next;
pHead->next=s;
}
returnpHead;
}
Node*CreateListTail(inta[],intn)
{
Node*s,*pHead,*pTail;
inti;
pHead=(Node*)malloc(sizeof(Node));
pHead->data=0;
pHead->next=NULL;
pTail=pHead;
for(i=0;i { s=(Node*)malloc(sizeof(Node)); s->data=a[i]; s->next=NULL; pTail->next=s; pTail=s; } returnpHead; } voidPrint(Node*h) { Node*p; p=h->next; while(p! =NULL) { printf("%d,",p->data); p=p->next; } printf("\n"); } voidmain() { inta[]={3,2,1,4,5}; Node*pHead,*p; pHead=CreateListTail(a,5); Print(pHead); p=Serach(pHead,4); printf("%d\n",p->data); p=pHead->next->next; Insert(p,9); Print(pHead); p=pHead->next->next->next; Delete(p,pHead); Print(pHead); while(getchar()! ='a') ; } 运行结果: 3.2二叉树的操作 3.2.1实验目的 理解并熟悉掌握创建二叉树和实现二叉树的三种遍历 3.2.2实验内容 创建二叉树并实现二叉树的三中遍历操作 源程序代码: #include #include #include typedefintDataType; typedefstructNode { DataTypedata; structNode*LChild; structNode*RChild; }BitNode,*BitTree; voidCreatBiTree(BitTree*bt)//用扩展先序遍历序列创建二叉树,如果是#当前树根置为空,否则申请一个新节点// { charch; ch=getchar(); if(ch=='.')*bt=NULL; else { *bt=(BitTree)malloc(sizeof(BitNode)); (*bt)->data=ch; CreatBiTree(&((*bt)->LChild)); CreatBiTree(&((*bt)->RChild)); } } voidVisit(charch)//访问根节点 { printf("%c",ch); } voidPreOrder(BitTreeroot)/*先序遍历二叉树,root为指向二叉树(或某一子树)根结点的指针*/ { if(root! =NULL) { Visit(root->data);/*访问根结点*/ PreOrder(root->LChild);/*先序遍历左子树*/ PreOrder(root->RChild);/*先序遍历右子树*/ } } voidInOrder(BitTreeroot) /*中序遍历二叉树,root为指向二叉树(或某一子树)根结点的指针*/ { if(root! =NULL) { InOrder(root->LChild);/*中序遍历左子树*/ Visit(root->data);/*访问根结点*/ InOrder(root->RChild);/*中序遍历右子树*/ } } voidPostOrder(BitTreeroot) /*后序遍历二叉树,root为指向二叉树(或某一子树)根结点的指针*/ { if(root! =NULL) { PostOrder(root->LChild);/*后序遍历左子树*/ PostOrder(root->RChild);/*后序遍历右子树*/ Visit(root->data);/*访问根结点*/ } } intPostTreeDepth(BitTreebt)//后序遍历求二叉树的高度递归算法// { inthl,hr,max; if(bt! =NULL) { hl=PostTreeDepth(bt->LChild);//求左子树的深度 hr=PostTreeDepth(bt->RChild);//求右子树的深度 max=hl>hr? hl: hr;//得到左、右子树深度较大者 return(max+1);//返回树的深度 } elsereturn(0);//如果是空树,则返回0 } voidPrintTree(BitTreeBoot,intnLayer)//按竖向树状打印的二叉树// { inti; if(Boot==NULL)return; PrintTree(Boot->RChild,nLayer+1); for(i=0;i printf(""); printf("%c\n",Boot->data); PrintTree(Boot->LChild,nLayer+1); } voidmain() { BitTreeT; inth; intlayer; inttreeleaf; layer=0; printf("请输入二叉树中的元素(以扩展先序遍历序列输入,其中.代表空子树): \n"); CreatBiTree(&T); printf("先序遍历序列为: "); PreOrder(T); printf("\n中序遍历序列为: "); InOrder(T); printf("\n后序遍历序列为: "); PostOrder(T); h=PostTreeDepth(T); printf("\nThedepthofthistreeis: %d\n",h); PrintTree(T,layer); getch(); } 运行结果: 3.3图的遍历操作 3.3.1实验目的 该实验主要完成对图的创建,并实现图的深度优先遍历和广度优先遍历 3.3.2实验内容 编写程序完成图的创建,并实现图的深度和广度优先遍历 源程序代码: #include #include #include #definemaxvex30 structedgenode {intadjvex; charinfo; structedgenode*next; }; structvexnode {chardata; structedgenode*link; }; typedefstructvexnodeadjlist[maxvex]; adjlisttu1; voidcreategraph(adjlistg,intn) {inte,i,s,d; structedgenode*p,*q; printf("thepoint(n)andedge(e): "); scanf("%d,%d",&n,&e); for(i=1;i<=n;i++) {getchar(); printf("\tthe%dinformation: ",i); scanf("%c",&g[i].data); g[i].link=NULL; } for(i=1;i<=e;i++) {printf("\nthe%dedges=>\n\t: ",i); scanf("%d,%d",&s,&d); p=(structedgenode*)malloc(sizeof(structedgenode)); q=(structedgenode*)malloc(sizeof(structedgenode)); p->adjvex=d; p->info=g[d].data; q->adjvex=s; q->info=g[s].data; p->next=g[s].link; g[s].link=p; q->next=g[d].link; g[d].link=q; } } intvisited[maxvex]; voiddfs(adjlistadj,intv) {inti; structedgenode*p; visited[v]=1; printf("nowisatpoint%d",v); p=adj[v].link; printf("thedatais%c\n",adj[v].data); getch(); while(p) {if(visited[p->adjvex]==0) dfs(adj,p->adjvex); p=p->next; } } intquene[maxvex]; voidbfs(adjlistadj,intvi) {intm=maxvex; intfront=0,rear=1,v; structedgenode*p; visited[vi]=1; printf("nowvisitthepoint: %d\n",vi); getch();quene[rear]=vi; while(front! =rear) {front=(front+1)%m; v=quene[front]; p=adj[v].link; while(p) {if(visited[p->adjvex]==0) {visited[p->adjvex]=1; printf("nowvisitthepoint: %d\n",p->adjvex); getch(); rear=(rear+1)%m; quene[rear]=p->adjvex; } p=p->next; } } } voidmain() {inti;system("cls"); creategraph(tu1,0); for(i=1;i visited[i]=0; dfs(tu1,1); getch(); for(i=1;i visited[i]=0; bfs(tu1,1); } 运行结果: 3.4栈的基本操作 3.4.1实验目的 1.熟练掌握栈的结构,以及这种数据结构的特点; 2.能够在两种存储结构上实现栈的基本运算,特别注意栈满和栈空的判断条件及描述方法; 3.4.2实验内容 1)采用双栈,一个栈用来保存运算符,一个栈用来保存数据 2)符号优先级设置 i(+-)<(*/) ii相同运算符,栈内优先级高于栈外优先级 ii对于栈内: 左括号的优先级最高右括号优先级仅高于'#' ii对于栈外: 与上面相反 3)计算时机 当栈内运算符优先级>栈外运算符优先级: 可以计算,计算结果压入数据栈 当栈内运算符优先级<栈外运算符优先级: 栈外运算符压入运算符栈 当栈内运算符优先级=栈外运算符优先级: 只可能是左括出栈即可 源程序代码: #include #include usingnamespacestd; //符号数组 charsymbol[7]={'+','-','*','/','(',')','#'}; //栈内元素的优先级 intin[7]={3,3,5,5,1,6,0}; //栈外元素的优先级 intout[7]={2,2,4,4,6,1,0}; /* *通过符号字符获取它的数组下标 */ intget(charc) { switch(c) { case'+': return0; case'-': return1; case'*': return2; case'/': return3; case'(': return4; case')': return5; case'#': return6; default: return6; } } /* *比较栈内运算符c1和栈外运算符c2的优先级 */ charprecede(charc1,charc2) { inti1=get(c1); inti2=get(c2); if(in[i1]>out[i2]) { return'>'; } elseif(in[i1] { return'<'; } else { return'='; } } /* *计算基本表达式的值 */ intfigure(inta,inttheta,intb) { switch(theta) { case0: returna+b; case1: returna-b; case2: returna*b; default: returna/b; } } /* *计算表达式的值 */ intEvaluateExpression(constchar*exp) { stack stack oper.push(get('#')); intsum=0; intflag=1;//表示正负号1,表示正0,表示负 inta,theta,b; if(! ('+'==*exp||'-'==*exp||'('==*exp||isdigit(*exp))) { cout<<"表达式出错1"< return-1; } if('-'==*exp) { flag=0; exp++;//指向下一个字符 } intindex=oper.top(); while(*exp||symbol[index]! ='#') { if(isdigit(*exp)) { sum=0; if(flag) { while(isdigit(*exp)) { sum=sum*10+*exp-'0'; exp++; } } else { while(isdigit(*exp)) { sum=sum*10-*exp-'0'; exp++; } } data.push(sum); flag=1; } else { switch(precede(symbol[ope
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 实验 报告 参考 模板