**邻接表对于无向图的理解

上次我们写了邻接矩阵对于无向图的理解,这次我们继续,完善邻接表对于无向图的代码。

邻接表中有两种结点结构: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 }
原文地址:https://www.cnblogs.com/jllj/p/6133658.html