图的遍历课程设计.docx
- 文档编号:10678438
- 上传时间:2023-02-22
- 格式:DOCX
- 页数:14
- 大小:82.23KB
图的遍历课程设计.docx
《图的遍历课程设计.docx》由会员分享,可在线阅读,更多相关《图的遍历课程设计.docx(14页珍藏版)》请在冰豆网上搜索。
图的遍历课程设计
数据结构课程设计报告
题目:
图的遍历
学生姓名:
刘再科
学号:
0213
专业班级:
计科10102班
同组姓名:
蔡双
指导教师:
孙叶枫
设计时间:
2011年下学期第18周
指导老师意见:
评定成绩:
签名:
日期:
一.前言
1.课程设计的目的…………………………………….3
2.课程设计的基本要求……………………………….4
二.课程设计内容…………………………….…..5
三.系统(项目)设计…………………...………6
四.源程序………………………………………...8
五.程序的调试及测试结果……………………..18
六.小结…………………………………………..21
七.参考文献…………………...............................21
一.前言
1、课程设计的目的
《数据结构》主要介绍一些最常用的数据结构,阐明各种数据结构内在的逻辑关系,讨论其在计算机中的存储表示,以及在其上进行各种运算时的实现算法,并对算法的效率进行简单的分析和讨论。
数据结构是介于数学、计算机软件和计算机硬件之间的一门计算机专业的核心课程,它是计算机程序设计、数据库、操作系统、编译原理及人工智能等的重要基础,广泛的应用于信息学、系统工程等各种领域。
学习数据结构是为了将实际问题中所涉及的对象在计算机中表示出来并对它们进行处理。
通过课程设计可以提高学生的思维能力,促进学生的综合应用能力和专业素质的提高。
通过此次课程设计主要达到以下目的:
⏹了解并掌握数据结构与算法的设计方法,具备初步的独立分析和设计能力;
⏹初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能;
⏹提高综合运用所学的理论知识和方法独立分析和解决问题的能力;
⏹训练用系统的观点和软件开发一般规范进行软件开发,培养软件工作者所应具备的科学的工作方法和作风。
2、课程设计的基本要求
1.问题分析和任务定义:
根据设计题目的要求,充分地分析和理解问题,明确问题要求做什么?
(而不是怎么做?
)限制条件是什么?
2.逻辑设计:
对问题描述中涉及的操作对象定义相应的数据类型,并按照以数据结构为中心的原则划分模块,定义主程序模块和各抽象数据类型。
逻辑设计的结果应写出每个抽象数据类型的定义(包括数据结构的描述和每个基本操作的功能说明),各个主要模块的算法,并画出模块之间的调用关系图;
3.详细设计:
定义相应的存储结构并写出各函数的伪码算法。
在这个过程中,要综合考虑系统功能,使得系统结构清晰、合理、简单和易于调试,抽象数据类型的实现尽可能做到数据封装,基本操作的规格说明尽可能明确具体。
详细设计的结果是对数据结构和基本操作作出进一步的求精,写出数据存储结构的类型定义,写出函数形式的算法框架;
4.程序编码:
把详细设计的结果进一步求精为程序设计语言程序。
同时加入一些注解和断言,使程序中逻辑概念清楚;
5.程序调试与测试:
采用自底向上,分模块进行,即先调试低层函数。
能够熟练掌握调试工具的各种功能,设计测试数据确定疑点,通过修改程序来证实它或绕过它。
调试正确后,认真整理源程序及其注释,形成格式和风格良好的源程序清单和结果;
二.课程设计内容
题目:
图的遍历
功能:
实现图的深度优先,广度优先遍历算法,并输出原图结构及遍历结果。
分步实施:
1)初步完成总体设计,搭好框架;
2)完成最低要求:
两种必须都要实现,写出画图的思路;
3)进一步要求:
画出图的结构,有兴趣的同学可以进一步改进图的效果。
要求:
1)界面友好,函数功能要划分好
2)总体设计应画一流程图
3)程序要加必要的注释
4)要提供程序测试方案
5)程序一定要经得起测试,宁可功能少一些,也要能运行起来,不能运行的程序是没有价值的。
三.系统(项目)设计
图一、系统功能模块图
图二、主函数流程图
四.源程序
#include
#include
#defineMax10
#defineFALSE0
#defineTRUE1
#defineErrorprintf
#defineQueueSize30
typedefstruct
{
charvexs[Max];
intedges[Max][Max];
intn,e;
}MGraph;//以邻接矩阵作为图的存储结构
intvisited[Max];//将visited[Max];
//定义为全局变量并分配最大空间
typedefstruct
{
intfront;
intrear;
intcount;
intdata[QueueSize];
}CirQueue;//定义队列的数据结构
//初始化队列
voidInitQueue(CirQueue*Q)
{
Q->front=Q->rear=0;
Q->count=0;
}
//队列空
intQueueEmpty(CirQueue*Q)
{
returnQ->count=QueueSize;//返回队列的最大长度
}
//队列满
intQueueFull(CirQueue*Q)
{
returnQ->count=QueueSize;//返回队列的最大长度
}
//进队
voidEnQueue(CirQueue*Q,intx)
{
if(QueueFull(Q))//队列满则出错
{
Error("Queueoverflow");
}
else
{
Q->count++;//否则count++,将x进队
Q->data[Q->rear]=x;
Q->rear=(Q->rear+1)%QueueSize;
}
}
//出队
intDeQueue(CirQueue*Q)
{
inttemp;//定义整型的变量
if(QueueEmpty(Q))//若为真则出错
{
Error("Queuueunderflow");
return0;
}
else//为假泽count--,将队员出对
{
temp=Q->data[Q->front];
Q->count--;
Q->front=(Q->front+1)%QueueSize;
returntemp;//返回出对元素值
}
}
//建立一个图
voidCreatueMGraph(MGraph*G)
{
inti,j,k;//定义整形变量
charch1,ch2;//定义字符型变量
printf("\n请输入定点数,边数(格式:
4,5)");
scanf("%d,%d",&(G->n),&(G->e));//输入图的顶点数华和边数
for(i=0;i
{
getchar();
printf("\n请输入第%d的顶点序号",i+1);
scanf("%c",&(G->vexs[i]));//输入顶点的序号
}
for(i=0;i
{
for(j=0;j
{
G->edges[i][j]=0;//初始化矩阵
}
}
for(k=0;k
{
getchar();
printf("\n请输入第%d条边的顶点序号(格式:
i,j):
",k+1);
scanf("%c,%c",&ch1,&ch2);//输入边的顶点序号
for(i=0;ch1!
=G->vexs[i];i++);
for(j=0;ch2!
=G->vexs[j];j++);
G->edges[i][j]=1;//有边则赋值为1
}
}
//深度优先遍历递归
voidDFSM(MGraph*G,inti)
{
intj;
printf("%c",G->vexs[i]);
visited[i]=TRUE;//标记visited[i]
//依次优先搜索访问visited[i]的每个领结点
for(j=0;j
//若visited[i]的一个有效邻接点visited[i]未被访问过,则//visited[i]出发进行递归调用
if(G->edges[i][j]==1&&visited[j])
DFSM(G,j);
}
//广度优先遍历递归
voidBFSM(MGraph*G,intk)
{
inti,j;
CirQueueQ;//定义一个队列Q,初始化队列为空
InitQueue(&Q);
printf("%c",G->vexs[k]);//访问初始点,并将其标记已访问
visited[k]=TRUE;
EnQueue(&Q,k);//将以访问过的初始点序号k入队
while(!
QueueEmpty(&Q))//队列非空进行循环
{
i=DeQueue(&Q);//队首元素出队
for(j=0;j
{
if(G->edges[i][j]==1&&!
visited[j])
{
visited[j]=TRUE;//标记vexs[j]已访问过
EnQueue(&Q,j);//顶点序号j入队
}
}
}
}
//深度优先遍历
voidDFSTraverseM(MGraph*G)
{
inti;
printf("\n深度优先遍历序列:
");
for(i=0;i
{
visited[i]=FALSE;//访问标志数组初始化
}
for(i=0;i
{
if(!
visited[i])//对尚未访问的的顶点调用DFSM
{
DFSM(G,i);
}
}
}
//广度优先遍历
voidBFSTraverseM(MGraph*G)
{
inti;
printf("\n广度优先遍历序列:
");
for(i=0;i
{
visited[i]=FALSE;//访问标志数组初始化
}
for(i=0;i
{
if(!
visited[i])//对尚未访问的的顶点调用BFSM
{
BFSM(G,i);
}
}
}
voidmain()
{
MGraph*G,a;
charch1;
intch2;
G=&a;
printf("\n\t\t深度优先遍历和广度优先遍历\n");
CreatueMGraph(G);//调用创建图矩阵函数
getchar();
ch1='y';//控制语句标志
while(ch1=='y'||ch1=='Y')
{
printf("\n");
printf("主菜单");
printf("\n\t\t============================\n");
printf("\t\t=更改数据请按:
1=\n");
printf("\t\t=深度优先遍历请按:
2=\n");
printf("\t\t=广度优先遍历请按:
3=\n");
printf("\t\t=退出程序请按:
0=\n");
printf("\n\t\t============================\n");
printf("\n\t\t请选择:
");
scanf("%d",&ch2);
getchar();
switch(ch2)
{
case1:
CreatueMGraph(G);//选择1创建一个新的图矩阵
break;
case2:
DFSTraverseM(G);//选择深度优先遍历
break;
case3:
BFSTraverseM(G);//选择广度优先遍历
break;
case0:
//选择0退出程序
ch1='n';
break;
default:
system("cls");
printf("\n\t\t输入错误!
!
!
\n");
break;
}
if(ch2==1||ch2==2||ch2==3)
printf("\n\n\t\t");//控制格式
}
}
五.程序的调试及测试结果
5.1、开始进入程序。
5.2、输入顶点和边数后,进入顶点的序号编号。
5.3、将顶点编号后,输入边的顶点序号。
5.4、输入边的顶点序号后,进入主菜单进行选择。
5.5、选择2进行深度优先遍历,再次进入主菜单进行选择。
5.6、选择1更改数据,重新创建一个图。
5.7、选择0退出程序。
六.小结
通过为期一周的课程设计使我对图的遍历有了更深的认识和理解,也使我更加明白图的遍历在数据结构中的重要性和地位。
但是我的图的遍历程序还有一些缺陷,如,各个函数联合还是做得不够细致,程序的精简度还是不够,比较冗长,以后要多加学习,巩固基础,多多学习,接受以及应用新编程知识,懂得掌握更加精辟的思维方式来缩短程序的代码长度,简洁程序,使程序可读性怎强以及运行速度变得更加快。
七.参考文献
数据结构:
C语言版/严蔚敏,吴伟民编著。
清华大学出版社,2007。
C语言程序设计(第二版):
谭浩强编著。
清华大学出版社,2008。
数据结构(C语言)实践教程:
胡元义,邓亚玲,罗作民,胡明星编著。
西安电子科技大学出版社,2001.12。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 遍历 课程设计