数据结构实验报告Word文件下载.docx
《数据结构实验报告Word文件下载.docx》由会员分享,可在线阅读,更多相关《数据结构实验报告Word文件下载.docx(13页珍藏版)》请在冰豆网上搜索。
intadjvex;
//邻接点域,存储该顶点对应的下标
EdgeNode*next;
//链域,指向下一个邻接点
}EdgeNode;
typedefstructVertexNode//顶点表结构
intdata;
//顶点域,存储顶点信息
EdgeNode*firstedge;
//边表头指针
}VertexNode,AdjList[MAXVEX];
typedefstruct
AdjListadjList;
intnumVertexes,numEdges;
//图顶点数和边数
}GraphList;
intLocate(GraphListg,intch)//确定某个顶点的位置
inti=0;
for(i=0;
i<
g.numVertexes;
i++)
{
if(g.adjList[i].data==ch)
returni;
}
return-1;
}
voidCreateGraph(GraphList&
g)//建立图的邻接表结构
{
inti,k;
cout<
<
"
请输入图的顶点数和边数:
;
cin>
>
g.numVertexes>
g.numEdges;
endl;
g.numVertexes;
请输入第"
i<
个顶点的值:
g.adjList[i].data;
//输入顶点信息
g.adjList[i].firstedge=NULL;
//将边表置为空表
for(k=0;
k<
g.numEdges;
k++)//建立边表
intp,q;
输入边(vi,vj)上的顶点值:
p>
q;
cout<
intm,n;
m=Locate(g,p);
n=Locate(g,q);
if(m==-1||n==-1)
{
cout<
不存在的顶点值"
break;
}
EdgeNode*e=newEdgeNode;
//向内存申请空间,生成边表结点
if(e==NULL)
"
malloc()error"
e->
adjvex=n;
next=g.adjList[m].firstedge;
//将e指针指向当前顶点指向的结构
g.adjList[m].firstedge=e;
//将当前顶点的指针指向e
e=newEdgeNode;
adjvex=m;
next=g.adjList[n].firstedge;
g.adjList[n].firstedge=e;
intFirstAdjVex(GraphListg,intv)//顶点V的第一个边表节点
EdgeNode*p=g.adjList[v].firstedge;
if(p)
returnp->
adjvex;
else
intNextAdjVex(GraphListG,intv,intw)//顶点V的下一个边表节点
EdgeNode*p=G.adjList[v].firstedge;
while(p)
if(p->
adjvex==w)
break;
p=p->
next;
if(p->
adjvex!
=w||!
p->
next)
returnp->
next->
voidDFS(GraphListg,intv)//深度优先遍历
visited[v]=true;
g.adjList[v].data<
//输出顶点值
for(intw=FirstAdjVex(g,v);
w>
=0;
w=NextAdjVex(g,v,w))
if(!
visited[w])
DFS(g,w);
//递归调用
voidBFS(GraphListG,intm)//广度优先遍历
queue<
int>
q;
for(inti=m-1;
i<
G.numVertexes;
visited[i]=false;
for(i=m-1;
visited[i])
q.push(i);
visited[i]=true;
while(!
q.empty())
{
intv=q.front();
q.pop();
cout<
G.adjList[v].data<
for(intw=FirstAdjVex(G,v);
w=NextAdjVex(G,v,w))
{
if(!
{
q.push(w);
visited[w]=true;
}
}
}
intmain()
GraphListG;
GraphList*g=&
G;
CreateGraph(G);
gg:
cout<
请选择功能(1、深度优先遍历2、广度优先遍历3、退出):
intm;
m;
if(m==1)
输入开始深度优先遍历的顶点号:
intn;
n;
深度优先遍历为:
DFS(G,n);
gotogg;
}
if(m==2)
{
输入开始广度优先遍历的顶点号:
广度优先遍历为:
BFS(G,m);
if(m==3)
exit(0);
return0;
四、重要函数功能说明
1、intLocate(GraphListg,intch)
确定某个顶点的位置,顶点值为ch,返回该顶点在图中的位置
2、voidCreateGraph(GraphList&
g)以邻接表表示法建立图
3、intFirstAdjVex(GraphListg,intv)返回顶点V的第一个边表节点
4、intNextAdjVex(GraphListG,intv,intw)返回顶点V的下一个边表节点
5、voidDFS(GraphListg,intv)图的深度优先遍历
6、voidBFS(GraphListG)图的广度优先遍历
五、程序运行结果
建立的图如下:
运行程序截图:
六、实验中遇到的问题、解决及体会
1、当我编写完程序,并且调试修改了很久后,始终存在错误,不能运行,但是我实在不知道如何修改,于是我让班上的编程大神帮我看了一下程序,他看过后,觉得程序没有问题,于是他怀疑是头文件存在问题,最终他发现头文件不完整,缺少#include<
,因为程序中使用了队列queue,还调用了相关函数,所以头文件中要包含#include<
,添加了这部分后,程序可以正常运行了。
这次教训让我懂得,编写程序,一定要仔细、统筹全局,后面用到的相关函数,前面一定要有函数定义,或包含在头文件中,否则,程序会一直存在错误。
修改前存在的错误截图:
2、程序能够正常运行后,我建立了一个图,然后进行深度优先遍历,得到结果后,表面上看着是正确的,但当我仔细思考后,我发现深度优先遍历的结果是错误的,比如:
我是要从顶点号2开始遍历,应该是从顶点值30开始,但我的运行结果是从顶点值20开始的,我就意识到我编写程序时没有注意顶点号应该从0开始,而不是从1开始,于是修改了部分相关程序,最后运行后,使得遍历的结果是正确的。
这让我体会到,即使程序能够运行得出结果,也一定不可大意,要仔细研究输出结果是否正确,不放过一切可能潜在的错误。
修改前程序运行结果部分截图:
修改后程序运行结果部分截图:
3、当我编写完完全正确无误的程序后,我就思考,我现在编写的程序每次运行只能先从一个顶点号开始进行深度优先遍历,再进行广度优先遍历,我是否能编写一个选择功能的程序,输入1,再输入一个顶点号,就可以进行图的深度优先遍历;
输入2,就可以进行图的广度优先遍历;
输入3,退出程序。
于是我修改了main函数,在main函数中使用了一个循环,可以进行功能选择,使得程序更加灵活,使用起来更方便。
这让我懂得,即使编写好程序,我们也应该多思考,进行优化,编写出更灵活实用的程序。
修改后程序运行结果部分截图:
4、当我写完上面的实验报告时,我突然意识到了一个很严重的错误,我写的程序在选择广度优先遍历时只能从第一个顶点开始遍历,因为我一开始对书本知识没有深刻理解,以为只能广度优先遍历只能从第一个顶点开始,但是当我复习时,我意识到我错了,是可以从任意顶点开始遍历的,于是我又仔细看了书本,认真修改了代码,使得广度优先遍历可以从任意顶点开始。
这个错误让我懂得,想要编好程序,必须要深刻理解所学的知识,并且要多实践,才能发现自己的错误与不足之处,提高自己的水平,完善自己的知识体系。
修改前运行程序部分截图:
修改后运行程序部分截图: