邻接表的建立和广度优先遍历

来源:互联网 发布:交换机端口有ip地址吗 编辑:程序博客网 时间:2024/05/21 17:27


#include <stdio.h>#include <malloc.h>#define MAX_VEX 50typedef struct NODE{int vertex;  //顶点的索引struct NODE *next; //下一个表结点}EdgeNode; //表结点typedef struct{char vex;EdgeNode *first; //第一个表结点}Vertex; //表头结点typedef struct{Vertex vex[MAX_VEX];int n,e;}GRAPH;//建立临接表void Create(GRAPH *G){printf("输入顶点数:\n");scanf("%d",&G->n);printf("输入边数:\n");scanf("%d",&G->e);getchar();EdgeNode *p;int i,k,j;for(i = 0 ; i < G->n ; ++i)  //建立顶点表{scanf("%c",&G->vex[i].vex);G->vex[i].first = NULL;}for(k = 0 ; k < G->e ; ++k) // 建立边表{        //类似于头插法创建链表scanf("%d %d",&i,&j);p = (EdgeNode*)malloc(sizeof(EdgeNode));p->next = G->vex[i].first;p->vertex = j;G->vex[i].first = p;p = (EdgeNode*)malloc(sizeof(EdgeNode));p->next = G->vex[j].first;p->vertex = i;G->vex[j].first = p;}}//广度优先遍历void BFS(GRAPH *G,int k){EdgeNode *p;int Queue[MAX_VEX];  //循环队列int Front = -1,rear = -1,amount = 0;int visited[MAX_VEX];int i;for(i = 0 ; i < MAX_VEX ; ++i)visited[i] = 0;printf("访问顶点:%c\n",G->vex[k].vex);visited[k] = 1;rear = (rear + 1) % MAX_VEX; // 入队Front = 0;Queue[rear] = k;++amount;while(amount > 0){i = Queue[Front]; // 出队Front = (Front + 1) % MAX_VEX;--amount;p = G->vex[i].first;while(p){if(visited[p->vertex] == 0){printf("访问顶点:%c\n",G->vex[p->vertex].vex);visited[p->vertex] = 1;rear = (rear + 1) % MAX_VEX;  //入队Queue[rear] = p->vertex;++amount;}p = p->next;}}}int main(int argc, char *argv[]){GRAPH G;Create(&G);BFS(&G,0);return 0;}


1 0
原创粉丝点击