数据结构实验报告.docx
《数据结构实验报告.docx》由会员分享,可在线阅读,更多相关《数据结构实验报告.docx(23页珍藏版)》请在冰豆网上搜索。
![数据结构实验报告.docx](https://file1.bdocx.com/fileroot1/2023-1/28/b59ab20a-057e-4fea-979a-b599b1186958/b59ab20a-057e-4fea-979a-b599b11869581.gif)
数据结构实验报告
本科实验报告
课程名称:
数据结构
实验项目:
实验例题及实习题
实验地点:
专业班级:
学号:
学生姓名:
指导教师:
2012年1月5日
太原理工大学学生实验报告
学院名称
计算机软件学院
专业班级
实验成绩
学生姓名
学号
实验日期
2011/12/20
课程名称
数据结构
实验题目
实验一树
一、实验目的和要求
熟悉树的各种表示方法和各种遍历方式,掌握有关算法的实现,了解树在计算机科学及其它工程中的应用。
二、主要仪器设备
Windows系统,VC++平台。
三、实验内容和原理
[问题描述]
任意给定一棵二叉树。
试设计一个程序,在计算机中构建该二叉树,并对他进行遍历。
[输入]
一棵二叉树的结点若无子树,则可将其子树看作“.”,输入时,按照前序序列的顺序输入该结点的内容。
对给定图,其输入序列为ABD…EH…CF.I..G...。
[输出]
若为空二叉树,则输出“THISISANEMPTYBINARYTREE”。
若二叉树不空,按照后序序列输出,对上例,输出结果为“DHEBIFGCA”。
[存储结构]
采用二叉链表存储。
[基本思想]
采用递归方法建立和遍历二叉树。
首先建立二叉树的根结点,然后建立其左右子树,直到空子树为止。
后序遍历二叉树时,先遍历左子树,后遍历右子树。
最后访问根结点。
四、操作方法与实验步骤
#include
#include
structnode
{
charinfo;
structnode*llink,*rlink;
};
typedefstructnodeNODE;
NODE*creat()
{
charx;
NODE*p;
scanf("%c",&x);
printf("%c",x);
if(x!
='.')
{
p=(NODE*)malloc(sizeof(NODE));
p->info=x;
p->llink=creat();
p->rlink=creat();
}
else
p=NULL;
returnp;
}
voidrun(NODE*t)
{
if(t)
{
run(t->llink);
run(t->rlink);
printf("%c",t->info);
}
}
main()
{
NODE*T;
printf("Pleaseinputatree:
\n");
T=creat();
printf("\n");
if(!
T)
printf("Thisisaemptybinarytree.");
else
{
printf("Theresultofposttraveseis:
\n");
run(T);
}
printf("\n");
}
五、实验数据记录和处理
按照本试验所给数据输入,出现的问题及处理方法如下:
1.此程序用C语言写成,应该保存成*.c文件;
2.程序第14行开始时出错,printf("%c",x);中x前先是多加了个&,编译链接都没有发现错误,程序也能运行。
只是输出树时以乱码显示。
最后仔细检查了一边程序才找到并修改;
3.输入树时出错,子树按空格输入发生错误。
查找指导书,子树以“.”输入,修改之后最终成功。
六、实验结果与分析
1.最终实验结果截图如下:
2最终输出的后序遍历,先遍历左子树,再遍历右子树,最后再访问根结点。
.
七、讨论、心得
经过本次数据结构实验,无论从学习还是自身都得到了很大的提高。
实验过程中发现了理论教学中从未遇到的问题,通过自己的努力,顺利解决了上述问题。
本次实验教学从传统的被动接受转化为主动探索,这点值得肯定。
形成了在实践中学习的能力,增强了领悟能力和解决问题的能力。
不仅巩固了以前的知识体系,更是学到了书本上没有的知识。
通过这次试验,我明白了只有理论联系实际才是解决问题之道。
此外,实验过程中查阅资料的习惯养成也值得肯定。
独立思考、请教高手、团队协作等素质的培养使我逐步成长。
对调试程序和纠正错误有了进一步的掌握,受益匪浅。
太原理工大学学生实验报告
学院名称
计算机与软件学院
专业班级
实验成绩
学生姓名
学号
实验日期
2011/12/25
课程名称
数据结构
实验题目
实验二二叉树的实习题
一、实验目的和要求
熟悉树的各种表示方法和各种遍历方式,掌握有关算法的实现,了解树在计算机科学及其它工程中的应用。
二、主要仪器设备
Windows系统,VC++平台。
三、实验内容和原理
[问题描述]
1.编写递归算法,在二叉树中求位于先序序列中第K个位置的结点;
2.将上述例题用非递归程序实现。
[输入]
一棵二叉树的结点若无子树,则可将其子树看作“.”,输入时,按照前序序列的顺序输入该结点的内容。
对给定图,其输入序列为ABD…EH…CF.I..G...。
[输出]
对给定树,输出第K个位置的结点数据。
[存储结构]
采用二叉链表存储。
[基本思想]
采用递归方法建立和遍历二叉树。
首先建立二叉树的根结点,然后建立其左右子树,直到空子树为止。
后序遍历二叉树时,先遍历左子树,后遍历右子树。
最后访问根结点。
四、操作方法与实验步骤
1.编写递归算法,在二叉树中求位于先序序列中第K个位置的结点;
#include
#include
typedefstructNode
{
chardata;
structNode*lchild,*rchild;
}Node,*BiTree;
BiTreeCreateTree()
{
BiTreeb;
charc;
scanf("%c",&c);
if(c!
='.')
{
b=(BiTree)malloc(sizeof(Node));
b->data=c;
b->lchild=CreateTree();
b->rchild=CreateTree();
}
else
b=NULL;
returnb;
}
voidPreTraverse(BiTreeb)
{
if(b)
{
printf("%c",b->data);
PreTraverse(b->lchild);
PreTraverse(b->rchild);
}
}
intcount=0;
voidKPosition(BiTreeb,intk)
{
if(b)
{
count++;
if(count==k)
{
printf("%c\n",b->data);
}
KPosition(b->lchild,k);
KPosition(b->rchild,k);
}
}
intmain()
{
printf("请输入一棵树的序列\n");
BiTreeb=CreateTree();
PreTraverse(b);
intnum;
printf("\n");
printf("请输入所要查找的第k个位置\n");
scanf("%d",&num);
KPosition(b,num);
return0;
}
五、实验数据记录和处理
1.编写递归算法,在二叉树中求位于先序序列中第K个位置的结点;
六、实验结果与分析
1.本程序所用树为实验二所给,方法同上,先序遍历再得出叶子结点的个数;
2.具体步骤如下:
定义树、创建树,建立左右孩子,先序遍历求叶子结点个数,再求叶子结点左右孩子个数。
然后在主函数中调用各个函数,输出最终结果;
3.二叉树中求第K位置结点的问题比较简单,全程只用先序遍历树,建立个调用函数计数,循环即可。
七、讨论、心得
通过实验二以及之后的实习题的编程练习,基本掌握了树这一部分的实践运用。
尤其是二叉树的先序遍历方法问题,以及对左右孩子的遍历。
实践出真知,的确,之前的数据结构学习完全是建立在空泛的教材理论架构之上,未曾亲自动手写出程序。
更别提之中甚为重要的编译链接运行时候的错误分析及其修改。
本次的实验教学恰恰弥补了上述问题的解决之道。
最终的收获颇有成就感,值得为之欣慰。
实验过程中从在的问题也是不容忽视,必将引起重视,在以后的学习中不断鞭策自己,努力做到更好。
比如编写代码时的粗心、调试时的不知所措的茫然等。
首先要做的是,逐渐培养自己的缜密思维能力,从小事中锻炼严谨的态度。
再次坚定本专业的优势思想。
坚信付出就有回报,努力在程序员道路上走出辉煌。
太原理工大学学生实验报告
学院名称
计算机与软件学院
专业班级
实验成绩
学生姓名
学号
实验日期
2011/12/25
课程名称
数据结构
实验题目
实验三图的实习题
一、实验目的和要求
熟悉图的存储结构,掌握有关算法的实现,了解图在计算机科学及其它工程技术中的应用。
二、主要仪器设备
Windows系统,VC++平台。
三、实验内容和原理
[问题描述]
试基于图的深度优先搜索策略编写一程序,判别以邻接表方式存储的有向图中是否存在有顶点Vi到Vj顶点的路径(i≠j);
[输入]
图的顶点个数,各顶点的位置及其信息,各顶点邻接顶点的信息,所要查找路径的顶点。
[输出]
若查找成功,则输出“存在路径”,若查找失败,则输出“不存在路径”。
[存储结构]
采用邻接矩阵的方式存储。
[基本思想]
采用广度优先搜索的方法,从顶点开始,依次访问与A邻接的顶点V1,V2,V3,V4……,访问遍之后,若没有访问B,则继续访问与A邻接的顶点V11,V22,V33,V44……,再访问与V2邻接顶点……。
如此下去,直至找见B,最先到达B点的路径,一定是边数最少的路径。
实现时采用队列记录被访问过的顶点。
每次访问与队头顶点相邻接的顶点,然后将队头顶点从队列中删去。
若队空,则说明不存在通路。
在访问定点过程中,每次把当前顶点的序号作为与其邻接的未访问的顶点的前驱顶点记录下来,以便输出时回溯。
四、操作方法与实验步骤
#include
#include
#defineMAXNUM20
intvisited[MAXNUM]={0};//设所有顶点初始化时都没有被访问,用0标志
typedefstructArcNode//定义表结点
{
intlocation;//定义邻接点的信息
structArcNode*nextarc;
}ArcNode;
typedefstructVNode//定义顶点结点
{
chardata;
ArcNode*firstarc;
}VNode,AdjList[MAXNUM];
typedefstructGraph//定义图
{
AdjListvertics;
intvexnum,arcnum;
}Graph;
GraphCreateGraph()//创建图
{
Graphg;
intlocation;
chardata;
charvertics;
ArcNode*p;
printf("创建一个图\n");
printf("请输入顶点数\n");
scanf("%d",&g.vexnum);
if(g.vexnum<0||g.vexnum>20)//顶点数目不能小于0大于20
printf("输入的顶点数不正确");
for(inti=0;i{
printf("请输入第%d个顶点的位置及信息\n",i+1);
fflush(stdin);
scanf("%d%c",&location,&data);
g.vertics[i].data=data;
p=(ArcNode*)malloc(sizeof(ArcNode));
p->nextarc=NULL;
p->location=location;
g.vertics[i].firstarc=p;
do
{
printf("请输入此顶点的邻接顶点");
fflush(stdin);//清空缓冲区,用于连续输入
scanf("%d%c",&location,&vertics);
p=(ArcNode*)malloc(sizeof(ArcNode));//创建第i个顶点的邻接顶点
p->location=location;
p->nextarc=NULL;
g.vertics[i].firstarc->nextarc=p;
}while(location!
=-1&&vertics!
='.');
}
returng;
}
intk1,k2;
voidlocate(Graphg,charc1,charc2)//定位c1,c2两个顶点的位置
{
inti;
for(i=0;i{
if(g.vertics[i].data==c1)
k1=g.vertics[i].firstarc->location;
if(g.vertics[i].data==c2)
k2=g.vertics[i].firstarc->location;
}
}
intDFS_find_path(Graphg,inti,intj)//查找路径
{
intk;
ArcNode*p;
if(i==j)return1;
else
{
visited[i]=1;//访问顶点,访问过用1标志
p=g.vertics[i].firstarc;
while(p)
{
k=p->location;
if(!
visited[k]&&DFS_find_path(g,k,j))return1;
p=p->nextarc;
}
}
return0;
}
voidshowGraph(Graphg)//显示图
{
for(inti=0;i{
printf("%d%c\n",g.vertics[i].firstarc->location,g.vertics[i].data);
}
}
intmain()
{
charc1,c2;
Graphg=CreateGraph();
printf("请输入要查找路径的顶点\n");
scanf("%c%c",&c1,&c2);
locate(g,c1,c2);
intx=DFS_find_path(g,k1,k2);
if(x==1)
printf("存在路径\n");
else
printf("不存在路径\n");
return0;
}
五、实验数据记录和处理
1.若查找成功,则输出如下:
2.若查找失败,则输出如下:
六、实验结果与分析
4.具体步骤如下:
定义表结点、邻接点、顶点结点,定义并创建图,然后执行查找路径命令,访问各个结点,最后显示图,输出最终结果;
5.程序所用到的算法比较简单,基本都是最简单的应用。
作为一个小程序,足以,但思路以及编程方法应当深入领会之。
七、讨论、心得
通过实验三以及之后实习题的编程练习,基本掌握了图这一部分的实践运用。
尤其是图的广度优先搜索问题。
对算法的认识有了进一步的提升,程序中所涉及到的指针等也基本运用得当。
顺利完成本次数据结构实验课程,有所突破。
编写程序时同样存在了诸多问题,不过尽其全力还是一一化解。
比如,编译连接时出现的各种程序错误、警告等。
而且,最为明显的是VC++跟CFree两种编译器的对比使用。
错误提示不同,修改过程也有所不同。
这次试验只是对课本知识一个小小的应用,还不足以说明学习程度的高低。
以后必须在算法构建和运用中多下功夫,全面领会每条语句,每个定义的具体含义。
多思多想,多做实践,只有这样才能充分掌握编程的精髓。
太原理工大学学生实验报告
学院名称
计算机与软件学院
专业班级
实验成绩
学生姓名
学号
实验日期
2011/12/25
课程名称
数据结构
实验题目
实验四查找实习题
一、实验目的和要求
通过本次试验,掌握查找表上的有关查找方法,并分析时间复杂度问题。
二、主要仪器设备
Windows系统,VC++平台。
三、实验内容和原理
[问题描述]
编写程序实现下面运算,在二叉排序树中查找关键字为key的记录,查找失败时,将关键字key插入到二叉排序树中,重新排序。
[输入]
有序表{12,23,28,35,37,39,50,60,78,90}以及待查找数据记录12,34。
[输出]
输入12,表中存在查找记录,输出“查找成功”;输入34,表中不存在查找记录,输出“查找失败,无此数据,正在插入ing:
”。
[存储结构]
有序表采用顺序方式存储。
[基本思想]
首先用待查找记录与查找区间中间位置记录比较,若相等则查找成功,返回该记录在表中的位置树。
若小于中间位置记录,则修改区间上界为中间位置减一,若大于中间位置记录,则修改区间下界为中间位置加一。
在新的区间内继续查找。
当查找区间下界大于上界,则该数据记录不存在。
四、操作方法与实验步骤
#include
#include
#include
typedefstructRecord //定义记录结构体
{
intkey;
}Record;
typedefstructBSTree //定义二叉排序树
{
Recorde;
structBSTree*lchild;
structBSTree*rchild;
}BSTree;
BSTree*InsertBST(BSTree*b,intk) //插入二叉排序树
{
BSTree*father; //定义father为双亲节点
BSTree*p=b; //定义p为要插入的节点
while(p)
{
if(p->e.key==k) //p的值和要插入的值相同时,不进行插入,直接返回
returnb;
father=p;
if(p->e.key>k)p=p->lchild;
elsep=p->rchild;
}
p=(BSTree*)malloc(sizeof(BSTree));
p->e.key=k;
p->lchild=p->rchild=NULL;
if(!
b) //如果根节点b不存在,让b指向p
b=p;
elseif(father->e.key>p->e.key)
father->lchild=p;
elsefather->rchild=p;
returnb;
}
BSTree*CreateBST() //创建二叉排序树
{
BSTree*b=NULL;
intdata;
printf("请输入一棵树的序列");
scanf("%d",&data);
while(data)
{
b=InsertBST(b,data);//通过插入实现二叉排序树
scanf("%d",&data);
}
returnb;
}
intSearchBST(BSTree*b,intk)//搜索二叉排序树
{
if(b)
{
if(b->e.key==k)
returnb->e.key;
if(b->e.key>k)
returnSearchBST(b->lchild,k);
if(b->e.keyreturnSearchBST(b->rchild,k);
}
printf("无此数据\n");
printf("正在插入ing:
\n");
Sleep(1000);
return0;
}
voidshow(BSTree*b)//显示二叉排序树的值
{
if(b!
=NULL)
{
printf("%d",b->e.key);
show(b->lchild);
show(b->rchild);
}
}
voidmain()
{
intkey;
BSTree*b=CreateBST();
show(b);
printf("\n");
printf("请输入要查找的值");
scanf("%d",&key);
inte=SearchBST(b,key);
if(!
e)
b=InsertBST(b,key);
else
printf("查找成功\n");
show(b);
printf("\n");
}
五、实验数据记录和处理
2.若查找成功,输出如下图所示:
3.若查找失败,输出如下图所示:
六、实验结果与分析
6.本程序源于实验四所给程序,又有所不同。
在原程序基础上增添了二叉树排序、查找功能,并且添加插入数据模块;
7.具体步骤如下:
定义记录结构体,定义、创建、插入、搜索、显示二叉排序树,主函数中调用各个函数函数,输出最终结果;
8.二叉排序树查找特定值的过程,用到的是之前实验中遍历二叉树方法,通过搜索左右孩子查找。
全程只用先序遍历树,建立调用函数计数,循环即可。
9.折半查找的在查找成功时进行比较的关键字个数最多不超过树的深度,不成功时跟给定值比较的关键字个数最多也不超过[log2n]+1。
折半查找成功的平均查找长度即为ASLbs=log2(n+1)-1。
七、讨论、心得
查找试验做的比较满意,在原程序上的改动比较大。
添加了插入模块,逝的程序在形式增加可行性。
同时,也发现了指导书中部分编写错误地方。
书中头文件名的错误运用使得程序出现好多错误,添加了标准函数接口文件名才消除错误。
而且由于VC++跟CFree的不同,主函数main的函数类型在两种编译器不