图的两种遍历.doc_第1页
图的两种遍历.doc_第2页
图的两种遍历.doc_第3页
图的两种遍历.doc_第4页
图的两种遍历.doc_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

实验名称实验要求算法分析测试调节代码附录名称: 图的遍历要求:对给定图,实现图的深度优先遍历和广度优先遍历。基本要求以邻接表为存储结构,实现连通无向图的深度优先和广度优先遍历。以用户指定的结点为起点,分别输出每种遍历下的结点访问序列。算法分析:/*图的深度优先遍历的基本思想就是:首相要创建图;创建一个无向的邻接表图(即链式)因此,就要对链表的结点进行定义(即图的邻接域和链域)建好之后就是进行深度优先遍历(采用的是递归的思想)在遍历的过程中定义一个数组,用于标记是否访问过。总之,大概的思路就是这些!*/#include#include#define Max_VertexNum 100typedef enumFALSE,TRUE Boolean;Boolean visitedMax_VertexNum;/访问标志向量/*邻接表结点*/typedef struct nodeint adjvex; /*邻接点域*/struct node *next;/*链域*/EdgeNode;/*顶点结点*/typedef struct vnodeint vertex; /顶点域EdgeNode *firstedge; /边头指针VertexNode;typedef VertexNode AdjlistMax_VertexNum;/定义一个邻接表的数组,用于存放顶点的信息/*图的定义*/typedef struct ALGraphAdjlist adjlist;int n,e;/图的顶点和边Graph;/*创建一个无向图*/void CreateGraph(Graph *G)int i,j,k;EdgeNode *s;printf(请输入图的顶点数和边数: );scanf(%d %d,&G-n,&G-e);/*对顶点数组进行初始化*/for(i=1;in;i+)printf(请输入顶点的信息: );printf(n);scanf(%d,&G-adjlisti.vertex);G-adjlisti.firstedge=NULL;for(k=0;ke;k+)printf(请输入边(vi,vj)的顶点对序号: );printf(n);scanf(%d%d,&i,&j);s=(EdgeNode*)malloc(sizeof(EdgeNode);s-adjvex=j;s-next=G-adjlisti.firstedge;G-adjlisti.firstedge=s;s=(EdgeNode*)malloc(sizeof(EdgeNode);s-adjvex=i;s-next=G-adjlistj.firstedge;G-adjlistj.firstedge=s;/*深度优先遍历*/void DFS(Graph *G,int i)EdgeNode *p;printf(您所访问的顶点为: %d,G-adjlisti.vertex); /访问顶点printf(n);visitedi=TRUE; /标志已经访问过的p=G-adjlisti.firstedge;while(p)if(!visitedp-adjvex)DFS(G,p-adjvex);p=p-next; elsep=p-next;/对图进行深度优先遍历入口void DFSTravel(Graph *G)int i;for(i=1;in;i+)visitedi=FALSE;for(i=1;in;i+) if(!visitedi)DFS(G,i);void PrintAdjlist(Graph *G)int i;EdgeNode *p;for(i=1;in;i+)printf(%d:%d,i,G-adjlisti.vertex);for(p=G-adjlisti.firstedge;p;p=p-next)printf(%d,p-adjvex);printf(n);void main(void)Graph G;CreateGraph(&G);PrintAdjlist(&G);DFSTravel(&G);/*广度优先遍历*/#include#include#define Max_VertexNum 100typedef enumFALSE,TRUE Boolean;Boolean visitedMax_VertexNum;/访问标志向量/*队列的链式存储结构*/typedef struct qnodeint data;struct qnode *next;Qnode;typedef struct queueQnode *front; /头指针Qnode *rear; /尾指针Queue;/*表结点*/typedef struct nodeint adjvex;struct node *next;EdgeNode;/*顶点结点*/typedef struct vnodeint vertex;EdgeNode *firstedge;VertexNode;typedef VertexNode AdjlistMax_VertexNum;/定义一个邻接表的数组/*图的定义*/typedef struct ALGraphAdjlist adjlist;int n,e;/图的顶点和边Graph;/*创建一个无向图*/void CreateGraph(Graph *G)int i,j,k;EdgeNode *s;printf(请输入图的顶点数和边数: );scanf(%d %d,&G-n,&G-e);/*对顶点数组进行初始化*/for(i=1;in;i+)printf(请输入顶点的信息: );printf(n);scanf(%d,&G-adjlisti.vertex);G-adjlisti.firstedge=NULL;for(k=0;ke;k+)printf(请输入边(vi,vj)的顶点对序号: );printf(n);scanf(%d%d,&i,&j);s=(EdgeNode*)malloc(sizeof(EdgeNode);s-adjvex=j;s-next=G-adjlisti.firstedge;G-adjlisti.firstedge=s;s=(EdgeNode*)malloc(sizeof(EdgeNode);s-adjvex=i;s-next=G-adjlistj.firstedge;G-adjlistj.firstedge=s;/*初始化队列*/void InitQueue(Queue *q)q-front=q-rear=NULL;/*队列判空*/int EmpQueue(Queue *q)return(q-front=NULL&q-rear=NULL);/*出队列*/int DeQueue(Queue *q)Qnode *p;int data;if(EmpQueue(q)printf(队列为空!); /下溢exit(1);p=q-front; /保存q-front=q-front-next; /删除data=p-data; /取出队列元素/*如果原队列中只有一个结点,删除后,队列为空。此时头指针已经为空*/if(q-rear=p)q-rear=NULL;free(p);return data;/*顶点入队列*/void EnQueue(Queue *q,int a)Qnode *p;p=(Qnode*)malloc(sizeof(Qnode);p-data=a;p-next=NULL;if(EmpQueue(q)q-front=q-rear=p;elseq-rear-next=p;q-rear=p; /p此时变为队尾/*广度优先遍历*/void BFS(Graph *G,int k)int i;Queue Q; /定义一个队列EdgeNode *p;InitQueue(&Q); /初始化队列printf(您访问的顶点为: %d,G-adjlistk.vertex);visitedk=TRUE;EnQueue(&Q,k);while(!EmpQueue(&Q)i=DeQueue(&Q);p=G-adjlisti.firstedge;/依次搜索vi的邻接点vjwhile(p)if(!visitedp-adjvex)printf(您访问的顶点为: %d,G-adjlistp-adjvex.vertex);visitedp-adjvex=TRUE;EnQueue(&Q,p-adjvex);p=p-next;void BFSTravel(Graph *G)int i;for(i=1;in;i+)visitedi=FALSE;for(i=1;in;i+)if(!visitedi)BFS(G,i);/*输出构造的无向图*/void PrintAdjlist(Graph *G)int i;Ed

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论