图的建立与遍历论文.docx
- 文档编号:12271834
- 上传时间:2023-04-17
- 格式:DOCX
- 页数:21
- 大小:58.44KB
图的建立与遍历论文.docx
《图的建立与遍历论文.docx》由会员分享,可在线阅读,更多相关《图的建立与遍历论文.docx(21页珍藏版)》请在冰豆网上搜索。
图的建立与遍历论文
数据结构
课程设计(论文)
图的建立与遍历
院(系)名称
电子与信息工程学院
专业班级
物联网141
学号
140408019
学生
尚建平
指导教师
佟玉军副教授
起止时间:
2016.1.4—2016.1.15
课程设计(论文)任务及评语
院(系):
电子与信息工程学院教研室:
软件工程
学号
140408019
学生
尚建平
专业班级
物联网141
课程设计(论文)题目
图的建立与遍历
课程设计(论文)任务
任务要求:
图的建立与遍历实现以下几个功能:
(1)创建图的存储结构并保存;
(2)对图进行广度优先搜索(3)对图进行深度优先搜索。
(4)输出遍历结果。
技术要求:
1、数据的逻辑结构采用图状结构,物理结构采用链式存储结构(邻接表)。
2、软件能正常运行,界面清晰,操作要简单。
3、系统要有主界面设计,调用各个功能项。
4、采用ViscalC++编写代码,可读性强。
5、数据类型用typedef定义。
指导教师评语及成绩
平时成绩:
答辩成绩:
论文成绩:
总成绩:
指导教师签字:
年月日
注:
平时成绩占20%,答辩成绩占40%,论文成绩占40%。
摘要
随着信息时代的快速发展,大数据大流量对数据的存储有了更为苛刻的要求,数据之间的关系越来越复杂。
图形结构的存储方式也就应运而生,因为图节点之间的关系可能是任意的,图中任意2个元素之间都可能相关。
由此,图的应用更为广泛,特别是今年来的迅速发展,已渗透到诸如语言学、逻辑学、物理学化学、电讯工程、计算机科学以及数学的其他分支中。
在此课程设计中,程序设计语言采用VisualC+window7环境。
在程序设计中主要解决的是给出一个图如何用多中方法完成图的遍历的问题,也包括如何创建一个图,深度优先遍历和广度优先遍历一个图。
程序最终通过调试运行,初步实现了设计目标。
关键词:
数据结构;有向图;无向图;邻接表
第1章绪论
1.1系统的开发背景
图是一种较线性表和树更为复杂的数据结构。
在线性表中,数据元素之间仅有线性关系,每个数据元素只有一个直接前去和一个和直接后继;在树形结构中,数据元素之间没有明显的层次关系,并且每一层的数据元素可能和下一层中的多个元素相关,但是你只能和上一层的一个元素相关;而在图形结构中,节点之间的关系可能是任意的,图中任意2个元素之间都可能相关。
由此,图的应用更为广泛,特别是今年来的迅速发展,已渗透到诸如语言学、逻辑学、物理学、化学、电讯工程、计算机科学以及数学的其他分支中。
1.2开发工具及语言
本系统使用ViscalC++语言开发,主界面清晰显示所有功能项,使用简单。
各个功能项均定义一个函数来实现,在主函数中调用各个子函数实现不同的功能。
第2章概要设计
2.1模块划分
题目应实现的具体功能:
按照自己的需要从有向向图不带权图、有向带权图、无向不带权图和有向带权图中选择建立一种图的结构,输入具体的顶点数目、顶点值、边的数目和权值,选择要开始遍历的顶点,并按照深度优先遍历和广度优先遍历输出该图。
系统的功能模块图如图2.1所示。
图2.1系统功能模块图
2.2各模块的设计
题目应该实现的具体功能:
a.有向不带权图的建立,从任意节点开始广度和深度遍历
b.有向不带权图的建立,从任意节点开始广度和深度遍历
c.有向不带权图的建立,从任意节点开始广度和深度遍历
d.有向不带权图的建立,从任意节点开始广度和深度遍历
开始
访问标志数组初始化
第一个定点入队
队列是否为空
结束
出队访问
寻找第一个邻接点
是否访问过
定点入队
寻找下一个邻接点
否
是否
是
图2.2广度遍历模块程序流程图
2.3数据结构的选择
系统数据的逻辑结构采用图状结构,物理结构采用邻接表的存储结构。
存储结构定义如下:
typedefstructArcNode
{
intadjvex;
structArcNode*nextarc;
ArctexTypeinfo;
}ArcNode;
typedefstructVnode
{
VertexTypedata;
ArcNode*firstarc;
}Vnode,Adjlist[MAC_VERTEX_NUM];
typedefstruct
{
Adjlistvertices;
intvexnum,arcnum;
intkind;
}Graph;
第3章系统详细设计与编码
3.1完整的源程序
#include"stdafx.h"
#include
#include
#defineMAC_VERTEX_NUM10
#defineNULL0
#defineTRUE1
#defineFALSE0
#defineOVERFLOW-2
#defineOK1
#defineERROR0
#defineArctexTypeint
typedefstructArcNode
{
intadjvex;
structArcNode*nextarc;
ArctexTypeinfo;
}ArcNode;
typedefcharVertexType[5];
typedefstructVnode
{
VertexTypedata;
ArcNode*firstarc;
}Vnode,Adjlist[MAC_VERTEX_NUM];
typedefstruct
{
Adjlistvertices;
intvexnum,arcnum;
intkind;
}Graph;
intVisited[MAC_VERTEX_NUM];
intGreatVex(Graph*G);
intPrint(GraphG);
intAdjfound(GraphG,VertexTypec);
intDFS(GraphG,intV);
intBFSTraverse(GraphG,VertexTypevex);
intDFSTraverse(GraphG,VertexTypevex);
intFirstAdjvex(GraphG,intv);
intNextAdjvex(GraphG,intv,intw);
intGreatVex(Graph*G)
{
inti=0;
printf("请输入顶点数:
");
scanf("%d",&G->vexnum);
while(G->vexnum>MAC_VERTEX_NUM)
{
printf("定点数最大为10!
\n");
printf("请重新输入:
");
scanf("%d",&G->vexnum);
}
printf("请输入边数:
");
scanf("%d",&G->arcnum);
printf("输入各顶点的值:
");
for(i=0;i
{
scanf("%s",G->vertices[i].data);
G->vertices[i].firstarc=NULL;
}
returnOK;
}
intGreatUDG(Graph*G)
{
inti=0,start,end;
VertexTypeB,E;
ArcNode*D1,*D2;
for(i=0;i
{
printf("请输入第%d个相连的两个顶点,格式:
顶点1顶点2(中间用空格隔开):
",i+1);
scanf("%s%s",B,E);
start=Adjfound(*G,B);
end=Adjfound(*G,E);
D1=(ArcNode*)malloc(sizeof(ArcNode));
D1->adjvex=end;
D1->nextarc=G->vertices[start].firstarc;
G->vertices[start].firstarc=D1;
D2=(ArcNode*)malloc(sizeof(ArcNode));
D2->adjvex=start;
D2->nextarc=G->vertices[end].firstarc;
G->vertices[end].firstarc=D2;
}
returnOK;
}
intGreatDG(Graph*G)
{
inti=0,start,end;
VertexTypeB,E;
ArcNode*D1;
for(i=0;i
{
printf("请输入第%d个相连的两个顶点,格式:
顶点1顶点2:
(中间用逗号隔开)",i+1);
scanf("%s%s",B,E);
start=Adjfound(*G,B);
end=Adjfound(*G,E);
D1=(ArcNode*)malloc(sizeof(ArcNode));
D1->adjvex=end;
D1->nextarc=G->vertices[start].firstarc;
G->vertices[start].firstarc=D1;
}
returnOK;
}
intGreatUDN(Graph*G)
{
inti=0,start,end;
VertexTypeB,E;
ArcNode*D1,*D2;
for(i=0;i
{
D1=(ArcNode*)malloc(sizeof(ArcNode));
printf("请输入第%d个相连的两个顶点,格式:
顶点1权值顶点2(中间用空格隔开):
",i+1);
scanf("%s%d%s",B,&(D1->info),E);
start=Adjfound(*G,B);
end=Adjfound(*G,E);
D1->adjvex=end;
D1->nextarc=G->vertices[start].firstarc;
G->vertices[start].firstarc=D1;
D2=(ArcNode*)malloc(sizeof(ArcNode));
D2->adjvex=start;
D2->nextarc=G->vertices[end].firstarc;
G->vertices[end].firstarc=D2;
}
returnOK;
}
intGreatDN(Graph*G)
{
inti=0,start,end;
VertexTypeB,E;
ArcNode*D1;
for(i=0;i
{
D1=(ArcNode*)malloc(sizeof(ArcNode));
printf("请输入第%d个相连的两个顶点,格式:
顶点1权值顶点2(中间用逗号隔开):
",i+1);
scanf("%s%d%s",B,&(D1->info),E);
start=Adjfound(*G,B);
end=Adjfound(*G,E);
D1->adjvex=end;
D1->nextarc=G->vertices[start].firstarc;
G->vertices[start].firstarc=D1;
}
returnOK;
}
intPrint(GraphG)
{
inti=0;
while(G.vertices[i].data!
=NULL&&i { printf("%s",G.vertices[i].data); i++; } returnOK; } intAdjfound(GraphG,VertexTypec) { inti=0; while(strcmp(G.vertices[i].data,c)! =0&&i i++; if(i returni; else return-1; } intDFS(GraphG,intv)//深度遍历调用的递归 { intw; printf("%s->",G.vertices[v].data); Visited[v]=TRUE; if(G.vertices[v].firstarc) { for(w=FirstAdjvex(G,v);w>=0;w=NextAdjvex(G,v,w)) { if(! Visited[w]) DFS(G,w); } } returnOK; } intDFSTraverse(GraphG,VertexTypevex)//深度遍历 { intv,i; i=Adjfound(G,vex); for(v=0;v Visited[v]=0; if(! Visited[i]) DFS(G,i); returnOK; } intFirstAdjvex(GraphG,intv)//广度遍历调用的查找第一条边 { if(G.vertices[v].firstarc) { ArcNode*p=G.vertices[v].firstarc; returnp->adjvex; } return-1; } intNextAdjvex(GraphG,intv,intw)//广度遍历调用的查找下一条边 { { ArcNode*p; p=(ArcNode*)malloc(sizeof(ArcNode)); p=G.vertices[v].firstarc; while(p->adjvex! =w) { p=p->nextarc; } if(p->nextarc) return(p->nextarc)->adjvex; else return-1; } } intBFSTraverse(GraphG,VertexTypevex)\\广度遍历 { inta=0,b=0; int*queue; intv,i,w; i=Adjfound(G,vex); queue=(int*)malloc((G.vexnum*2)*sizeof(int)); queue[b]=i,b++; for(v=0;v Visited[v]=0; while(a! =b) { if(! Visited[queue[a]]) { printf("%s->",G.vertices[queue[a]].data); Visited[queue[a]]=TRUE; } for(w=FirstAdjvex(G,queue[a]);w>=0;w=NextAdjvex(G,queue[a],w)) { if(w! =-1&&! Visited[w]) queue[b]=w,b++; } a++; } returnOK; } voidmain() { Graph*G=NULL; VertexTypen; intagain=1; G=(Graph*)malloc(sizeof(Graph)); while (1) {printf("图的建立与遍历\n\n"); printf("1: 有向不带权图\n2: 有向带权图\n3: 无向不带权图\n4: 无向带权图\n请选择要建立的图的类型: "); scanf("%d",&(G->kind)); switch(G->kind) { case1: GreatVex(G);GreatDG(G);break; case2: GreatVex(G);GreatDN(G);break; case3: GreatVex(G);GreatUDG(G);break; case4: GreatVex(G);GreatUDN(G);break; default: printf("输入错误,请重新输入: \n"); } printf("该图的所有顶点: "); Print(*G); printf("\n请输入从哪个顶点开始遍历: "); while(again! =0) { scanf("%s",n); printf("深度优先遍历为: "); DFSTraverse(*G,n); printf("\n广度优先遍历为: "); BFSTraverse(*G,n); printf("\n从其他顶点开始遍历请输入顶点值,退出请输入0: "); scanf("%d",&again); }} free(G);} 3.2程序的输入和输出 程序运行主界面: 图3.1主界面 图3.2图的建立 图3.3广度遍历和深度遍历 3.3调试程序中遇到的问题及解决方案 问题: 图的邻接表广度遍历是只能显示第一个邻接点。 解决方案: 后来经过大量排查发现在节点入队是吧v写成v0了,虽然都是很小的错误,但是充分暴露了自己的粗心大意,在以后的试验中一低昂要改正。 第4章思考题解析 4.1思考题的选择 所选择的思考题: 数组a中有n个值,根据其编写一个算法,构造一棵哈夫曼树,并求出其带权路径长度。 4.2类C算法 structBTreeNode*CreateHuffman(ElemTypea[],intn) { inti,j; structBTreeNode**b,*q; b=malloc(n*sizeof(structBTreeNode)); for(i=0;i { b[i]=malloc(sizeof(structBTreeNode)); b[i]->data=a[i]; b[i]->left=b[i]->right=NULL; } for(i=1;i { intk1=-1;k2;//k1 for(j=0;j { if(b[j]! =NULL&&k1=-1) { k1=j; continue; } if(b[j]! =NULL) { k2=j; break; } for(j=k2;j { if(b[j]! =NULL) { if(b[j]->datadata) { k2=k1; k1=j; } elseif(b[j]->datadata) k2=j; } } q=malloc(sizeof(structBTreeNode)); q->left=b[k1]; q->right=b[k2]; } free(q); } ElemTypeWeightPathLength(structBTreeNode*FBT,intlen) { if(FBT==NULL) return0; else { if(FBT->left==NULL&&FBT==NULL) returnFBT->data*len; else returnWeightPathLength(FBT->left,len+1)+WeighPathLength(FBT->right,len+1); } } 4.3程序分析 ElemTypeWeightPathLength函数是求哈夫曼树的带权路径长度的,FBT是对哈夫曼树逐个访问的指针,len是当前结点到根结点的路径长度,每次调用ElemTypeWeightPathLength函数,len加1。 由于递归调用,当FBT为空树时,返回,从而求出带权路径长度。 第5章总结 转眼,为期两周的《数据结构》课程设计学习即将结束。 在这次学习中,自己的c语言知识和数据结构知识得到了巩固,编程能力也有了一定的提高。 同事也学会了解决问题的方法。 总结起来,主要有以下几点体会: 1、课程设计容。 此次课程设计主要是采用了链式存储结构,在程序设计中主要解决的是给出一个图如何用多中方法完成图的遍历的问题,也包括如何创建一个图,深度优先遍历和广度优先遍历一个图。 程序最终通过调试运行,初步实现了设计目标。 2、固掌握基础知识。 由于c语言是大一所学知识,有所遗忘,且未掌握好这学期所《数据结构》这门课,所以在学习之初感到棘手。 不知如何下手,但在后来的学习过程中自己通过看书和课外资料,并请教其他同学,慢慢的对c语言和数据结构只是有所熟悉。 所以,这次学习之后,我告诫我自己,今后一定要牢固的掌握好专业基础知识。 3、培养严谨的科学态度。 自己在编程时经常因为一些小错误而导致错误,不够细心。 这给自己带来了许多麻烦。 变成是一件十分严谨的事。 容不得有半点马虎。 所以在今后的学习生活中,一定要培养严谨的科学态度。 4,、这次课程设计也让我充分的认识到《数据结构》这门课的重要性。 它给我们一个思想和大纲,让我们在编程时容易找到思路,不至于无章可循。 总之,在这次学习实践中,自己的C语言和数据结构知识得到提高,编程也得到了提高。 本人签字 参考文献 [1]严蔚敏,吴伟民等编著.数据结构.C语言版[M].: 清华大学出版,2014.4 [2]谭浩强.C语言程序设计.: 高等教育[M],1998 [3]袁宁.图的遍历[J].大学,2001.3 [4]许卓群.数据结构与算法[M].: 高等教育,2005 [5]策.算法与数据结构.C语言版[M].: 机械工业,2004 [6]楚屏.数据结构[M].: 人民邮电,2001 [7]亮,春褒.VisualC++程序设计例学与实践[M].: 清华大学,2006
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 建立 遍历 论文
![提示](https://static.bdocx.com/images/bang_tan.gif)