数据结构课程设计图的建立与遍历.doc

上传人:土8路 文档编号:10307704 上传时间:2021-05-07 格式:DOC 页数:22 大小:231.50KB
返回 下载 相关 举报
数据结构课程设计图的建立与遍历.doc_第1页
第1页 / 共22页
数据结构课程设计图的建立与遍历.doc_第2页
第2页 / 共22页
数据结构课程设计图的建立与遍历.doc_第3页
第3页 / 共22页
数据结构课程设计图的建立与遍历.doc_第4页
第4页 / 共22页
数据结构课程设计图的建立与遍历.doc_第5页
第5页 / 共22页
点击查看更多>>
资源描述

《数据结构课程设计图的建立与遍历.doc》由会员分享,可在线阅读,更多相关《数据结构课程设计图的建立与遍历.doc(22页珍藏版)》请在三一文库上搜索。

1、数据结构课程设计(论文)图的建立与遍历 院(系)名称电子与信息工程学院 专业班级物联网141 学号 学生姓名 指导教师 起 止 时 间: 2016.1.42016.1.15课程设计(论文)任务及评语院(系):电子与信息工程学院 教研室:软件工程学 号学生姓名专业班级物联网141 课程设计(论文)题目图的建立与遍历课程设计(论文)任务任务要求:图的建立与遍历实现以下几个功能:(1)创建图的存储结构并保存;(2)对图进行广度优先搜索(3)对图进行深度优先搜索。(4)输出遍历结果。技术要求:1、数据的逻辑结构采用图状结构,物理结构采用链式存储结构(邻接表)。2、软件能正常运行,界面清晰,操作要简单。

2、3、系统要有主界面设计,调用各个功能项。4、采用Viscal C+编写代码,可读性强。5、数据类型用typedef 定义。指导教师评语及成绩平时成绩: 答辩成绩: 论文成绩: 总成绩: 指导教师签字: 年 月 日注:平时成绩占20%,答辩成绩占40%,论文成绩占40%。摘 要随着信息时代的快速发展,大数据大流量对数据的存储有了更为苛刻的要求,数据之间的关系越来越复杂。图形结构的存储方式也就应运而生,因为图节点之间的关系可能是任意的,图中任意2个元素之间都可能相关。由此,图的应用更为广泛,特别是今年来的迅速发展,已渗透到诸如语言学、逻辑学、物理学化学、电讯工程、计算机科学以及数学的其他分支中。在

3、此课程设计中,程序设计语言采用Visual C+window 7环境。在程序设计中主要解决的是给出一个图如何用多中方法完成图的遍历的问题,也包括如何创建一个图,深度优先遍历和广度优先遍历一个图。程序最终通过调试运行,初步实现了设计目标。关键词:数据结构;有向图;无向图;邻接表目 录第1章 绪论11.1系统的开发背景11.2开发工具及语言1第2章 概要设计22.1模块划分22.2 各模块的设计22.3 数据结构的选择3第3章 系统详细设计与编码53.1完整的源程序53.2程序的输入和输出113.3调试程序中遇到的问题及解决方案12第4章 思考题解析134.1 思考题的选择134.2类C算法134

4、.3程序分析14第5章 总结15参考文献16第1章 绪论1.1系统的开发背景图是一种较线性表和树更为复杂的数据结构。在线性表中,数据元素之间仅有线性关系,每个数据元素只有一个直接前去和一个和直接后继;在树形结构中,数据元素之间没有明显的层次关系,并且每一层的数据元素可能和下一层中的多个元素相关,但是你只能和上一层的一个元素相关;而在图形结构中,节点之间的关系可能是任意的,图中任意2个元素之间都可能相关。由此,图的应用更为广泛,特别是今年来的迅速发展,已渗透到诸如语言学、逻辑学、物理学、化学、电讯工程、计算机科学以及数学的其他分支中。1.2开发工具及语言本系统使用Viscal C+语言开发,主界

5、面清晰显示所有功能项,使用简单。各个功能项均定义一个函数来实现,在主函数中调用各个子函数实现不同的功能。第2章 概要设计2.1模块划分题目应实现的具体功能:按照自己的需要从有向向图不带权图、有向带权图、无向不带权图和有向带权图中选择建立一种图的结构,输入具体的顶点数目、顶点值、边的数目和权值,选择要开始遍历的顶点,并按照深度优先遍历和广度优先遍历输出该图。系统的功能模块图如图2.1所示。图2.1 系统功能模块图2.2 各模块的设计 题目应该实现的具体功能: a.有向不带权图的建立,从任意节点开始广度和深度遍历 b.有向不带权图的建立,从任意节点开始广度和深度遍历 c.有向不带权图的建立,从任意

6、节点开始广度和深度遍历 d.有向不带权图的建立,从任意节点开始广度和深度遍历 开始 出队访问访问标志数组初始化寻找第一个邻接点 第一个定点入队 是否访问过队列是否为空 否 是 否 定点入队 结束 寻找下一个邻接点 是图2.2 广度遍历模块程序流程图2.3 数据结构的选择系统数据的逻辑结构采用图状结构,物理结构采用邻接表的存储结构。存储结构定义如下:typedef struct ArcNodeint adjvex; struct ArcNode *nextarc; ArctexType info; ArcNode;typedef struct VnodeVertexType data; ArcN

7、ode *firstarc; Vnode,AdjlistMAC_VERTEX_NUM;typedef structAdjlist vertices;int vexnum,arcnum; int kind; Graph;第3章 系统详细设计与编码3.1完整的源程序#include stdafx.h#include #include #define MAC_VERTEX_NUM 10#define NULL 0#define TRUE 1#define FALSE 0#define OVERFLOW -2#define OK 1#define ERROR 0#define ArctexType i

8、nttypedef struct ArcNodeint adjvex; struct ArcNode *nextarc; ArctexType info; ArcNode;typedef char VertexType5;typedef struct VnodeVertexType data; ArcNode *firstarc; Vnode,AdjlistMAC_VERTEX_NUM; typedef structAdjlist vertices; int vexnum,arcnum; int kind; Graph;int VisitedMAC_VERTEX_NUM; int GreatV

9、ex(Graph *G); int Print(Graph G); int Adjfound(Graph G,VertexType c); int DFS(Graph G,int V); int BFSTraverse(Graph G,VertexType vex); int DFSTraverse(Graph G,VertexType vex); int FirstAdjvex(Graph G,int v); int NextAdjvex(Graph G,int v,int w); int GreatVex(Graph *G) int i=0;printf(请输入顶点数:);scanf(%d

10、,&G-vexnum);while(G-vexnumMAC_VERTEX_NUM)printf(定点数最大为10!n);printf(请重新输入:);scanf(%d,&G-vexnum);printf(请输入边数:);scanf(%d,&G-arcnum);printf(输入各顶点的值:);for(i=0;ivexnum;i+) scanf(%s,G-verticesi.data);G-verticesi.firstarc=NULL;return OK;int GreatUDG(Graph *G) int i=0,start,end;VertexType B,E;ArcNode *D1,*D

11、2;for(i=0;iarcnum;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-verticesstart.firstarc;G-verticesstart.firstarc=D1;D2=(ArcNode *)malloc(sizeof(ArcNode); D2-adjvex=start;D2-

12、nextarc=G-verticesend.firstarc;G-verticesend.firstarc=D2;return OK;int GreatDG(Graph *G) int i=0,start,end;VertexType B,E;ArcNode *D1;for(i=0;iarcnum;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-adjv

13、ex=end;D1-nextarc=G-verticesstart.firstarc;G-verticesstart.firstarc=D1;return OK;int GreatUDN(Graph *G) int i=0,start,end;VertexType B,E;ArcNode *D1,*D2;for(i=0;iarcnum;i+)D1=(ArcNode *)malloc(sizeof(ArcNode); printf(请输入第%d个相连的两个顶点,格式:顶点1 权值 顶点2(中间用空格隔开):,i+1);scanf(%s%d%s,B,&(D1-info),E);start=Adjf

14、ound(*G,B);end=Adjfound(*G,E);D1-adjvex=end;D1-nextarc=G-verticesstart.firstarc;G-verticesstart.firstarc=D1;D2=(ArcNode *)malloc(sizeof(ArcNode);D2-adjvex=start;D2-nextarc=G-verticesend.firstarc;G-verticesend.firstarc=D2;return OK;int GreatDN(Graph *G) int i=0,start,end;VertexType B,E;ArcNode *D1;fo

15、r(i=0;iarcnum;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-verticesstart.firstarc;G-verticesstart.firstarc=D1;return OK;int Print(Graph G) int i=0;while(G.ve

16、rticesi.data!=NULL&iG.vexnum)printf(%s,G.verticesi.data);i+;return OK;int Adjfound(Graph G,VertexType c) int i=0;while(strcmp(G.verticesi.data,c)!=0&iG.vexnum)i+;if(i,G.verticesv.data);Visitedv=TRUE; if(G.verticesv.firstarc) for(w=FirstAdjvex(G,v);w=0;w=NextAdjvex(G,v,w)if(!Visitedw)DFS(G,w);return

17、OK;int DFSTraverse(Graph G,VertexType vex) /深度遍历int v,i;i=Adjfound(G,vex); for(v=0;vadjvex;return -1;int NextAdjvex(Graph G,int v,int w) /广度遍历调用的查找下一条边ArcNode *p; p=(ArcNode *)malloc(sizeof(ArcNode);p=G.verticesv.firstarc;while(p-adjvex!=w)p=p-nextarc;if(p-nextarc)return (p-nextarc)-adjvex;elseretur

18、n -1;int BFSTraverse(Graph G,VertexType vex) 广度遍历int a=0,b=0; int *queue;int v,i,w;i=Adjfound(G,vex); queue=(int *)malloc(G.vexnum*2)*sizeof(int);queueb=i,b+; for(v=0;v,G.verticesqueuea.data);Visitedqueuea=TRUE; for(w=FirstAdjvex(G,queuea);w=0;w=NextAdjvex(G,queuea,w)if(w!=-1&!Visitedw) queueb=w,b+;

19、a+; return OK;void main()Graph *G=NULL;VertexType n;int again=1;G=(Graph *)malloc(sizeof(Graph);while(1)printf( 图的建立与遍历 n n); printf( 1:有向不带权图n 2:有向带权图n 3:无向不带权图n 4:无向带权图n 请选择要建立的图的类型:); scanf(%d,&(G-kind);switch(G-kind) case 1:GreatVex(G);GreatDG(G);break;case 2:GreatVex(G);GreatDN(G);break; case 3

20、:GreatVex(G);GreatUDG(G);break; case 4: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);f

21、ree(G); 3.2程序的输入和输出程序运行主界面:图3.1 主界面图3.2 图的建立 图3.3广度遍历和深度遍历3.3调试程序中遇到的问题及解决方案 问题:图的邻接表广度遍历是只能显示第一个邻接点。 解决方案:后来经过大量排查发现在节点入队是吧v写成v0了,虽然都是很小的错误,但是充分暴露了自己的粗心大意,在以后的试验中一低昂要改正。第4章 思考题解析4.1 思考题的选择所选择的思考题:数组a中有n个值,根据其编写一个算法,构造一棵哈夫曼树,并求出其带权路径长度。4.2类C算法struct BTreeNode *CreateHuffman(ElemType a,int n)int i,j;

22、struct BTreeNode *b,*q;b=malloc(n*sizeof(struct BTreeNode);for(i=0;idata=ai;bi-left=bi-right=NULL;for(i=1;in;i+) int k1=-1;k2; /k1for(j=0;jn;j+) if(bj!=NULL&k1=-1)k1=j;continue;if(bj!=NULL)k2=j;break;for(j=k2;jdatadata)k2=k1;k1=j;else if(bj-datadata)k2=j;q=malloc(sizeof(struct BTreeNode); q-left=bk1

23、;q-right=bk2;free(q);ElemType WeightPathLength(struct BTreeNode *FBT,int len) if(FBT=NULL) return 0;elseif(FBT-left=NULL&FBT=NULL) return FBT-data*len;else return WeightPathLength(FBT-left,len+1)+WeighPathLength(FBT-right,len+1);4.3程序分析ElemType WeightPathLength函数是求哈夫曼树的带权路径长度的,FBT是对哈夫曼树逐个访问的指针,len是当

24、前结点到根结点的路径长度,每次调用ElemType WeightPathLength函数,len加1。由于递归调用,当FBT为空树时,返回,从而求出带权路径长度。第5章 总结转眼,为期两周的数据结构课程设计学习即将结束。在这次学习中,自己的c语言知识和数据结构知识得到了巩固,编程能力也有了一定的提高。同事也学会了解决问题的方法。总结起来,主要有以下几点体会:1、课程设计内容。此次课程设计主要是采用了链式存储结构,在程序设计中主要解决的是给出一个图如何用多中方法完成图的遍历的问题,也包括如何创建一个图,深度优先遍历和广度优先遍历一个图。程序最终通过调试运行,初步实现了设计目标。2、固掌握基础知识

25、。由于c语言是大一所学知识,有所遗忘,且未掌握好这学期所数据结构这门课,所以在学习之初感到棘手。不知如何下手,但在后来的学习过程中自己通过看书和课外资料,并请教其他同学,慢慢的对c语言和数据结构只是有所熟悉。所以,这次学习之后,我告诫我自己,今后一定要牢固的掌握好专业基础知识。3、培养严谨的科学态度。自己在编程时经常因为一些小错误而导致错误,不够细心。这给自己带来了许多麻烦。变成是一件十分严谨的事。容不得有半点马虎。所以在今后的学习生活中,一定要培养严谨的科学态度。4,、这次课程设计也让我充分的认识到数据结构这门课的重要性。它给我们一个思想和大纲,让我们在编程时容易找到思路,不至于无章可循。总之,在这次学习实践中,自己的C语言和数据结构知识得到提高,编程也得到了提高。 本人签字参考文献1 严蔚敏,吴伟民等编著.数据结构.C语言版M.北京:清华大学出版社出版,2014.42 谭浩强.C语言程序设计.北京:高等教育出版社M,19983 袁宁.图的遍历J.重庆大学出版社,2001.34 许卓群.数据结构与算法M.北京:高等教育出版社,20055 范策.算法与数据结构.C语言版M.北京:机械工业出版社,20046 谢楚屏.数据结构M.北京:人民邮电出版社,20017 魏亮,李春褒.Visual C+程序设计例学与实践M.北京:清华大学出版社,2006

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 社会民生


经营许可证编号:宁ICP备18001539号-1