图的遍历课设.docx
- 文档编号:30751765
- 上传时间:2023-08-20
- 格式:DOCX
- 页数:20
- 大小:178.07KB
图的遍历课设.docx
《图的遍历课设.docx》由会员分享,可在线阅读,更多相关《图的遍历课设.docx(20页珍藏版)》请在冰豆网上搜索。
图的遍历课设
沈阳航空航天大学
课程设计报告
课程设计名称:
数据结构课程设计
课程设计题目:
图的建立及输出
院(系):
计算机学院
专业:
计算机科学与技术
班级:
学号:
姓名:
指导教师:
此页为任务书
目录
1题目和概要设计1
1.1题目的内容与要求1
1.2概要设计1
2详细设计2
2.1算法设计思想原理2
2.1.1邻接矩阵表示法2
2.2算法的流程图3
3结构分析5
3.1存储结构5
3.2算法描述5
4调试与分析7
4.1调试过程7
4.2程序执行过程7
参考文献10
附录(程序清单)11
1.题目和概要设计
1.1题目的内容与要求
问题重述:
建立图的存储结构(图的类型可以是有向图、无向图、有向网、无向网,学生可以任选两种类型),能够输入图的顶点和边的信息,并存储到相应存储结构中,而后输出图的邻接矩阵。
要求:
1、独立完成系统的设计、编码的调试。
2、系统利用C语言实现。
3、按照课程设计规范书写课程实际报告。
1.2概要设计
CreateGraph(MGraph&G)
初始条件:
图G未创建。
操作结果:
创建一个图G。
CreateUDG(MGraph&G);
初始条件:
无向图G未创建。
操作结果:
创建一个无向图并求出其邻接矩阵。
CreateUDN(MGraph&G);
初始条件:
有无向网G未创建。
操作结果:
创建一个无向网并求出其邻接矩阵。
DDisplay(MGraphG)
。
初始条件:
图G已创建。
操作结果:
输出图G的邻接矩阵。
2.详细设计
2.1算法设计思想原理
2.1.1邻接矩阵表示法
邻接矩阵表示法:
设G=(V,E)是一个图,其中V={V1,V2,V3…,Vn}。
G的邻接矩阵是一个具有下述性质的n阶方阵:
若(Vi,Vj)∈E或者
图5-2中有向图G1和无向图G2的邻接矩阵分别为M1和M2:
M1=┌0101┐
│1010│
│1001│
└0000┘
M2=┌0111┐
│1010│
│1101│
└1010┘
注意无向图的邻接是一个对称矩阵,例如M2。
用邻接矩阵表示法来表示一个具有n个顶点的图时,除了用邻接矩阵中的n*n个元素存储顶点间相邻关系外,往往还需要另设一个向量存储n个顶点的信息。
因此其类型定义如下:
VertexTypevertex[MAX_VERTEX_NUM];//顶点向量
AdjMatrixarcs;//邻接矩阵
intvexnum,arcnum;//图的当前顶点数和弧(边)数
GraphKindkind;//图的种类标志
若图中每个顶点只含一个编号i(1≤i≤vnum),则只需一个二维数组表示图的邻接矩阵。
此时存储结构可简单说明如下:
typeadjmatrix=array[1..vnum,1..vnum]ofadj;
利用邻接矩阵很容易判定任意两个顶点之间是否有边(或弧)相联,并容易求得各个顶点的度。
对于无向图,顶点Vi的度是邻接矩阵中第i行元素之和,即
n
D(Vi)=∑A[i,j]
j=1
对于有向图,顶点Vi的出度OD(Vi)为邻接矩阵第i行元素之和,顶点Vi的入度ID(Vi)为第i列元素之和。
即
n n
OD(Vi)=∑A[i,j],ID(Vi)=∑A[j,i])
j=1 j=1
用邻接矩阵也可以表示带权图,只要令A[i,j]={Wij,若(Vi,Vj)∈或者
2.2算法的流程图
1.算法先进行图的建立,如图2.2-1的构造流程图,描述了图的建立及输入过程,以邻接矩阵的方法进行输入存储。
2.大体数据算法如图2.2-2主程序流程图所示,先选择图的类型,按顺序的构造并输出图的邻接矩阵。
Y
N
Y
NY
N图2.2-2主程序流程图
Y
N
图2.2-1的构造流程图
3.结构分析
3.1存储结构
定义一个指针区域,包括顶点向量、邻接矩阵、当前顶点数和弧数、图的种类标志的信息。
利用该指针进行图的操作及存储。
typedefstruct
{
VertexTypevertex[MAX_VERTEX_NUM];//顶点向量
AdjMatrixarcs;//邻接矩阵
intvexnum,arcnum;//图的当前顶点数和弧(边)数
GraphKindkind;//图的种类标志
}
3.2算法描述
1、无向图邻接矩阵的建立算法如下:
procedurebuild-graph;{建立无向图的邻接矩阵}
begin
fori:
=1tondoread(G.vertex[i]);{读入n个顶点的信息}
fori:
=1tondo
forj:
=1toedo
G.arcs[i][j]=0;
{将邻接矩阵的每个元素初始化成0}
fork:
=1toedo{e为边的数目}
[read(i,j,w){读入边和权}G.arcs[i][j]:
=w]
G.arcs[i][j]=G.arcs[i][i]{置对称弧}
end;
该算法的执行时间是O(n+n2+e),其中消耗在邻接矩阵初始化操作上的时间是O(n2),而e 2、无向网邻接矩阵的建立算法如下: procedurebuild-graph;{建立无向网的邻接矩阵}begin fori: =1tondoread(G.vertex[i]);{读入n个顶点的信息} fori: =1tondo forj: =1toedo G.arcs[i][j]=maxint; {将邻接矩阵的每个元素初始化成maxint,计算机内∞用最大事数maxint表示} fork: =1toedo{e为边的数目} [read(i,j,w){读入边和权}G.arcs[i][j]: =w;G.arcs[i][j]: =w]end; 该算法的执行时间是O(n+n2+e),其中消耗在邻接矩阵初始化操作上的时间是O(n2),而e 4.调试与分析 4.1调试过程 综合这次课设过程,调试分析如下: 1: 初步未掌握图的创建方法,后通过学习图,掌握了图的输入及输出的邻接矩阵。 2: 在创建图时,产生了一些错误,原因未完全了解图的规律,在深入学习后了解到了很多之前没学到的关于图的知识。 3: 输入图的方法有很多考虑,后决定利用矩阵的方法进行。 : 4.2程序执行过程 程序开始运行时输出: 请输入要构造的图的类型(1.无向图,2.无向网): 为了测试输入为: 1 显示: 请输入无向图G的顶点数: 输入: 5 显示: 请输入无向图G的边数: 输入: 6 显示: ^_^请输入5个顶点的值: 输入: 12345 显示: (^o^)请输入第1条边的2个端点(以空格作为间隔): 输入: 12 显示: (^o^)请输入第2条边的2个端点(以空格作为间隔): 输入: 14 显示: (^o^)请输入第3条边的2个端点(以空格作为间隔): 输入: 26 显示: (+﹏+)对不起! 您输入的边信息错误,请重新输入第3条边的2个端点(以空格作为间隔): 输入: 23 显示: (^o^)请输入第4条边的2个端点(以空格作为间隔): 输入: 25 显示: (^o^)请输入第5条边的2个端点(以空格作为间隔): 输入: 34 显示: (^o^)请输入第6条边的2个端点(以空格作为间隔): 输入: 35 显示: 该图的邻接矩阵为: 01010 10101 01011 10100 01100 图4.2-1无向图的构建及输出 图4.2-2无向网的构建及输出 参考文献 [1]恰汗•合孜尔C语言程序设计[第三版]北京: 中国铁道出版社,2010.1~288[2]谭浩强·c程序设计(第四版)·清华大学出版社·2010 [3]严蔚敏,吴伟民·数据结构(C语言版)·清华大学出版社·2013 [4]李素若·数据结构(语言描述)·化学工业出版社·2006 附录(程序清单) #include #include #include #include #include #defineERROR0 #defineOK1 #defineMAX_VERTEX_NUM20//定义最大值 #defineINFINITY32768//定义极大值 #defineMAX_INFO20 typedefintVrType;//定义新的类型 typedefintInfoType; typedefcharVertexType; typedefenum {DG,DN,UDG,UDN}GraphKind;//有向图,有向网,无向图,无向网 typedefstructArcCell { VrTypeadj;//顶点关系类型。 InfoType*info;//该弧相关信息的指针 }ArcCell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; typedefstruct { VertexTypevertex[MAX_VERTEX_NUM];//顶点向量 AdjMatrixarcs;//邻接矩阵 intvexnum,arcnum;//图的当前顶点数和弧(边)数 GraphKindkind;//图的种类标志 }MGraph; voidCreateUDG(MGraph&G)//采用数组(邻接矩阵)表示法,构造无向图 { inti,j,k;//i,j,k为计数器 intv1,v2;//用于放置输入的弧的两个顶点 printf("请输入无向图G的顶点数: \n"); scanf("%d",&G.vexnum); printf("请输入无向图G的边数: \n"); scanf("%d",&G.arcnum); printf("^_^请输入%d个顶点的值: \n",G.vexnum); for(i=0;i { scanf("%d",&G.vertex[i]); if(G.vertex[i]>G.vexnum||G.vertex[i]<1) { printf("-_-Sorry! 您输入的顶点值错误,请重新输入第%d个顶点的值: \n",i+1); scanf("%d",&G.vertex[i]); } } for(i=0;i for(j=0;j { G.arcs[i][j].adj=0; G.arcs[i][j].info=NULL; } for(k=0;k { printf("(^o^)请输入第%d条边的2个端点: \n",k+1);//以空格作为间隔 scanf("%d%d",&v1,&v2); if((v1>G.vexnum)||(v2>G.vexnum)) { printf("(+﹏+)对不起! 您输入的边信息错误,请重新输入第%d条边的始点和终点: \n",k+1); scanf("%d%d",&v1,&v2); } i=v1-1; j=v2-1; G.arcs[i][j].adj=G.arcs[j][i].adj=1;//置 } }//CreateUDG voidCreateUDN(MGraph&G)//采用数组(邻接矩阵)表示法,构造无向网 { inti,j,k,w;//i,j,k为计数器,w用于放置权值 intv1,v2;//用于放置输入的弧的两个顶点 printf("请输入无向网G的顶点数: \n"); scanf("%d",&G.vexnum); printf("请输入无向网G的边数: \n"); scanf("%d",&G.arcnum); printf("^_^请输入%d个顶点的值: \n",G.vexnum); for(i=0;i { scanf("%d",&G.vertex[i]); if(G.vertex[i]>G.vexnum||G.vertex[i]<1) { printf("-_-Sorry! 您输入的顶点值错误,请重新输入第%d个顶点的值: \n",i+1); scanf("%d",&G.vertex[i]); } } for(i=0;i for(j=0;j { G.arcs[i][j].adj=0; G.arcs[i][j].info=NULL;//{adj,info} } for(k=0;k { printf("(^o^)请输入第%d条边的2个端点及其权值: \n",k+1); //以空格作为间隔 scanf("%d%d%d",&v1,&v2,&w); if((v1>G.vexnum)||(v2>G.vexnum)) { printf("(+﹏+)对不起! 您输入的边信息错误,请重新输入第%d条边的始点和终点: \n",k+1); scanf("%d%d%d",&v1,&v2,&w); } i=v1-1; j=v2-1; G.arcs[i][j].adj=G.arcs[j][i].adj=w;//置 } }//CreateUDN intCreateGraph(MGraph&G)//构造图 { printf("请输入要构造的图的类型: \n**********1.无向图*********\n**********2.无向网*********\n"); scanf("%d",&G.kind); switch(G.kind) { case1: CreateUDG(G);break; case2: CreateUDN(G);break; default: returnERROR; } } voidDisplay(MGraphG) {//输出图的邻接矩阵 inti,j; printf("该图的邻接矩阵为: \n"); for(i=0;i {for(j=0;j { printf("%5d",G.arcs[i][j].adj); } printf("\n"); } } voidmain() { MGraphG; intm; for(;;) {CreateGraph(G); Display(G); printf("是否继续y=1/n=0: "); scanf("%d",&m); if(m==1) system("CLS"); elsebreak; } } 课程设计总结: 通过上学期对数据结构的学习,我初步掌握了数据结构的设计流程,和处理一些基本问题的算法的设计,以及如何对算法进行初步评估分析。 在此基础上我完成了此次课程设计。 我所做的题目是图的建立及输出,任务是有向图,有向网,无向图和无向网的构造,和相应邻接矩阵的输出。 在这课程设计是我认真复习了书中关于图的一章的内容,并在网上查找了一些资料,进一步学习,总结了他人经验,并请教了同学,确定基本算法,主程序的结构,然后具体实施,完成了本次课程设计项目。 在做课程设计的过程中,我学会的图的构造以及怎样输出求一个图的邻接矩阵。 在编写完成调试的过程中,我发现了许多错误,对算法进行了优化修改,并掌握的调试,例如: 刚开始的时候对图的建立的时候对图的顶点和边的相关信息的处理不是很好,有时候输入错误而所做的程序却没有报错,后来改进了这一点。 不过该程序还存在有些缺陷,例如顶点值的输入比较死板等这些方面还有待提高。 指导教师评语: 指导教师(签字): 年月日 课程设计成绩
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 遍历