zoukankan      html  css  js  c++  java
  • 数据结构【图】—023邻接表深度和广度遍历

      1 #include "000库函数.h"
      2 //无向图
      3 
      4 #define MAXSIZE 9 /* 存储空间初始分配量 */
      5 #define MAXEDGE 15
      6 #define MAXVEX 9
      7 #define INFINITY 65535
      8 
      9 typedef int Status;    /* Status是函数的类型,其值是函数结果状态代码,如OK等 */
     10 typedef int Boolean; /* Boolean是布尔类型,其值是TRUE或FALSE */
     11 
     12 typedef char VertexType; /* 顶点类型应由用户定义 */
     13 typedef int EdgeType; /* 边上的权值类型应由用户定义 */
     14 
     15 struct MGraph {//临接矩阵参数
     16     VertexType vexs[MAXVEX];
     17     EdgeType arc[MAXVEX][MAXVEX];
     18     int numVertexes, numEdges;
     19 };
     20 
     21 struct EdgeNode {//邻接表
     22     int adjvex;//节点
     23     EdgeType wt;//权重
     24     struct EdgeNode *next;//指针
     25 };
     26 
     27 struct VertexNode {//顶点表节点
     28     int in;//节点的入度
     29     VertexType data;
     30     EdgeNode *firstedge;
     31 };
     32 
     33 struct GraphAdjList {
     34     VertexNode adjList[MAXVEX];
     35     int numNodes, numEdges;
     36 };
     37 
     38 void CreateMGraph(MGraph **G) {
     39     (*G) = new MGraph;
     40     (*G)->numEdges = 15;
     41     (*G)->numVertexes = 9;
     42     /* 读入顶点信息,建立顶点表 */
     43     (*G)->vexs[0] = 'A';
     44     (*G)->vexs[1] = 'B';
     45     (*G)->vexs[2] = 'C';
     46     (*G)->vexs[3] = 'D';
     47     (*G)->vexs[4] = 'E';
     48     (*G)->vexs[5] = 'F';
     49     (*G)->vexs[6] = 'G';
     50     (*G)->vexs[7] = 'H';
     51     (*G)->vexs[8] = 'I';
     52 
     53 
     54     for (int i = 0; i < (*G)->numVertexes; ++i)/* 初始化图 */
     55     {
     56         for (int j = 0; j < (*G)->numVertexes; ++j)
     57         {
     58             (*G)->arc[i][j] = 0;
     59         }
     60     }
     61 
     62     (*G)->arc[0][1] = 1;
     63     (*G)->arc[0][5] = 1;
     64 
     65     (*G)->arc[1][2] = 1;
     66     (*G)->arc[1][8] = 1;
     67     (*G)->arc[1][6] = 1;
     68 
     69     (*G)->arc[2][3] = 1;
     70     (*G)->arc[2][8] = 1;
     71 
     72     (*G)->arc[3][4] = 1;
     73     (*G)->arc[3][7] = 1;
     74     (*G)->arc[3][6] = 1;
     75     (*G)->arc[3][8] = 1;
     76 
     77     (*G)->arc[4][5] = 1;
     78     (*G)->arc[4][7] = 1;
     79 
     80     (*G)->arc[5][6] = 1;
     81 
     82     (*G)->arc[6][7] = 1;
     83 
     84 
     85     for (int i = 0; i < (*G)->numVertexes; ++i)/* 初始化图 */
     86     {
     87         for (int j = 0; j < (*G)->numVertexes; ++j)
     88         {
     89             (*G)->arc[j][i] = (*G)->arc[i][j];
     90         }
     91     }
     92 
     93 }
     94 
     95 
     96 //构建临接表
     97 void CreateALGraph(MGraph *G, GraphAdjList **GL) {
     98     (*GL) = new GraphAdjList;
     99     (*GL)->numEdges = G->numEdges;
    100     (*GL)->numNodes = G->numVertexes;
    101     for (int i = 0; i < G->numVertexes; ++i) {
    102         (*GL)->adjList[i].data = G->vexs[i];
    103         (*GL)->adjList[i].firstedge = NULL;
    104         (*GL)->adjList[i].in = 0;
    105     }
    106     for (int i = 0; i < G->numVertexes; ++i) {
    107         for (int j = 0; j < G->numVertexes; ++j) {
    108             if (G->arc[i][j] != 0) {
    109                 EdgeNode *p = new EdgeNode;
    110                 p->adjvex = j;
    111                 p->wt = 1;
    112                 p->next = (*GL)->adjList[i].firstedge;
    113                 (*GL)->adjList[i].firstedge = p;
    114                 (*GL)->adjList[i].in += 1;
    115             }
    116         }
    117     }
    118 
    119 }
    120 //深度遍历
    121 vector<char>DFSRes;
    122 void DFS(GraphAdjList *GL, vector <bool>&flag, EdgeNode *p) {
    123     if (DFSRes.size() == GL->numNodes)return;
    124     while (p) {
    125         if (flag[p->adjvex]) {
    126             DFSRes.push_back(GL->adjList[p->adjvex].data);//第一遍入栈,用来判断的
    127             flag[p->adjvex] = false;
    128             p = GL->adjList[p->adjvex].firstedge;//下一个点
    129             DFS(GL, flag, p);
    130             DFSRes.pop_back();//弹出栈,让后面回溯回来的元素入栈!
    131         }
    132         else
    133             p = p->next;
    134     }
    135 }
    136 
    137 void DFSTraverse(GraphAdjList *GL) {
    138     vector<bool>flag(GL->numNodes, true);//标志
    139     for (int i = 0; i < GL->numNodes; ++i) {
    140         DFSRes.push_back(GL->adjList[i].data);
    141         flag[i] = false;
    142         EdgeNode *p = GL->adjList[i].firstedge;
    143         DFS(GL, flag, p);
    144     }
    145     cout << "/*****DFS*****/" << endl;
    146     for (auto a : DFSRes)
    147         cout << a << "->";
    148     cout << endl;
    149 }
    150 
    151 
    152 //广度遍历
    153 vector<char>BFSRes;
    154 deque<int>dq;//压入节符号
    155 
    156 void BFS(GraphAdjList *GL, EdgeNode *p, vector<bool>&flag) {
    157     BFSRes.push_back(GL->adjList[dq.front()].data);
    158     dq.pop_front();    
    159     while (p) {
    160         if (flag[p->adjvex]) {//未遍历过
    161             flag[p->adjvex] = false;            
    162             dq.push_back(p->adjvex);            
    163         }
    164         p = p->next;
    165     }
    166     if (dq.empty())return ;
    167     BFS(GL, GL->adjList[dq.front()].firstedge, flag);//下一个表
    168 }
    169 
    170 
    171 void BFSTraverse(GraphAdjList *GL) {
    172     vector<bool>flag(GL->numNodes, true);//访问标志
    173     dq.push_back(0);
    174     flag[0] = false;
    175     BFS(GL, GL->adjList[dq.front()].firstedge, flag);
    176     cout << "/*****BFS*****/" << endl;
    177     for (auto b : BFSRes)
    178         cout << b << "->";
    179     cout << endl;
    180 }
    181 
    182 
    183 
    184 int T023(void)
    185 {
    186     MGraph *G;
    187     GraphAdjList *GL;
    188     CreateMGraph(&G);
    189     CreateALGraph(G, &GL);
    190 
    191     //printf("
    深度遍历:");
    192     //DFSTraverse(GL);
    193     printf("
    广度遍历:");
    194     BFSTraverse(GL);
    195     return 0;
    196 }
  • 相关阅读:
    Swap Nodes in Pairs
    Remove Nth Node From End of List
    Rotate list
    历届试题_DNA比对
    斐波那契字符串_KMP
    字符串的模式匹配
    理解图像Garbor和HOG特征的提取方法及实例应用
    人眼定位和基于人眼的人脸姿态矫正_转载
    借助百度云API进行人脸识别
    { "result": null, "log_id": 304592860300941982, "error_msg": "image check fail", "cached": 0, "error_code": 222203, "timestamp": 1556030094 }
  • 原文地址:https://www.cnblogs.com/zzw1024/p/10567806.html
Copyright © 2011-2022 走看看