#define MAXVEX 100 #define true 1 typedef char VertexType; //定義圖節點值得類型,可隨意更換 typedef int EdgeType; typedef struct EdgeNode //定義邊表節點 { int adjvex; //存儲頂點下標 EdgeType weight; //權重值 struct EdgeNode* next; //邊指針 }EdgeNode; typedef struct VertexNode /*頂點表節點*/ { VertexType data; EdgeNode* firstedge; }VertexNode,AdjList[MAXVEX]; typedef struct { AdjList adjList; int numVertexes,numEdges; }GraphAdjList;
void CreatGraph(GraphAdjList *g) { int i,j,k; EdgeNode *e; scanf("%d%d",&g->numVertexes,&g->numEdges);//獲取頂點數和邊數 char c; //gettchar(); for(i=0;i<g->numVertexes;i++) { while((c=getchar())=='\n'||c==' ');//排除空格和換行符 g->adjList[i].data = c; //獲取頂點值, g->adjList[i].firstedge = NULL; //將邊表置爲空 } for(k=0;k<g->numEdges;k++) { scanf("%d%d",&i,&j); //輸入i,j 在圖中有i-->j e=(EdgeNode*)malloc(sizeof(EdgeNode)); e->adjvex = j; e->next = g->adjList[i].firstedge; //頭插法創建邊表 g->adjList[i].firstedge= e; /*若是爲無向圖,則加入如下代碼 e=(EdgeNode*)malloc(sizeof(EdgeNode)); e->adjvex = i; e->next = g->adjList[j].firstedge; g->adjList[j].firstedge= e;*/ } }
void DFS(GraphAdjList *g,int i) { EdgeNode *p; visited[i]=true; printf("%c ",g->adjList[i].data); p = g->adjList[i].firstedge; while(p) { if(visited[p->adjvex]==0) DFS(g,p->adjvex); p=p->next; } }
假設有下面這張圖,這個圖包含兩個連通圖。git
輸入以下:github
7 6 <==輸入頂點數和邊數 a b c d e f g <==輸入頂點值 0 2 0 3 0 1 4 5 1 6 1 2 <==依次輸入邊
根據輸入,能夠獲得鄰接表以下:
根據鄰接表可知,該圖的深度優先遍歷以下:指針
a->b->c->g->d->e->f
程序運行結果:
證實程序是正確的。
完整程序代碼參見:
https://github.com/zkangHUST/DataStructurecode