数据结构课程设计.docx
《数据结构课程设计.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计.docx(12页珍藏版)》请在冰豆网上搜索。
数据结构课程设计
数据结构课程设计报告
题目:
图的遍历和生成树
求解实现
院(系):
计算机工程学院
专业:
嵌入式软件设计
班级:
软件1093
学生:
胡康静
指导教师:
寇海洲张成富
邱军林殷路
2010年12月
目录
一、设计目的1
二、设计内容1
三、程序设计步骤1
四、调试分析6
五、测试结果6
六、课程设计小结:
8
一、设计目的
1、熟练掌握如何对给定的一个图进行遍历和生成树的求解方法,采用两种方法对图进行遍历分别是深度优先和广度优先遍历,在生成树的求解时用了Kruskal算法,学会使用邻接矩阵表示。
2、学会在制作程序过程中多思考,充分利用所学知识使程序更完美。
3、提高调试能力,结合数据结构课程中的基本理论知识并通过上机实习,验证算法的正确性。
学会有效利用基本调试方法,迅速找出程序代码中的错误并且修改。
4、培养查阅文献资料和自己动手设计程序的能力。
二、设计内容
1、系统名称:
图的遍历和生成树求解实现
2、要求:
(1) 先任意创建一个图;
(2) 图的DFS,BFS的递归和非递归算法的实现;
(3) 最小生成树的实现,求连通分量的实现;
(4) 要求用邻接矩阵、邻接表、十字链表多种结构存储实现。
三、程序设计步骤
1)功能分析说明图:
2)采用主要的数据结构类型:
1、定义弧信息
structArc
{
charpre;
charbak;
intcost;
Arc*link;
};
2、定义图信息
structMGraph
{
charvexs[10];
Arcarcs[10][10];
intvexnum;
intarcnum;
};
3、图和邻接矩阵的创建函数
intcreat(MGraph&G)
{
charv1,v2;
inti,j,k,w;
cout<<"**********创建无向图**********"<";
cin>>G.vexnum>>G.arcnum;
for(i=0;i{
cout<<"输入顶点"<
";
cin>>G.vexs[i];
}
for(i=0;i{
for(j=0;j{
G.arcs[i][j].cost=weight;
G.arcs[i][j].link=NULL;
}
}
for(k=0;k{
cout<<"输入一条边顶点和权:
";
cin>>v1>>v2>>w;
i=local(G,v1);
j=local(G,v2);
G.arcs[i][j].cost=w;
G.arcs[j][i].cost=w;
}
cout<<"创建成功!
"<returnG.vexnum;
}
4、深度优先遍历的函数
voidDFS(MGraphG,bool*visited,inti)
{
cout<visited[i]=true;
for(intj=0;j{
if(G.arcs[i][j].cost!
=100&&!
visited[j])DFS(G,visited,j);
}
}
5、广度优先遍历的函数
voidBFS(MGraphG,bool*visited,inti)
{
charq[10];
intfront=0,rear=0;
cout<visited[i]=true;
q[rear]=G.vexs[i];
intk=front;
for(intj=0;j{
if(G.arcs[k][j].cost!
=100&&!
visited[j])
{
cout<visited[j]=true;
rear=(rear+1)%G.vexnum;
q[rear]=G.vexs[j];
}
}
front=(front+1)%G.vexnum;
while(front!
=rear)
{
intj=local(G,q[front]);
for(intk=0;k{
if(G.arcs[j][k].cost!
=100&&!
visited[k])
{
cout<visited[k]=true;
rear=(rear+1)%G.vexnum;
q[rear]=G.vexs[k];
}
}
front=(front+1)%G.vexnum;
}
cout<}
6、最小生成树的函数
voidkruskal(MGraphG,int*arcvisited)
{
Arcedgs[100];
inti,j,k=0,n,m;
for(i=0;i{
for(j=i;j{
if(G.arcs[i][j].cost!
=100)
{
edgs[k].pre=G.vexs[i];
edgs[k].bak=G.vexs[j];
edgs[k].cost=G.arcs[i][j].cost;
++k;
}
}
}
charx,y;
intbuf,edf;
for(i=0;ifor(j=0;j{
m=100;
for(i=0;i{
if(edgs[i].cost{
m=edgs[i].cost;
x=edgs[i].pre;
y=edgs[i].bak;
n=i;
}
}
buf=find(G,arcvisited,x);
edf=find(G,arcvisited,y);
edgs[n].cost=100;
arcvisited[buf]=edf;
cout<<"("<}
}
3)各模块之间的调用方式
各个模块的调用主要是通过声明函数,和定义函数,再通过主函数调用实现的。
主函数:
voidmain()
{
MGraphG;
intd;
d=creat(G);
bool*visited=newbool[G.vexnum];
int*arcvisited=newint[100];
cout<<"图的遍历和生成树求解实现"<cout<<"**********菜单**********"<cout<<"0、显示邻接矩阵"<cout<<"1、深度优先遍历"<cout<<"2、广度优先遍历"<cout<<"3、连通分量"<cout<<"4、KRUSKAL算法"<ints;
chary='y';
while(y='y')
{
cout<"<cin>>s;
switch(s)
{
case0:
cout<<"邻接矩阵显示如下:
"<print(G);
break;
case1:
cout<<"深度优先遍历序列:
"<for(inti=0;iDFS(G,visited,0);
break;
case2:
cout<<"广度优先遍历序列:
"<for(inti=0;iBFS(G,visited,0);
break;
case3:
cout<<"连通分量:
"<DFSCom(G,visited);
break;
case4:
cout<<"最小生成树:
"<kruskal(G,arcvisited);
break;
}
cout<y/n:
";
cin>>y;
if(y=='n')break;
}
}
四、调试分析
调试的过程中,经常会出现一些错误,这是在学习中不曾发现的,通过这次实践,发现并改正。
从本实习题的编制过程中容易看出,图的遍历和生成树中,也使用到了队列等内容。
图是一种较线性表和树更为复杂的数据结构。
图中任意两个数据元素之间都可以相关。
采用邻接矩阵即数组表示的方法,对图的遍历分别采用广度优先遍历和深度优先遍历。
通过Kruskal算法求解生成树。
五、测试结果
进入演示程序后,即需要创建图为:
创建成功后,就进入主菜单:
通过选择,可得到图的遍历和生成树的实现:
六、课程设计小结:
通过这次课程设计,我深刻认识了图的基本概念和图的遍历以及生成树。
我知道了我还有很多的不足之处,在设计过程中也遇到了很多的麻烦。
在通过查询了一些资料后,最终才调试出该程序,所以对数据结构的掌握还不够,对一些基本概念不能理解,缺少适当的锻炼,不能够熟练的进行上机实现程序,在这些方面上还需要自己主动去提高。
在程序整体的设计上也不够完善。
这次课程设计给了我很大启发,我明白了,不管遇到什么困难,要坚持不懈,从不同方面去攻破它,终究会成功。
在以后的学习中,我会充分利用上机实验的机会,多加练习,将理论与实际更有效地相结合,努力弥补自己的不足争取在以后获得更好的成绩。