邻接表创建无向图,广度优先搜索遍历输出
Posted diandianer
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了邻接表创建无向图,广度优先搜索遍历输出相关的知识,希望对你有一定的参考价值。
1 #include<stdio.h> 2 #include<string.h> 3 #include <iostream> 4 #include<algorithm> 5 using namespace std; 6 #define MVNum 100 7 int vis[MVNum]; 8 typedef struct ArcNode 9 { 10 int adjvex; 11 int info; 12 struct ArcNode *nextarc; 13 } ArcNode; 14 typedef struct VNode 15 { 16 char data; 17 ArcNode *firstarc; 18 } VNode, AdjList[MVNum]; 19 typedef struct 20 { 21 AdjList vertices; 22 int vexnum,arcnum; 23 } ALGraph; 24 25 typedef struct 26 { 27 int *base;//存储空间的基地址 28 int front;//头指针 29 int rear;//尾指针 30 } SqQueue; 31 void InitQueue(SqQueue &Q) //初始化 32 { 33 Q.base=new int[MVNum]; 34 if(!Q.base) 35 printf("存储分配失败 "); 36 Q.front=Q.rear=0; 37 } 38 int QueueEmpty(SqQueue Q) //求循环队列是否为空 39 { 40 if(Q.front==Q.rear) 41 return 1; 42 else 43 return 0; 44 } 45 int EnQueue(SqQueue &Q,int e) //入队 46 { 47 if((Q.rear+1)%MVNum==Q.front)//队满 48 return 0; 49 Q.base[Q.rear]=e; 50 Q.rear=(Q.rear+1)%MVNum; 51 return 1; 52 } 53 int DeQueue(SqQueue &Q,int &e) //出队 54 { 55 if(Q.front==Q.rear)//队满 56 return 0; 57 e=Q.base[Q.front]; 58 Q.front=(Q.front+1)%MVNum; 59 return 1; 60 } 61 62 int LocateVex(ALGraph &G,char v)//找到v在邻接表G中的位置 63 { 64 for(int i=0; i<G.vexnum; i++) 65 { 66 if(G.vertices[i].data==v) 67 return i; 68 } 69 return -1; 70 } 71 void CreateALGraph(ALGraph &G) 72 { 73 int i,j,k,v; 74 char v1,v2; 75 ArcNode *p1,*p2; 76 scanf("%d%d",&G.vexnum,&G.arcnum); 77 for(v = 0; v < G.vexnum; v++) 78 { 79 scanf("%s",&G.vertices[v].data); 80 G.vertices[v].firstarc=NULL; 81 } 82 getchar(); 83 for(k = 0; k < G.arcnum; k++) 84 { 85 scanf("%c %c",&v1,&v2); 86 getchar(); 87 i=LocateVex(G,v1); 88 j=LocateVex(G,v2); 89 p1=new ArcNode; 90 p1->adjvex=j; 91 p1->nextarc=G.vertices[i].firstarc; 92 G.vertices[i].firstarc=p1; 93 94 p2=new ArcNode; 95 p2->adjvex=i; 96 p2->nextarc=G.vertices[j].firstarc; 97 G.vertices[j].firstarc=p2; 98 } 99 } 100 101 void BFS(ALGraph G,int v) 102 { 103 SqQueue Q; 104 int u,w; 105 ArcNode *p; 106 printf("%c",v+‘A‘); 107 vis[v]=1; 108 InitQueue(Q); 109 EnQueue(Q,v); 110 while(!QueueEmpty(Q)) 111 { 112 DeQueue(Q,u); 113 p=G.vertices[u].firstarc; 114 // cout<<"p是"<<p<<endl; 115 while(p!=NULL) 116 { 117 w=p->adjvex; 118 if(!vis[w]) 119 { 120 printf("%c",w+‘A‘); 121 vis[w]=1; 122 EnQueue(Q,w); 123 } 124 p=p->nextarc; 125 } 126 } 127 } 128 int main(void) 129 { 130 ALGraph G; 131 memset(vis,0,sizeof(vis)); 132 CreateALGraph(G); 133 BFS(G,0); 134 return 0; 135 }
输入: 8 9 A B C D E F G H A B B D B E E F D F A C C G C H G H 输出: ACBHGEDF 邻接表创建为: A->C->B B->E->D->A C->H->G->A D->F->B E->F->B F->D->E G->H->C H->G->C
以上是关于邻接表创建无向图,广度优先搜索遍历输出的主要内容,如果未能解决你的问题,请参考以下文章
以邻接多重表为存储结构,实现连通无向图的深度优先遍历和广度优先遍历。
用c语言编程 1创建图的邻接矩阵和邻接表 2验证图的深度优先、广度优先遍历算法 3验证最短路径
SDUT 2142 TEST数据结构实验之图论二:基于邻接表的广度优先搜索遍历