首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> C++ 入門

鄰接表無向圖C++實現詳解

     編輯:C++ 入門

數據結構定義

#define MAX 100

class ListUDG {
private:
    // 邊節點
    class ENode {
    public:
        int ivex;       // 目標頂點索引
        ENode* nextEdge; // 下一條邊
    };
    
    // 頂點節點
    class VNode {
    public:
        char data;       // 頂點信息
        ENode* firstEdge; // 第一條邊
    };
    
    int mVexNum;        // 頂點數
    int mEdgNum;        // 邊數
    VNode mVexs[MAX];   // 頂點數組
    
    // 輔助函數
    char readChar();
    int getPosition(char ch);
    void linkLast(ENode* list, ENode* node);
    
public:
    ListUDG();                          // 手動輸入構建
    ListUDG(char vexs[], int vlen,      // 給定數據構建
            char edges[][2], int elen);
    ~ListUDG();
    void print();                       // 打印鄰接表
};

核心操作實現

1. 給定數據構建(構造函數)

ListUDG::ListUDG(char vexs[], int vlen, char edges[][2], int elen) {
    mVexNum = vlen; mEdgNum = elen;
    
    // 初始化頂點
    for(int i=0; i c2
        ENode* node1 = new ENode();
        node1->ivex = p2;
        if(mVexs[p1].firstEdge == NULL) mVexs[p1].firstEdge = node1;
        else linkLast(mVexs[p1].firstEdge, node1);
        
        // c2 -> c1
        ENode* node2 = new ENode();
        node2->ivex = p1;
        if(mVexs[p2].firstEdge == NULL) mVexs[p2].firstEdge = node2;
        else linkLast(mVexs[p2].firstEdge, node2);
    }
}

2. 尾插法輔助函數

void ListUDG::linkLast(ENode* list, ENode* node) {
    ENode* p = list;
    while(p->nextEdge != NULL) p = p->nextEdge;
    p->nextEdge = node;
}

3. 手動輸入構建

ListUDG::ListUDG() {
    cout << "input vertex number: "; cin >> mVexNum;
    cout << "input edge number: ";   cin >> mEdgNum;
    // 合法性檢查...
    
    for(int i=0; i

使用示例

char vexs[] = {'A','B','C','D','E','F','G'};
char edges[][2] = {
    {'A','C'}, {'A','D'}, {'A','F'},
    {'B','C'}, {'C','D'}, {'E','G'}, {'F','G'}
};
int vlen = sizeof(vexs)/sizeof(vexs[0]);
int elen = sizeof(edges)/sizeof(edges[0]);

ListUDG* pG = new ListUDG(vexs, vlen, edges, elen);
pG->print();
// 輸出每頂點鄰接鏈表
delete pG;

內存佈局圖解

頂點數組 mVexs:
[0] 'A' → 2 → 3 → 5 → NULL  (C,D,F)
[1] 'B' → 2 → NULL          (C)
[2] 'C' → 0 → 1 → 3 → NULL  (A,B,D)
[3] 'D' → 0 → 2 → NULL      (A,C)
[4] 'E' → 6 → NULL          (G)
[5] 'F' → 0 → 6 → NULL      (A,G)
[6] 'G' → 4 → 5 → NULL      (E,F)

關鍵點總結

  • 無向圖每條邊添加兩次(雙向)
  • 鏈表尾插保持邊順序穩定
  • 析構函數需遞釋放所有ENode內存
  • getPosition線性查找,大圖可優化為map
  • 適用於稀疏圖(邊數遠小於頂點數平方)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved