数据结构课程设计报告(图的遍历)(共16页).doc
《数据结构课程设计报告(图的遍历)(共16页).doc》由会员分享,可在线阅读,更多相关《数据结构课程设计报告(图的遍历)(共16页).doc(16页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、精选优质文档-倾情为你奉上中南大学课程设计报告题 目 数据结构课程设计 学生姓名 指导教师 漆华妹 学 院 信息科学与工程学院 专业班级 学 号 完成时间 2011年07月 专心-专注-专业目 录图遍历的演示题目:试设计一个程序,演示在连通的无向图上访问全部结点的操作第一章、需求分析1、以邻接多重表为存储结构;2、实现连通和非连通的无向图的深度优先和广度优先遍历;3、要求利用栈实现无向图的深度优先遍历;4、以用户指定的结点为起点,分别输出每种遍历下的结点访问序列和生成树的边集;5、用凹入表打印生成树;6、求出从一个结点到另外一个结点,但不经过另外一个指定结点的所有简单路径;6、本程序用C语言编
2、写,在C-Free3.5环境下通过。第二章、概要设计1、设定图的抽象数据类型:ADT Graph数据对象V:V是具有相同特性的数据元素的集合,称为点集.数据关系R:R=VRVR=(v,w)|v,w属于V,(v,w)表示v和w之间存在的路径基本操作P:CreatGraph(&G,V,VR)初始条件:V是图的顶点集,VR是图中弧的集合.操作结果:按V和VR是定义构造图G.DestroyGraph(&G)初始条件:图G存在操作结果:销毁图GLocateVex(G,u)初始条件: 图G存在,u和G中顶点有相同的特征操作结果:若图G中存在顶点u,则返回该顶点在图中的位置;否则返回其他信息GetVex(G
3、,v)初始条件: 图G存在,v是G中顶点操作结果:返回v的值FirstAjvex(G,v)初始条件: 图G存在,v是G中顶点操作结果:返回v的第一个邻接顶点,若顶在图中没有邻接顶点,则返回为空NextAjvex(G,v,w)初始条件: 图G存在,v是G中顶点,w是v的邻接顶点操作结果:返回v的下一个邻接顶点,若w是v的最后一个邻接顶点,则返回空DeleteVexx(&G,v)初始条件: 图G存在,v是G中顶点操作结果:删除顶点v已经其相关的弧DFSTraverse(G,visit()初始条件: 图G存在,visit的顶点的应用函数操作结果: 对图进行深度优先遍历,在遍历过程中对每个结点调用vi
4、sit函数一次,一旦visit失败,则操作失败BFSTraverse(G,visit()初始条件: 图G存在,visit的顶点的应用函数操作结果:对图进行广度优先遍历,在遍历过程中对每个结点调用visit函数一次,一旦visit失败,则操作失败ADT Graph2、设定队列的抽象数据类型:ADT Queue数据对象:D=ai|ai属于Elemset,i=1,2.,n,n=0数据关系:R1=|ai-1,ai属于D,i=1,2,n约定ai为端为队列头,an为队列尾基本操作:InitQueue(&Q)操作结果:构造一个空队列Q DestryoQueue(&Q) 初始条件:队列Q已存在。 操作结果:队
5、列Q被销毁,不再存在。EnQueue(&Q,e)初始条件:队列Q已经存在操作结果:插入元素e为Q的新的队尾元素DeQueue(&Q,&E)初始条件:Q为非空队列操作结果:删除Q的队尾元素,并用e返回其值QueueEmpty(Q)初始条件:队列已经存在操作结果:若队列为空,则返回TRUE,否则返回FLASEADT Queue3、本程序包含四个模块:1) 主程序模块void main ()手动构造一个图;进行深度优先遍历图;进行广度优先遍历图;2) 手动构造一个图-自己输入图的顶点和边生成一个图;3) 进行深度优先遍历图-打出遍历的结点序列和边集;4) 进行广度优先遍历图-打出遍历的结点序列和边集
6、;第三章、详细设计1、 顶点,边和图类型#define MAX_INFO 10 /* 相关信息字符串的最大长度+1 */#define MAX_VERTEX_NUM 20 /* 图中顶点数的最大值*/int visitedMAX_VERTEX_NUM; /*全局变量,访问标志数组 */typedef char InfoType; /*相关信息类型*/typedef char VertexType; /* 字符类型 */typedef enumunvisited,visitedVisitIf;typedef struct EBox /*边结点类型*/ int mark; /*访问标记 */ in
7、t ivex,jvex; /*该边依附的两个顶点位置*/ struct EBox *ilink,*jlink; /*分别指向依附这两个顶点的下一条边 */EBox; typedef struct VexBox /*顶点结点类型*/ char dataMAX_LEN; EBox *fistedge; /*指向第一条依附该顶点的边*/ VexBox; typedef struct VexBox listMAX_VERTEX_NUM; int vexnum,edgenum; /*无向图当前顶点数和边数 */ AMLGraph; 图的基本操作如下:int LocateVex(AMLGraph G,Ve
8、rtexType u);/ 查G和u有相同特征的顶点,若存在则返回该顶点在无向图中位置;否则返回-1。VertexType& GetVex(AMLGraph G,int v);/以v返回邻接多重表中序号为i的顶点。int FirstAdjVex(AMLGraph G,VertexType v);/返回v的第一个邻接顶点的序号。若顶点在G中没有邻接顶点,则返回-1。int NextAdjVex(AMLGraph G,VertexType v,VertexType w);/返回v的(相对于w的)下一个邻接顶点的序号若w是v的最后一个邻接点,则返回-1。void CreateGraph(AMLGra
9、ph &G);/采用邻接多重表存储结构,构造无向图G。Status DeleteArc(AMLGraph &G,VertexType v,VertexType w);/在G中删除边。Status DeleteVex(AMLGraph &G,VertexType v);/在G中删除顶点v及其相关的边。void DestroyGraph(AMLGraph &G);/销毁一个图void Display(AMLGraph G);/输出无向图的邻接多重表G。void DFSTraverse(AMLGraph G,VertexType start,int(*visit)(VertexType);/从sta
10、rt顶点起,(利用栈非递归)深度优先遍历图G。void BFSTraverse(AMLGraph G,VertexType start,int(*Visit)(VertexType);/从start顶点起,广度优先遍历图G。void MarkUnvizited(AMLGraph G);/置边的访问标记为未被访问。其中部分操作的算法如下: void CreateGraph(AMLGraph *p) /*创建无向图 */ int i,j,k; EBox *q; printf(nttt请输入图的结点个数和边的个数:); /*输入图的结点数和边数*/ scanf(%d,%d,&p-vexnum,&p-
11、edgenum); for(i=1;ivexnum;i+) printf(nttt请输入结点%d的名称:,i);/*输入顶点数据信息*/ scanf(%s,p-listi.data); p-listi.fistedge=NULL; /*初始化指针*/ for(k=0;kedgenum;k+) /*输入各边并构造多重链表*/ printf(nttt请输入互相有关联的两个结点:); scanf(%d,%d,&i,&j); q=(EBox *)malloc(sizeof(EBox); q-mark=0; /*对边结点赋值*/ q-ivex=i; q-ilink=p-listi.fistedge; q
12、-jvex=j; q-jlink=p-listj.fistedge; p-listi.fistedge=p-listj.fistedge=q; /*完成边在链头的插入*/ printf(n); void DFS(AMLGraph *p, int v) /*对第v个顶点的深度优先遍历 */ int w; EBox *q; visitedv=1; /*标记已访问结点 */ printf(%s ,p-listv.data); for(q=p-listv.fistedge;q!=NULL;) if(q-ivex=v) w=q-jvex; q=q-jlink; else w=q-ivex; q=q-il
13、ink; if(!visitedw) DFS(p,w); /*对尚未访问的点调用DFS*/ void DFSTraverse(AMLGraph *p,int n) /*深度优先遍历 */ int v; printf(nttt); for(v=1;vvexnum;v+) visitedv=0; *访问标志数组初始化*/ DFS(p,n); /*对起始顶点调用DFS*/ for(v=1;vvexnum;v+) if(!visitedv) DFS(p,v); /*对尚未访问的顶点调用DFS*/ printf(n); 2、队列类型typedef int QelemType;typedef struct
14、 QNode QElemType data; struct QNode *next;QNode,*QueuePtr;typedef struct QueuePtr front; QueuePtr rear; /* 队头、队尾指针 */LinkQueue;队列的基本操作如下:Status InitQueue(LinkQueue &Q);/构造一个空队列Q。Status DestroyQueue(LinkQueue &Q);/销毁队列Q(无论空否均可)。Status QueueEmpty(LinkQueue Q);/若Q为空队列,则返回1,否则返回-1。Status EnQueue(LinkQue
15、ue &Q,QElemType e);/插入元素e为Q的新的队尾元素。Status DeQueue(LinkQueue &Q,QElemType &e);/若队列不空,删除Q的队头元素,用e返回其值,并返回1,否则返回-1。其中部分操作的算法如下:void BFS(AMLGraph *p,int v) /*对第v个顶点进行广度优先遍历*/ int u,w; EBox *x; typedef struct queue int m; struct queue *next; Q; /*辅助队列Q*/ Q *head,*tail,*q; head=tail=(Q *)malloc(sizeof(Q);
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 课程设计 报告 遍历 16
限制150内