資料結構7-關於“圖”的生成與操作的例項
阿新 • • 發佈:2019-01-27
程式實現用鄰接表儲存的形式建立一棵無向圖,應用深度優先搜尋的方法遍歷圖中各點,並打印出資料,程式碼如下所示:
#include"stdio.h" typedef struct ArcNode{ /*單鏈表中的結點的型別*/ int adjvex; /*該邊指向的頂點在順序表中的位置*/ struct ArcNode *next; /*下一條邊*/ }ArcNode; typedef struct VNode{ /*頂點型別*/ int data; /*頂點中的資料資訊*/ ArcNode *firstarc; /*指向單鏈表,即指向第一條邊*/ }VNode; int visited[5]={0,0,0,0,0}; CreatGraph(int n,VNode G[]){ int i,e; ArcNode *p,*q; printf("Input the information of the vertex\n"); for(i=0;i<n;i++){ scanf("%d",&G[i]); G[i].firstarc = NULL; /*初始化第一條邊為空*/ } for(i=0;i<n;i++){ printf("Creat the edges for the %dth vertex\n",i); scanf("%d",&e); while(e!=-1){ p = (ArcNode *)malloc(sizeof(ArcNode)); /*建立一條邊*/ p->next = NULL; p->adjvex = e; if(G[i].firstarc == NULL) G[i].firstarc = p; /*i結點的第一條邊*/ else q->next = p; /*下一條邊*/ q = p; scanf("%d",&e); } } } int FirstAdj(VNode G[],int v){ if(G[v].firstarc != NULL) return (G[v].firstarc)->adjvex; return -1; } int NextAdj(VNode G[],int v){ ArcNode *p; p=G[v].firstarc; while(p!=NULL){ if(visited[p->adjvex]) p=p->next; else return p->adjvex; } return -1; } void DFS(VNode G[],int v){ int w; printf("%d ",G[v]); /*訪問當前頂點,打印出該頂點中的資料資訊*/ visited[v]=1; /*將頂點v對應的訪問標記置1*/ w=FirstAdj(G,v); /*找到頂點v的第一個鄰接點,如果無鄰接點,返回-1*/ while(w != -1){ if(visited[w] == 0) /*該頂點未被訪問*/ DFS(G,w); /*遞迴地進行深度優先搜尋*/ w = NextAdj(G,v); /*找到頂點v的下一個鄰接點,如果無鄰接點,返回-1*/ } } main(){ VNode G[5]; CreatGraph(5,G); DFS(G,0); getche(); }