资源预览内容
第1页 / 共6页
第2页 / 共6页
第3页 / 共6页
第4页 / 共6页
第5页 / 共6页
第6页 / 共6页
亲,该文档总共6页全部预览完了,如果喜欢就下载吧!
资源描述
精选优质文档-倾情为你奉上/图的深度遍历和广度遍历/采用邻接表存储#include#include#define INFINITY 100#define MAX_VERTEX_NUM 20#define OK 1#define ERROR -1typedef char VertexType;typedef char InfoType;typedef VertexType QElemType;bool visitedMAX_VERTEX_NUM;/ 访问标志数组 typedef struct QNodeQElemType data;struct QNode *next;QNode,*QueuePtr;typedef struct QueuePtr front;QueuePtr rear;LinkQueue;int InitQueue(LinkQueue &Q)Q.front=Q.rear=(QueuePtr)malloc(sizeof(QNode); if(!Q.front) return ERROR;Q.front-next=NULL;return OK;int DestroyQueue(LinkQueue &Q)while(Q.front)Q.rear=Q.front-next;free(Q.front);Q.front=Q.rear;return OK;/DestroyQueueint EnQueue(LinkQueue &Q,QElemType e)QueuePtr p; /p=(QueuePtr)malloc(sizeof(QNode);if(!p) return ERROR;p-data=e;p-next=NULL;Q.rear-next=p;Q.rear=p;return OK;int DeQueue(LinkQueue &Q,QElemType &e)if(Q.front=Q.rear) return ERROR;QueuePtr p;p=Q.front-next;e=p-data;Q.front-next=p-next;if(Q.rear=p) Q.rear=Q.front;free(p);return OK;int QueueEmpty(LinkQueue Q)if(Q.rear=Q.front) return 1;else return 0;typedef struct ArcNodeint adjvex;struct ArcNode * nextarc;int weight;InfoType *info;ArcNode;typedef struct VNodeVertexType data;ArcNode *firstarc;int vexnum,arcnum; VNode,AdjListMAX_VERTEX_NUM;typedef structAdjList vertices;int vexnum,arcnum;ALGraph;int LocateVex(ALGraph G,VertexType v)int i;for(i=0;iG.vexnum;i+)if(G.verticesi.data=v ) return i; return OK;int FirstAdjVex(ALGraph G,VertexType v)/返回顶点所在位置 int i; for(i=0;iadjvex; /返回第一个邻接点所在的位置 break; return ERROR;int NextAdjVex(ALGraph G,VertexType v,VertexType w)/返回顶点所在位置int i,j;i=LocateVex(G,v);j=LocateVex(G,w);int flag=0;ArcNode *p; p=G.verticesi.firstarc; while(p) if(p-adjvex=j) flag=1; break; p=p-nextarc; if(flag & p-nextarc) return p-nextarc-adjvex; else return ERROR;/*构造图,采用邻接表存储*/int CreatUDG(ALGraph &G) /构造无向图int i,j,k;VertexType v1,v2;ArcNode *p,*q; printf(请输入顶点数和弧数:); scanf(%d%d,&G.vexnum,&G.arcnum); printf(请输入顶点(顶点之间不需要加空格):); getchar();/吃掉多余的回车键, for(i=0;iG.vexnum;i+)scanf(%c,&G.verticesi.data);G.verticesi.firstarc=NULL;/初始化firstarc指针 getchar(); for (k=0; knextarc=G.verticesi.firstarc; q-nextarc=G.verticesj.firstarc; G.verticesi.firstarc=p; p-adjvex=j; G.verticesj.firstarc=q; q-adjvex=i; / if (IncInfo) scanf(G.arcsij.info); / 输入弧含有相关信息 return 0;/*图的深度遍历*/ void DFS(ALGraph G, int i) / 从第i个顶点出发递归地深度优先遍历图G。 int j; visitedi = true; printf(%c ,G.verticesi.data);/ 访问第i个顶点 for (j=FirstAdjVex(G,G.verticesi.data); j!=ERROR; j=NextAdjVex(G,G.verticesi.data,G.verticesj.data)/ if (!visitedj) DFS(G,j); / 对尚未访问的邻接顶点递归调用DFS void DFSTraverse(ALGraph G) / 对图G作深度优先遍历。 int i; for (i=0; iG.vexnum; +i) visitedi = false; / 访问标志数组初始化 for (i=0; iG.vexnum; +i) if (!visitedi) DFS(G,i); / 对尚未访问的顶点调用DFS /*图的广度遍历*/void BFSTraverse(ALGraph G) / 按广度优先非递归遍历图G。使用辅助队列Q和访问标志数组visited。 int i,j; VertexType u ; LinkQueue Q; InitQueue(Q); / 置空的辅助队列Q for (i=0; iG.vexnum; +i) visitedi = false; for (i=0; iG.vexnum; +i) if (!visitedi) / i尚未访问 visitedi = true; printf(%c ,G.verticesi.data);/ 访问第i个顶点 / 访问 EnQueue(Q,G.verticesi.data); /顶点入队列 while (!QueueEmpty(Q) DeQueue(Q,u); / 队头元素出队并置为u for (j=FirstAdjVex(G, u); j!=ERROR; j=NextAdjVex(G, u,G.verticesj.data) if (!visitedj) / u的尚未访问的邻接顶点j入队列Q visitedj = true; printf(%c ,G.verticesj.data);/ 访问第j个顶点 EnQueue(Q, G.verticesj.data); /if /while /if / BFSTraverseint main() ALGraph G;CreatUDG(
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号