zoukankan      html  css  js  c++  java
  • 图的邻接表+深度优先遍历+广度优先遍历

      1 /**
      2     无向图的邻接表存储
      3     深度优先遍历递归
      4     广度优先遍历递归+非递归
      5 */
      6 #include <stdio.h>
      7 #include <string.h>
      8 #include <malloc.h>
      9 #define N 5
     10 #define MAX 50
     11 typedef struct A{
     12     int adjvex;
     13     struct A* nextArc;
     14 }Arc;
     15 typedef struct node{
     16     char data[N];
     17     Arc* firstArc;
     18 }Node;
     19 typedef struct graph{
     20     Node vex[MAX];
     21     int numv;
     22     int nume;
     23 }Graph;
     24 
     25 int getIndex(Graph G,char s[]){
     26     for(int i = 0; i < G.numv; i++){
     27         if(strcmp(G.vex[i].data,s) == 0)
     28             return i;
     29     }
     30     return -1;
     31 }
     32 
     33 void create(Graph& G){
     34     printf("输入顶点和弧的个数:
    ");
     35     scanf("%d%d",&G.numv,&G.nume);
     36     printf("输入顶点信息:
    ");
     37     for(int i = 0; i < G.numv; i++)
     38         scanf("%s",G.vex[i].data);
     39     ///初始化顶点数组
     40     for(int i = 0; i < G.numv; i++)
     41         G.vex[i].firstArc = NULL;
     42     printf("输入边的信息:
    ");
     43     char s[N],e[N];
     44     int u,v;
     45     for(int i = 0; i < G.nume; i++){
     46         scanf("%s%s",s,e);
     47         u = getIndex(G,s);
     48         v = getIndex(G,e);
     49         Arc* p = (Arc*)malloc(sizeof(Arc));
     50         p->adjvex = v;
     51         p->nextArc = NULL;
     52         p->nextArc = G.vex[u].firstArc;
     53         G.vex[u].firstArc = p;
     54         Arc* t = (Arc*)malloc(sizeof(Arc));
     55         t->nextArc = NULL;
     56         t->adjvex = u;
     57         t->nextArc = G.vex[v].firstArc;
     58         G.vex[v].firstArc = t;
     59     }
     60 }
     61 
     62 void output(Graph G){
     63     Arc* p;
     64     for(int i = 0; i < G.numv; i++){
     65         p = G.vex[i].firstArc;
     66         printf("%4s",G.vex[i].data);
     67         while(p != NULL){
     68             printf("%4s",G.vex[p->adjvex].data);
     69             p = p->nextArc;
     70         }
     71         printf("
    ");
     72     }
     73 }
     74 
     75 ///深度优先遍历 (递归)
     76 int visit[2*MAX];
     77 void dfs(Graph G,int s){
     78     Arc* p = G.vex[s].firstArc;
     79     if(!visit[s]){
     80         printf("%4s",G.vex[s].data);
     81         visit[s] = 1;
     82     }
     83     while(p != NULL){
     84         if(!visit[p->adjvex])
     85             dfs(G,p->adjvex);
     86         p = p->nextArc;
     87     }
     88 }
     89 
     90 ///广度优先遍历 (递归)
     91 ///缺点递归最大为G.numv次
     92 int q[2*MAX],f=0,r=0;
     93 int visit_q[MAX];
     94 void bfs(Graph G,int s){
     95     if(!visit_q[s]){
     96         printf("%4s",G.vex[s].data);
     97         visit_q[s] = 1;
     98         Arc* p = G.vex[s].firstArc;
     99         while(p != NULL){
    100             if(!visit_q[p->adjvex])
    101                 q[r++] = p->adjvex;
    102             p = p->nextArc;
    103         }
    104     }
    105     while(f < r){
    106         bfs(G,q[f++]);
    107     }
    108 }
    109 
    110 ///广度优先遍历 (非递归)
    111 int Q[2*MAX],F=0,R=0;
    112 int visit_Q[MAX];
    113 void bfs_1(Graph G,int s){
    114     printf("%4s",G.vex[s].data);
    115     visit_Q[s] = 1;
    116     Arc* p = G.vex[s].firstArc;
    117     while(p != NULL){
    118         Q[R++] = p->adjvex;
    119         p = p->nextArc;
    120     }
    121     while(F < R){
    122         int node = Q[F++];
    123         if(!visit_Q[node]){
    124             printf("%4s",G.vex[node].data);
    125             visit_Q[node] = 1;
    126             p = G.vex[node].firstArc;
    127             while(p != NULL){
    128                 if(!visit_Q[p->adjvex])
    129                     Q[R++] = p->adjvex;
    130                 p = p->nextArc;
    131             }
    132         }
    133     }
    134 }
    135 
    136 int main(void){
    137     Graph G;
    138     create(G); printf("输出邻接矩阵:
    ");
    139     output(G);
    140     printf("深度优先遍历(递归):
    ");
    141     dfs(G,0);
    142     printf("
    广度优先遍历(递归):
    ");
    143     bfs(G,0);
    144     printf("
    广度优先遍历(非递归):
    ");
    145     bfs_1(G,0);
    146     return 0;
    147 }

    测试用例:

    8 9
    v1 v2 v3 v4 v5 v6 v7 v8
    v1 v2
    v1 v3
    v2 v4
    v2 v5
    v3 v6
    v3 v7
    v4 v8
    v5 v8
    v7 v6
    v1
    图(b)

    8 7
    v1 v2 v3 v4 v5 v6 v7 v8
    v1 v2
    v1 v3
    v2 v4
    v3 v6
    v4 v8
    v6 v7
    v8 v5
    v1
    图(a)

    8 10
    1 2 3 4 5 6 7 8
    1 2
    1 3
    2 4
    2 5
    3 6
    3 7
    4 8
    5 8
    6 8
    7 8
    1
    图(d)

    6 7
    A B C D E F
    A B
    A E
    B F
    B E
    F C
    F D
    D C
    图(c)

  • 相关阅读:
    Core Text 实现富文本显示
    音视频直播服务平台总结
    WWDC2017那些事
    Swift网络请求(Moya篇)
    [转贴]孙正耀退休感言
    不要让专业限制了你的高度
    你会搞科研吗?
    上传服务端
    AysnTask+HttpClient实现上传
    TextView改变颜色
  • 原文地址:https://www.cnblogs.com/yfs123456/p/5701369.html
Copyright © 2011-2022 走看看