鄰接表有向圖(一) C語言詳解

來源:互聯網
上載者:User

鄰接表有向圖的介紹

鄰接表有向圖是指通過鄰接表表示的有向圖。

上面的圖G2包含了"A,B,C,D,E,F,G"共7個頂點,而且包含了"<A,B>,<B,C>,<B,E>,<B,F>,<C,E>,<D,C>,<E,B>,<E,D>,<F,G>"共9條邊。

上圖右邊的矩陣是G2在記憶體中的鄰接表示意圖。每一個頂點都包含一條鏈表,該鏈表記錄了"該頂點所對應的出邊的另一個頂點的序號"。例如,第1個頂點(頂點B)包含的鏈表所包含的節點的資料分別是"2,4,5";而這"2,4,5"分別對應"C,E,F"的序號,"C,E,F"都屬於B的出邊的另一個頂點。

鄰接表有向圖的代碼說明

1. 基本定義

// 鄰接表中表對應的鏈表的頂點typedef struct _ENode{    int ivex;                   // 該邊所指向的頂點的位置    struct _ENode *next_edge;   // 指向下一條弧的指標}ENode, *PENode;    // 鄰接表中表的頂點typedef struct _VNode{    char data;              // 頂點資訊    ENode *first_edge;      // 指向第一條依附該頂點的弧}VNode;    // 鄰接表typedef struct _LGraph{    int vexnum;             // 圖的頂點的數目    int edgnum;             // 圖的邊的數目    VNode vexs[MAX];}LGraph;

(01) LGraph是鄰接表對應的結構體。 vexnum是頂點數,edgnum是邊數;vexs則是儲存頂點資訊的一維數組。
(02) VNode是鄰接表頂點對應的結構體。 data是頂點所包含的資料,而firstedge是該頂點所包含鏈表的表頭指標。
(03) ENode是鄰接表頂點所包含的鏈表的節點對應的結構體。 ivex是該節點所對應的頂點在vexs中的索引,而next
edge是指向下一個節點的。

2. 建立矩陣

這裡介紹提供了兩個建立矩陣的方法。一個是用已知資料,另一個則需要使用者手動輸入資料

2.1 建立圖(用已提供的矩陣)

/* * 建立鄰接表對應的圖(用已提供的資料) */LGraph* create_example_lgraph(){    char c1, c2;    char vexs[] = {'A', 'B', 'C', 'D', 'E', 'F', 'G'};    char edges[][2] = {        {'A', 'B'},         {'B', 'C'},         {'B', 'E'},         {'B', 'F'},         {'C', 'E'},         {'D', 'C'},         {'E', 'B'},         {'E', 'D'},         {'F', 'G'}};     int vlen = LENGTH(vexs);    int elen = LENGTH(edges);    int i, p1, p2;    ENode *node1, *node2;    LGraph* pG;            if ((pG=(LGraph*)malloc(sizeof(LGraph))) == NULL )        return NULL;    memset(pG, 0, sizeof(LGraph));        // 初始化"頂點數"和"邊數"    pG->vexnum = vlen;    pG->edgnum = elen;    // 初始化"鄰接表"的頂點    for(i=0; i<pG->vexnum; i++)    {        pG->vexs[i].data = vexs[i];        pG->vexs[i].first_edge = NULL;    }        // 初始化"鄰接表"的邊    for(i=0; i<pG->edgnum; i++)    {        // 讀取邊的起始頂點和結束頂點        c1 = edges[i][0];        c2 = edges[i][1];            p1 = get_position(*pG, c1);        p2 = get_position(*pG, c2);        // 初始化node1        node1 = (ENode*)malloc(sizeof(ENode));        node1->ivex = p2;        // 將node1連結到"p1所在鏈表的末尾"        if(pG->vexs[p1].first_edge == NULL)          pG->vexs[p1].first_edge = node1;        else            link_last(pG->vexs[p1].first_edge, node1);    }        return pG;}

更多精彩內容:http://www.bianceng.cnhttp://www.bianceng.cn/Programming/sjjg/

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.