#include<stdio.h> #include<stdlib.h> #include<string.h> #define MAX_VER 100//最大顶点数 typedef struct edgnode{//邻接点域 int vertex; struct edgnode *next; }enode; typedef struct vnode{ char data; enode *link; }vlist[MAX_VER]; typedef struct node2{ int v; struct node2 *next; }qnode; typedef struct { qnode *front,*rear; }linkQueue; int n; int visited[MAX_VER];//用于标志顶点是否被访问过 vlist g; linkQueue queue; void Init(linkQueue *q) { q->front=q->rear=NULL; } void InsertQueue(linkQueue * &q,int e) { qnode * node; node=(qnode*)malloc(sizeof(qnode)); node->v=e; node->next=NULL; if(NULL==q->front) { q->front=q->rear=node; } else { q->rear->next=node; q->rear=node; } } int outQueue(linkQueue * &q) { int e; qnode *temp; if(NULL==q->front) e=NULL; else { temp=q->front; e=temp->v; q->front=temp->next; free(temp); } return e; } //创建无向图 void createGraphic(vlist g) { int e,i=1,start,end; enode *p; printf("请输入顶点数(n)和边数(e):\n"); scanf("%d%d",&n,&e); while(i<=n) //初始化顶点表 { fflush(stdin); printf("请输入第 %d 个顶点:",i); g[i].data=getchar(); g[i].link=NULL; i++; } i=1; while(i<=e)//采用头插法初始化邻接点域 { fflush(stdin); printf("请输入第 %d 条边的起点和终点:",i);//无向图是双向的 1-2 2-1 scanf("%d%d",&start,&end); p=(enode *)malloc(sizeof(enode)); p->vertex=end; p->next=g[start].link; g[start].link=p; p=(enode *)malloc(sizeof(enode)); p->vertex=start; p->next=g[end].link; g[end].link=p; i++; } } //Breadth First Search 广度优先搜索 相当于树的层次遍历 void BFS(linkQueue *queue,int i) { int temp; enode *p; InsertQueue(queue,i); while(NULL!=queue->front) { temp=outQueue(queue); if(!visited[temp]) { printf("%d ",temp); visited[temp]=1; } p=g[temp].link; while(NULL!=p) { if(!visited[p->vertex]) { InsertQueue(queue,p->vertex); } p=p->next; } } } //Depth First Search 深度优先搜索 相当于树的先序遍历 void DFS(vlist g,int i) { enode *p; printf("%c ",g[i].data); visited[i]=1; p=g[i].link; while(NULL!=p) { if(!visited[p->vertex]) { DFS(g,p->vertex); } p=p->next; } } //遍历每个顶点 void DFSGraphic(vlist g) { int i; memset(visited,0,n); for(i=1;i<=n;i++) { if(!visited[i]) { //DFS(g,i); BFS(&queue,i); } } printf("\n"); } int main() { Init(&queue); createGraphic(g); DFSGraphic(g); return 0; }