**邻接表对于无向图的理解
上次我们写了邻接矩阵对于无向图的理解,这次我们继续,完善邻接表对于无向图的代码。
邻接表中有两种结点结构: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 }