邻接表表示的广度优先搜索
2012-11-30 16:53
274 查看
#include<stdio.h> #include<malloc.h> #define MAXLEN 100 /*邻接点域*/ typedef struct node{ int adjnum; char adjvex; struct node *next; }EdgeNode; /*顶点域*/ typedef struct vnode{ char vertex; EdgeNode *firstedge; }Vnode; typedef Vnode AdjList[MAXLEN]; typedef struct { AdjList adlist; int n, e; }ALGraph; //////////////////////////////// typedef struct QNode{ int data; struct QNode *next; }QNode, *QePtr; typedef struct{ QePtr front; QePtr rear; }QPtr; int visited[MAXLEN]; void DFS(ALGraph *G, int i); ///////////////////////////////////////// /*广度优先搜索,队列*/ /*队列中存入序号*/ /*队列的初始化*/ void InitQueue(QPtr &Q){ Q.front = Q.rear = (QePtr)malloc(sizeof(QNode)); if(!Q.front){ printf("error"); exit(0); } Q.front->next = NULL; } /*第i个顶点如队*/ void EnQueue(QPtr &Q, int e){ QePtr p; //插入元素为Q的新的队尾元素 p = (QePtr)malloc(sizeof(QNode)); if(!p){ printf("error"); exit(0); } p->data = e; p->next = NULL; Q.rear->next = p; Q.rear = p; } void DeQueue(QPtr &Q, int &e){ //若队列不空,则删除Q的对头元素,用e返回其值,并返回OK //否则返回ERROR QePtr p; if(Q.front == Q.rear) return; /*Q.front是不存有效数据的QPtr类型的一段内存的首地址, 反正不用它*/ p = Q.front->next; e = p->data; Q.front->next = p->next; if(Q.rear == p) Q.front = Q.rear; } int QueueEmpty(QPtr Q){ if(Q.front == Q.rear) return 1; else return 0; } ////////////////////////////////// void BFS(ALGraph *G){ QPtr Q; EdgeNode *p; int k, flag; for(k=0; k<G->n; k++) visited[k] = 0; InitQueue(Q); for(k=0; k<G->n; k++){ if(!visited[k]){ visited[k] = 1; printf("%c ", G->adlist[k].vertex); EnQueue(Q, k); while(!QueueEmpty(Q)){ DeQueue(Q, flag); p = G->adlist[flag].firstedge; while(1){ if(!visited[p->adjnum]){ visited[p->adjnum] = 1; printf("%c ", G->adlist[p->adjnum].vertex); EnQueue(Q, p->adjnum); } if(p->next == NULL)break; p = p->next; } } } } } ///////////////////////////////////////// void CreatGraph(ALGraph *G){ int i, j, k; EdgeNode *p; printf("输入顶点数和边数:\n"); scanf("%d%d", &G->n, &G->e); printf("初始化顶点域:\n"); for(i=0; i<G->n; i++){ getchar(); printf("输入第%d个顶点信息:", i+1); scanf("%c", &G->adlist[i].vertex); G->adlist[i].firstedge = NULL; } printf("初始化边的信息:\n"); for(k=0; k<G->e; k++){ printf("输入第%d条边的首尾顶点:",k+1); scanf("%d%d", &i, &j); /*将第j条边接到顶点i的后面*/ p = (EdgeNode *)malloc(sizeof(EdgeNode)); p->next = NULL; p->adjnum = j; p->adjvex = G->adlist[j].vertex; p->next = G->adlist[i].firstedge; G->adlist[i].firstedge = p; /*将第i条边接到顶点j的后面*/ p = (EdgeNode *)malloc(sizeof(EdgeNode)); p->next = NULL; p->adjnum = i; p->adjvex = G->adlist[i].vertex; p->next = G->adlist[j].firstedge; G->adlist[j].firstedge = p; } } void PrintGraph(ALGraph *G){ int i; EdgeNode *p; for(i=0; i<G->n; i++){ printf("%c ", G->adlist[i].vertex); p = G->adlist[i].firstedge; while(1){ printf("%c ", p->adjvex); if(p->next == NULL) break; p = p->next; } printf("\n"); } /* for(i=0; i<=4; i++){ printf("%c ", G->adlist[i].vertex); }*/ } main(){ ALGraph *G; G = (ALGraph *)malloc(sizeof(ALGraph)); CreatGraph(G); PrintGraph(G); BFS(G); printf("\n"); }
相关文章推荐
- 再回首,数据结构——以邻接矩阵、邻接表表示的图的深度、广度优先搜索
- 图的邻接表表示及深度优先搜索和广度优先搜索 prim求最小生成树
- 用邻接表来表示BFS(广度优先搜索)
- 图的邻接表存储表示
- 图的邻接表表示法及深度搜索与广度搜索
- 数据结构 《2》----基于邻接表表示的图的实现 DFS(递归和非递归), BFS
- 图的邻接表表示
- 第五周作业——1有向图邻接表表示及反向图构造
- 通过邻接表实现广度优先搜索(迷宫问题)
- 第五周作业——有向图邻接表表示及反向图构造
- 有向图邻接表表示及反向图构造(第五周作业)
- 数据结构:图及其邻接矩阵与邻接表表示
- 图的邻接表表示法
- 邻接表表示图的各结点的度数(无向图)出度(有向图)
- 【数据结构】图的邻接表表示(GNU C++实现)
- 图的邻接表表示代码C/C++
- 数组表示邻接表
- BFS(邻接表表示)
- 什么是图和用邻接矩阵、邻接表表示一个图
- 数据结构-图存储表示之邻接表