收藏 分享(赏)

天理数据结构实验4.doc

上传人:s36f12 文档编号:6359128 上传时间:2019-04-09 格式:DOC 页数:8 大小:70.50KB
下载 相关 举报
天理数据结构实验4.doc_第1页
第1页 / 共8页
天理数据结构实验4.doc_第2页
第2页 / 共8页
天理数据结构实验4.doc_第3页
第3页 / 共8页
天理数据结构实验4.doc_第4页
第4页 / 共8页
天理数据结构实验4.doc_第5页
第5页 / 共8页
点击查看更多>>
资源描述

1、天津理工大学实验报告学院(系)名称:计算机与通信工程学院姓名 吕帅霖 学号 20125872 专业 网络工程班级 1 实验项目 实验四图的深度优先与广度优先遍历课程名称 数据结构 课程代码 0662426实验时间 实验地点 7-219批改意见 成绩教师签字: 实验目的理解图的逻辑特点,理解图的邻接矩阵或邻接表存储结构,掌握图的深度优先遍历、广度优先遍历算法。实验内容图的遍历利用邻接矩阵或邻接表作为存储结构建立一个无向图,每个顶点中存放一种水果名(例如 apple、orange、banana 等,并要求从键盘输入),顶点数不少于 5 个。要求分别以深度优先搜索(DFS)和广度优先搜索(BFS)进

2、行遍历,输出遍历结果。实验步骤及算法描述和流程:1. 无向图的邻接矩阵存储结构1.1 创建无向图的边的结构,由该边的信息指针和组成该边的两个顶点的位置以及指向与两个顶点相连的下一条边构成1.2 创建无向图的顶点结构,由顶点所存储的信息和指向依附该顶点的边的指针构成1.3 创建无向图的结构,由顶点结构数组和无向图当前的顶点数和边数构成1.4 利用单链队列作为无向图的邻接表存储结构2. 采用邻接表存储结构,构造无向图2.1 输入无向图的相关信息:顶点数,边数,再输入顶点信息构造表节点链表2.2 输入顶点间的关系,构造出无向图的邻接表3. 深度优先遍历无向图3.1 编写函数 DFS,从顶点 v 出发

3、,对 v 所在的连通分量进行深度优先搜索,并利用递归,输出结点信息并对未访问的结点调用 DFS 函数3.2 编写函数 DFSTraverse 对无向图做深度优先搜索,对已访问的结点标记,对尚未访问过得结点调用 DFS4. 广度优先遍历无向图使用辅助队列 Q 和访问标志数组 visite 对无向图进行非递归广度优先搜索4.1 用 for 循环给顶点访问标志数组置初值 04.2 若顶点未访问4.2.1 对要访问顶点访问标志置为 1,顶点入队4.2.2 循环当队列不为空时,队头元素出队赋给 u,并将 u 的未访问的邻接点入队5. 主函数5.1 调用无向图创建函数从键盘输入数据创建无向图5.2 调用深

4、度优先函数,输出无向图的深度优先搜索5.3 调用广度优先函数,输出无向图的广度优先搜索结论:因为程序中邻接表的出入为头插法,所以对于输入无向图的关系时,邻接表的生成总与输入时的顺序相反,在做深度与广度优先搜索时,对于结点 a,首先访问的结点,是输入边的关系时最后输入的#include #include #define MAX_NAME 10#define MAX_INFO 80 typedef char InfoType;typedef char VertexTypeMAX_NAME; / 字符串类型 #define MAX_VERTEX_NUM 20typedef enumunvisited

5、,visitedVisitIf;typedef struct EBoxVisitIf mark; / 访问标记 int ivex,jvex; / 该边依附的两个顶点的位置 struct EBox *ilink,*jlink; / 分别指向依附这两个顶点的下一条边 InfoType *info; / 该边信息指针 EBox;typedef structVertexType data;EBox *firstedge; / 指向第一条依附该顶点的边 VexBox;typedef structVexBox adjmulistMAX_VERTEX_NUM;int vexnum,edgenum; / 无向

6、图的当前顶点数和边数 AMLGraph;typedef int QElemType;typedef struct QNode/ 单链表的链式存储结构QElemType data; /数据域struct QNode *next; /指针域QNode,*QueuePtr;typedef structQueuePtr front,/队头指针,指针域指向队头元素rear; /队尾指针,指向队尾元素LinkQueue;/ 若 G 中存在顶点 u,则返回该顶点在无向图中位置 ;否则返回-1int LocateVex(AMLGraph G,VertexType u)int i;for(i=0;imark=u

7、nvisited; / 设初值 p-ivex=i;p-jvex=j;p-info=NULL;p-ilink=(*G).adjmulisti.firstedge; / 插在表头 (*G).adjmulisti.firstedge=p;p-jlink=(*G).adjmulistj.firstedge; / 插在表头 (*G).adjmulistj.firstedge=p;return 1;VertexType* GetVex(AMLGraph G,int v) / 返回 v 的值if(v=G.vexnum|vivex=i)return G.adjmulisti.firstedge-jvex;el

8、sereturn G.adjmulisti.firstedge-ivex;elsereturn -1;/ 返回 v 的(相对于 w 的)下一个邻接顶点的序号。若 w 是 v 的最后一个邻接点,则返回-1int NextAdjVex(AMLGraph G,VertexType v,VertexType w) int i,j;EBox *p;i=LocateVex(G,v); / i 是顶点 v 的序号 j=LocateVex(G,w); / j 是顶点 w 的序号 if(iivex=i / 找下一个邻接顶点 else if(p-jvex=i / 找下一个邻接顶点 else / 是邻接顶点 w b

9、reak;if(pif(pelse if(pif(pif(pelse if(preturn -1;int visiteMAX_VERTEX_NUM; / 访问标志数组(全局量) 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)DFS(G,j);p=p-ivex=v?p-ilink:p-jl

10、ink;/ 从第 1 个顶点起,深度优先遍历图 G,并对每个顶点调用函数 Visit void DFSTraverse(AMLGraph G,int(*visit)(VertexType)int v;VisitFunc=visit;for(v=0;vnext=NULL; /队头指针指向空,无数据域,这样构成了一个空队列return 1;int QueueEmpty(LinkQueue Q)/ 若 Q 为空队列,则返回 1,否则返回 0 if(Q.front=Q.rear)return 1;elsereturn 0;int EnQueue(LinkQueue *Q,QElemType e) /

11、插入元素 e 为 Q 的新的队尾元素QueuePtr p=(QueuePtr)malloc(sizeof(QNode);if(!p) / 存储分配失败 exit(0);/生成一个以为 e 为数据域的队列元素p-data=e;p-next=NULL;/将该新队列元素接在队尾的后面(*Q).rear-next=p;(*Q).rear=p;return 1;/ 若队列不空,删除 Q 的队头元素,用 e 返回其值,并返回 1,否则返回 0 int DeQueue(LinkQueue *Q,QElemType *e)QueuePtr p;if(*Q).front=(*Q).rear)return 0;p

12、=(*Q).front-next; /队头元素*e=p-data;(*Q).front-next=p-next;if(*Q).rear=p)(*Q).rear=(*Q).front;free(p);return 1;/ 从第 1 个顶点起,按广度优先非递归遍历图 G,并对每个顶点调用函数 / Visit 一次且仅一次。使用辅助队列 Q 和访问标志数组 visite void BFSTraverse(AMLGraph G,int(*Visit)(VertexType) int v,u,w;VertexType w1,u1;LinkQueue Q;for(v=0;v=0;w=NextAdjVex(

13、G,u1,strcpy(w1,*GetVex(G,w)if(!visitew) / w 为 u 的尚未访问的邻接顶点的序号 visitew=1;Visit(G.adjmulistw.data);EnQueue(printf(“n“);int visit(VertexType v)printf(“%s “,v);return 1;void main()int k,n;AMLGraph g;VertexType v1,v2;CreateGraph(printf(“深度优先搜索的结果:n“);DFSTraverse(g,visit);printf(“广度优先搜索的结果:n“);BFSTraverse(g,visit);system(“pause“); 运行结果:

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

当前位置:首页 > 网络科技 > 数据结构与算法

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报