圖的鄰接表表示及其遍歷

圖的鄰接表表示及其遍歷

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;
        }
}

假設有下面這張圖,這個圖包含兩個連通圖。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

相關文章
相關標籤/搜索