上次我們寫了鄰接矩陣對於無向圖的理解,這次我們繼續,完善鄰接表對於無向圖的代碼。
鄰接表中有兩種結點結構: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 }