zoukankan      html  css  js  c++  java
  • **邻接表对于无向图的理解

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

    邻接表中有两种结点结构: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 }
  • 相关阅读:
    android -------- Data Binding的使用(二)
    牛客网-《剑指offer》-数值的整数次方[快速幂运算]
    牛客网-《剑指offer》-二进制中1的个数
    牛客网-《剑指offer》-矩形覆盖
    牛客网-《剑指offer》-变态跳台阶
    牛客网-《剑指offer》-跳台阶
    牛客网-《剑指offer》-斐波那契数列
    牛客网-《剑指offer》-旋转数组的最小数
    牛客网-《剑指offer》-用两个栈实现队列
    牛客网-《剑指offer》-重建二叉树
  • 原文地址:https://www.cnblogs.com/jllj/p/6133658.html
Copyright © 2011-2022 走看看