圖的鄰接表表示及其遍歷
1.圖的結構定義
#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;
2.圖的建立
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;*/
}
}
3.圖的DFS遍歷
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;
}
}
假設有下面這張圖,這個圖包含兩個連通圖。
輸入如下:
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/DataStructure