**鄰接表對於無向圖的理解


上次我們寫了鄰接矩陣對於無向圖的理解,這次我們繼續,完善鄰接表對於無向圖的代碼。

鄰接表中有兩種結點結構:1.頂點表結點  2.邊表的結點

 

 

頂點表:

vertex:存儲圖中個頂點元素的信息;

fisrtedge:指針域  存儲首個邊表的結點

 

邊表:

adjvex: 鄰接點 頂點表中元素的下標;

next: 指針域  下一個鄰接點

 

無向圖:                                                                                                                                  相對應的鄰接表:

                                               

  1 #include<iostream>
  2 #include<string>
  3 #define maxSize 10
  4 using namespace std;
  5 //定義邊表
  6 struct arcNode {
  7     int arcNum;  //存儲頂點的下標
  8     arcNode* next;
  9 };
 10 
 11 //定義頂點表
 12 struct verNode {
 13     string vertex;
 14     arcNode* firstedg;
 15 };
 16 
 17 class ALGraph {
 18 public:
 19     ALGraph();
 20     ALGraph(string str[], int verNum, int arcNum);
 21     ~ALGraph();
 22     void DFStra(int v);
 23     void BFStra(int v);
 24 private:
 25     int verNum;
 26     int arcNum;
 27     //存放頂點表的數組
 28     verNode adjlist[maxSize];
 29     //頂點是否唄訪問過
 30     int visited[maxSize] = { 0 };
 31 };
 32 
 33 ALGraph::ALGraph() {
 34     cout << "默認構造函數!" << endl;
 35 }
 36 ALGraph::ALGraph(string str[], int verNum, int arcNum) {
 37     //圖中頂點的賦值
 38     this->verNum = verNum;
 39     for (int i = 0; i < this->verNum; i++) {
 40         adjlist[i].vertex = str[i];
 41         adjlist[i].firstedg = NULL;
 42     }
 43     this->arcNum = arcNum;
 44     for (int k = 0; k < this->arcNum; k++) {
 45         int i = 0;
 46         int j = 0;
 47         cout << "請輸入邊依附的頂點下標序號: ";
 48         cin >> i >> j;
 49         //單鏈表頭插法  頂點表與邊是雙向的 即鄰接矩陣的數組 arc[i][j]==arc[j][i];
 50         arcNode* s = new arcNode;
 51         s->arcNum = j;
 52         s->next = adjlist[i].firstedg;
 53         adjlist[i].firstedg= s;
 54 
 55         arcNode* p = new arcNode;
 56         p->arcNum = i;
 57         p->next = adjlist[j].firstedg;
 58         adjlist[j].firstedg = p;
 59     }
 60 }
 61 ALGraph::~ALGraph() {
 62     for (int i = 0; i < verNum; i++) {    
 63         if (adjlist[i].firstedg != NULL) {
 64             arcNode* p = adjlist[i].firstedg;
 65             adjlist[i].firstedg = adjlist[i].firstedg->next;
 66             delete p;
 67             p = NULL;   //上完廁所洗手
 68         }
 69      }
 70 }
 71 void ALGraph::DFStra(int v) {
 72     cout << adjlist[v].vertex;
 73     visited[v] = 1;
 74     arcNode* p = adjlist[v].firstedg;
 75     while (p != NULL) {
 76         if (visited[p->arcNum] == 0)
 77             DFStra(p->arcNum);
 78         p = p->next;
 79     }
 80 }
 81 void ALGraph::BFStra(int v) {
 82     //定義棧並初始化
 83     int Queue[maxSize];
 84     int front = -1;
 85     int rear = -1;
 86     cout << adjlist[v].vertex;
 87     visited[v] = 1;
 88     Queue[++rear] = v;
 89     while (front != rear) {
 90         v = Queue[++front];
 91         arcNode* p = adjlist[v].firstedg;
 92         //廣度
 93         while (p != NULL) {
 94             if (visited[p->arcNum] == 0){
 95                 cout << adjlist[p->arcNum].vertex;
 96                 visited[p->arcNum] = 1;
 97                 Queue[++rear] = p->arcNum;
 98             }
 99             p = p->next;
100         }
101     }
102 }
103 
104 int main() {
105     string str[4] = { "v0","v1","v2","v3" };
106     ALGraph myALGraph(str,4,4);
107     //myALGraph.DFStra(1);
108     //myALGraph.BFStra(1);
109     return 0;
110 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM