1、数据结构课程设计报告模板图的遍历数据结构课程设计报告书设 计 题 目 图遍历的演示 姓 名 专 业 班 级 学 号 指 导 教 师 成 绩 评 语 2014年6月20日目 录目 录 1一、功能需求 1(一)原始数据 1(二)系统功能 1三、程序总体设计 2(一)数据结构 2(二) 函数原形清单 2(三)程序总体框架 4(四)详细代码 4四、程序清单 15五、总结 17一、功能需求 以邻接多重表为存储结构,实现连通无向图的深度优先和广度优先遍历。以用户指定的顶点为起点,分别输出每种遍历下的顶点访问序列和相应生成树的边集。二、系统功能和原始数据(一)原始数据 设图的顶点不超过20个,每个顶点用一个
2、编号表示(如果一个图有n个顶点,则它们的编号分别为1,2,n)。通过输入图的全部边输入一个图,每条边为一对整数,可以对边的输入顺序作某种限制。注意,生成树的边是有向边,端点顺序不能颠倒。(二)系统功能 1.创建无向图 2.打印无向图 3.深度优先搜索 4.广度优先搜索三、程序总体设计(一)数据结构typedef struct EBox int mark;/访问标记,1代表已访问,0代表未访问 int ivex,jvex;/该边依附的两个顶点的位置 struct EBox *ilink,*jlink;/分别指向依附这两个顶点的下一条边 /InfoType *info;/该边信息指针EBox;ty
3、pedef struct VexBox VertexType data; EBox *firstedge;/指向第一条依附该顶点的边VexBox;typedef struct VexBox adjmulistNUM; int vexnum,edgenum;/无向图的当前顶点数和边数AMLGraph;/-队列的定义typedef int QElemType;typedef struct QNode QElemType data; struct QNode *next;QNode,*QueuePtr;typedef struct QueuePtr front,rear;LinkQueue; (二)
4、 函数原形清单 int LocateVex(AMLGraph G,VertexType u) /寻找输入的数据在图中的位置,若不存在则返回-1 int CreateGraph(AMLGraph &G) /采用邻接多重表存储表示,构造无向图G VertexType* GetVex(AMLGraph G,int v) /返回V的值 int FirstAdjVex(AMLGraph G,VertexType v)/返回V的第一个邻接点的序号,若没有则返回-1 int NextAdjVex(AMLGraph G,VertexType v,VertexType w)/返回V的(相对于W)的下一个邻接结点
5、的序号,若W是V的最后一个邻接结点, 则返回-1 void DFS(AMLGraph G,int v)/深度优先搜索/深度优先遍历图 void DFSTraverse(AMLGraph G,int(*Visit)(VertexType) int InitQueue(LinkQueue *Q) /队列的初始化 int QueueEmpty(LinkQueue Q)/判断队列是否为空,为空则返回1,否则返回0 int EnQueue(LinkQueue *Q,QElemType e) /向队列中插入元素 int DeQueue(LinkQueue *Q,QElemType *e) /若队列不为空,
6、则删除对头元素,并返回1;否则返回 0 void BFSTraverse(AMLGraph G,int(*Visit)(VertexType) /广度优先非递归遍历图G void MarkUnVisited(AMLGraph G) /把边的访问标记设置为0,即未被访问 void Display(AMLGraph G) /显示构造的无向图(包括定点数、顶点、边数、边)(三)程序总体框架(四)详细代码#include using namespace std;/-无向图的邻接多重表存储结构的定义const int NUM=20;const int Data_Num=2;/每个顶点所表示的数据type
7、def char VertexTypeData_Num; typedef struct EBox int mark;/访问标记,1代表已访问,0代表未访问 int ivex,jvex;/该边依附的两个顶点的位置 struct EBox *ilink,*jlink;/分别指向依附这两个顶点的下一条边EBox;typedef struct VexBox VertexType data; EBox *firstedge;/指向第一条依附该顶点的边VexBox;typedef struct VexBox adjmulistNUM; int vexnum,edgenum;/无向图的当前顶点数和边数AML
8、Graph;/-队列的定义typedef int QElemType;typedef struct QNode QElemType data; struct QNode *next;QNode,*QueuePtr;typedef struct QueuePtr front,rear;LinkQueue;/寻找输入的数据在图中的位置,若不存在则返回-1int LocateVex(AMLGraph G,VertexType u) int i; for(i=0;iG.vexnum;i+) if(strcmp(u,G.adjmulisti.data)=0) return i; return -1;/采
9、用邻接多重表存储表示,构造无向图Gint CreateGraph(AMLGraph &G) coutG.vexnum;/输入图当前的顶点数 cinG.edgenum;/输入图当前的边数 cout请输入每个顶点所对应的值:endl; for(int i=0;iG.adjmulisti.data;/输入顶点值 G.adjmulisti.firstedge=NULL;/初始化指针 VertexType v1,v2; EBox *p; int j;/每条弧所关联的两个结点 for(int k=0;kG.edgenum;k+) cout请输入第kv1;cinv2; i=LocateVex(G,v1);j
10、=LocateVex(G,v2);/确定v1和v2在图G中的位置 p=(EBox *)malloc(sizeof(EBox); /对弧结点进行赋值 (*p).mark=0; (*p).ivex=i; (*p).jvex=j; (*p).ilink=G.adjmulisti.firstedge; (*p).jlink=G.adjmulistj.firstedge; G.adjmulisti.firstedge=G.adjmulistj.firstedge=p; return 1;/返回V的值VertexType* GetVex(AMLGraph G,int v) if(vG.vexnum|v0)
11、 exit(0); return &G.adjmulistv.data;/返回V的第一个邻接点的序号,若没有则返回-1int FirstAdjVex(AMLGraph G,VertexType v) int i; i=LocateVex(G,v); if(iivex=i) return G.adjmulisti.firstedge-jvex; else return G.adjmulisti.firstedge-ivex; else return -1;/返回V的(相对于W)的下一个邻接结点的序号,若W是V的最后一个邻接结点,则返回-1int NextAdjVex(AMLGraph G,Ver
12、texType v,VertexType w) int i,j; EBox *p; i=LocateVex(G,v); j=LocateVex(G,w); if(i0|jivex=i&p-jvex!=j) p=p-ilink; else if(p-jvex=i&p-ivex!=j) p=p-jlink; else break; if(p&p-ivex=i&p-jvex=j) p=p-ilink; if(p&p-ivex=i) return p-jvex; else if(p&p-jvex=i) return p-jvex; if(p&p-ivex=j&p-jvex=i) p=p-jlink;
13、if(p&p-ivex=i) return p-jvex; else if(p&p-jvex=i) return p-jvex; return -1; /-队列的操作int visiteNUM;/访问标志数组int (*VisitFunc)(VertexType v);void DFS(AMLGraph G,int v) int j; EBox *p; VisitFunc(G.adjmulistv.data); visitev=1;/该顶点已经被访问 p=G.adjmulistv.firstedge; while(p) j=p-ivex=v?p-jvex:p-ivex; if(!visitej
14、) DFS(G,j); p=p-ivex=v?p-ilink:p-jlink; /深度优先遍历图void DFSTraverse(AMLGraph G,int(*Visit)(VertexType) int v,start; VisitFunc=Visit; for(v=0;vG.vexnum;v+) visitev=0; coutstart; cout按广深度优先搜索的结果是:endl; for(v=start;v=G.vexnum) for(v=0;vG.vexnum;v+) if(!visitev) DFS(G,v); /内层for /if else if(!visitev) DFS(G
15、,v); /else /外层for coutbbb ; coutnext=NULL; return 1;/判断队列是否为空,为空则返回1,否则返回0int QueueEmpty(LinkQueue Q) if(Q.front=Q.rear) return 1; else return 0;/向队列中插入元素int EnQueue(LinkQueue *Q,QElemType e) QueuePtr p=(QueuePtr)malloc(sizeof(QNode); if(!p) exit(0); p-data=e; p-next=NULL; (*Q).rear-next=p; (*Q).rea
16、r=p; return 1;/若队列不为空,则删除对头元素,并返回1;否则返回 0int DeQueue(LinkQueue *Q,QElemType *e) QueuePtr p; if(*Q).front=(*Q).rear) return 0; p=(*Q).front-next; *e=p-data; (*Q).front-next=p-next; if(*Q).rear=p) (*Q).rear=(*Q).front; free(p); return 1;/广度优先非递归遍历图Gvoid BFSTraverse(AMLGraph G,int(*Visit)(VertexType) i
17、nt u,v,w,start=0; VertexType w1,u1; LinkQueue Q; for(v=0;vG.vexnum;v+) visitev=0; InitQueue(&Q); coutstart; cout按广度优先搜索的结果是:endl; for(v=start;v=0;w=NextAdjVex(G,u1,strcpy(w1,*GetVex(G,w) if(!visitew) visitew=1; Visit(G.adjmulistw.data); EnQueue(&Q,w); /for InitQueue(&Q); for(v=0;v=0;w=NextAdjVex(G,u
18、1,strcpy(w1,*GetVex(G,w) if(!visitew) visitew=1; Visit(G.adjmulistw.data); EnQueue(&Q,w); /for coutbbb ; coutendl;/把边的访问标记设置为0,即未被访问void MarkUnVisited(AMLGraph G) int i; EBox *p; for(i=0;imark=0; if(p-ivex=i) p=p-ilink; else p=p-jlink; /显示构造的无向图(包括定点数、顶点、边数、边)void Display(AMLGraph G) int i; EBox *p;
19、 MarkUnVisited(G); coutG.vexnum个顶点:; for(i=0;iG.vexnum;i+) coutG.adjmulisti.data ; cout; G.edgenum条边:endl; for(i=0;iivex=i) if(!p-mark) coutG.adjmulisti.datajvex.datamark=1;/已经被访问过了 p=p-ilink; else if(!p-mark) coutivex.dataG.adjmulisti.datamark=1;/已经被访问过了 p=p-jlink; coutendl; int Visit(VertexType v)
20、 coutv; return 1;int main() int flag=1,control,YES=0; AMLGraph g; while(flag) couttt-endl; couttt-请输入你要进行的操作:-endl; couttt-1.创建无向图 |2.打印无向图 |-endl; couttt-3.深度优先搜索|4.广度优先搜索|-endl; couttt-0.退出系统-endl; couttt-control; switch(control) case 1: YES=CreateGraph(g); break; case 2: if(YES) Display(g); else
21、cout请先创建无向图,再选择此项endl; break; case 3: if(YES) DFSTraverse(g,Visit); else cout请先创建无向图,再选择此项endl; break; case 4: if(YES) BFSTraverse(g,Visit); else cout请先创建无向图,再选择此项endl; break; case 0: flag=0; break; /switch /while return 0; 四、程序清单 代码运行结果截图: 主页面:1.创建无向图:输入6个顶点、9条边,如图:2.打印无向图:3.深度优先搜索4.广度搜索五、总结参考资料1 殷人昆 .数据结构(用面向对象方法与c+语言描述) 清华大学出版社2 严蔚敏、吴伟民.数据结构(C语言版)清华大学出版社
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1