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

    邻接图的优点就是,现用现申请,空间存储很灵活,并且需要的空间也很小。我们在做复杂网络时,通常也是用这种方法。缺点是不适合并行化,因为cuda只支持连续地址空间的拷贝。

    数据结构

    主要包括,边节点和顶点节点

    typedef struct edgeNode{
        int num;
        int weight;
        struct edgeNode * next;
    }edgeNode;
    
    typedef struct vertexNode{
        char data;
        edgeNode * firstNode;
    }vertexNode,List[NUM];
    
    typedef struct Graph{
        List list;
        int numver,numedges;
    }Graph;

    深度优先遍历

    与矩阵图类似

    void DFS(Graph *g,int i){
        edgeNode *p = (edgeNode *)malloc(sizeof(edgeNode));
        visited[i] = 1;
        printf("%c ",g->list[i].data);
        p = g->list[i].firstNode;
        while(p){
            if(!visited[p->num])
                DFS(g,p->num);
            p = p->next;
        }
    }
    void DFSTraverse(Graph *g){
        int i;
        for(i=0;i<g->numver;i++)
            visited[i] = 0;
        for(i=0;i<g->numver;i++)
            if(!visited[i])
                DFS(g,i);
    }

    广度优先遍历

    void BFSTraverse(Graph *g){
        int i;
        edgeNode *p;
        Queue *q = (Queue *)malloc(sizeof(Queue));
    
        for(i=0;i<g->numver;i++)
            visited[i] = 0;
        initQueue(q,0);
        for(i=0;i<g->numver;i++){
            if(!visited[i]){
                visited[i] = 1;
                printf("%c ",g->list[i].data);
                inQueue(q,i);
                while(getLength(q)){
                    int *tar = (int *)malloc(sizeof(int));
                    outQueue(q,tar);
                    p = g->list[*tar].firstNode;
                    while(p){
                        if(!visited[p->num]){
                            visited[p->num] = 1;
                            printf("%c ",g->list[p->num].data);
                            inQueue(q,p->num);
                        }
                        p = p->next;
                    }
    
                }
            }
        }
    
    }

    示例图

    示例代码

      1 #include <stdio.h>
      2 #include <stdlib.h>
      3 #define NUM 5
      4 #define MAXSIZE NUM
      5 
      6 typedef struct edgeNode{
      7     int num;
      8     int weight;
      9     struct edgeNode * next;
     10 }edgeNode;
     11 
     12 typedef struct vertexNode{
     13     char data;
     14     edgeNode * firstNode;
     15 }vertexNode,List[NUM];
     16 
     17 typedef struct Graph{
     18     List list;
     19     int numver,numedges;
     20 }Graph;
     21 
     22 typedef struct Queue{
     23     int data[NUM];
     24     int front;
     25     int rear;
     26 }Queue;
     27 
     28 void initQueue(Queue *q,int n);
     29 void showQueue(Queue *q);
     30 int getLength(Queue *q);
     31 int inQueue(Queue *q,int num);
     32 int outQueue(Queue *q,int *tar);
     33 
     34 void createGraph(Graph *g);
     35 void showGraph(Graph *g);
     36 void add(Graph *g,int a,int b,int c);
     37 void DFS(Graph *g,int i);
     38 void DFSTraverse(Graph *g);
     39 void BFSTraverse(Graph *g);
     40 
     41 int visited[NUM];
     42 
     43 int main()
     44 {
     45     Graph * g = (Graph *)malloc(sizeof(Graph));
     46     createGraph(g);
     47     showGraph(g);
     48     printf("
    ");
     49     DFSTraverse(g);
     50     printf("
    ");
     51     BFSTraverse(g);
     52     return 0;
     53 }
     54 void add(Graph *g,int a,int b,int c){
     55     edgeNode *e;
     56 
     57     e = (edgeNode *)malloc(sizeof(edgeNode));
     58     e->next = g->list[a].firstNode;
     59     g->list[a].firstNode = e;
     60     e->num = b;
     61     e->weight = c;
     62 
     63     e = (edgeNode *)malloc(sizeof(edgeNode));
     64     e->next = g->list[b].firstNode;
     65     g->list[b].firstNode = e;
     66     e->num = a;
     67     e->weight = c;
     68 
     69     g->numedges++;
     70 
     71 
     72 }
     73 
     74 void createGraph(Graph *g){
     75     int i;
     76     for(i=0;i<NUM;i++){
     77         g->list[i].data = 65+i;
     78         g->list[i].firstNode = NULL;
     79     }
     80     g->numver = NUM;
     81     g->numedges = 0;
     82     //添加顶点0的边
     83     add(g,0,1,0);
     84     add(g,0,2,0);
     85     add(g,0,3,0);
     86     add(g,0,4,0);
     87 
     88     add(g,1,3,0);
     89     add(g,1,4,0);
     90 
     91     add(g,2,4,0);
     92 
     93     add(g,3,4,0);
     94 }
     95 void showGraph(Graph *g){
     96     int i;
     97     for(i=0;i<g->numver;i++){
     98         printf("g[%d] ",i);
     99         edgeNode *p = (edgeNode *)malloc(sizeof(edgeNode));
    100         p = g->list[i].firstNode;
    101         while(p){
    102             printf("->%d(%d)",p->num,p->weight);
    103             p = p->next;
    104         }
    105         printf("->null
    ");
    106     }
    107 }
    108 
    109 void DFS(Graph *g,int i){
    110     edgeNode *p = (edgeNode *)malloc(sizeof(edgeNode));
    111     visited[i] = 1;
    112     printf("%c ",g->list[i].data);
    113     p = g->list[i].firstNode;
    114     while(p){
    115         if(!visited[p->num])
    116             DFS(g,p->num);
    117         p = p->next;
    118     }
    119 }
    120 void DFSTraverse(Graph *g){
    121     int i;
    122     for(i=0;i<g->numver;i++)
    123         visited[i] = 0;
    124     for(i=0;i<g->numver;i++)
    125         if(!visited[i])
    126             DFS(g,i);
    127 }
    128 void BFSTraverse(Graph *g){
    129     int i;
    130     edgeNode *p;
    131     Queue *q = (Queue *)malloc(sizeof(Queue));
    132 
    133     for(i=0;i<g->numver;i++)
    134         visited[i] = 0;
    135     initQueue(q,0);
    136     for(i=0;i<g->numver;i++){
    137         if(!visited[i]){
    138             visited[i] = 1;
    139             printf("%c ",g->list[i].data);
    140             inQueue(q,i);
    141             while(getLength(q)){
    142                 int *tar = (int *)malloc(sizeof(int));
    143                 outQueue(q,tar);
    144                 p = g->list[*tar].firstNode;
    145                 while(p){
    146                     if(!visited[p->num]){
    147                         visited[p->num] = 1;
    148                         printf("%c ",g->list[p->num].data);
    149                         inQueue(q,p->num);
    150                     }
    151                     p = p->next;
    152                 }
    153 
    154             }
    155         }
    156     }
    157 
    158 }
    159 
    160 void initQueue(Queue *q,int n){
    161     int i;
    162     q->front=0;
    163     q->rear =0;
    164     for(i=0;i<n;i++){
    165         q->data[q->rear]=2*i+1;
    166         q->rear++;
    167     }
    168 }
    169 void showQueue(Queue *q){
    170     int i;
    171     int len=getLength(q);
    172     printf("front-");
    173     for(i=0;i<len;i++){
    174         if(q->front+i<MAXSIZE)
    175             printf("%d-",q->data[q->front+i]);
    176         else
    177             printf("%d-",q->data[q->front+i-MAXSIZE]);
    178     }
    179     printf("rear
    ");
    180 }
    181 int getLength(Queue *q){
    182     return (q->rear-q->front+MAXSIZE)%MAXSIZE;
    183 }
    184 int inQueue(Queue *q,int num){
    185     if((q->rear+1)%MAXSIZE == q->front)
    186         return 0;
    187     q->data[q->rear] = num;
    188     q->rear = (q->rear+1)%MAXSIZE;
    189     return 1;
    190 }
    191 int outQueue(Queue *q,int *tar){
    192     if(q->front == q->rear)
    193         return 0;
    194     *tar = q->data[q->front];
    195     q->front = (q->front+1)%MAXSIZE;
    196     return 1;
    197 }
    View Code

    运行结果

  • 相关阅读:
    第一章复习(已完结)
    复习——第二章(施工完成,哪里总结的不全或是有问题欢迎指出)
    实验九
    实验五
    实验四
    实验三
    实验二
    实验一
    汇编语言第二章
    【C# 大写金额转阿拉伯数字】大写金额转数值
  • 原文地址:https://www.cnblogs.com/xing901022/p/3538279.html
Copyright © 2011-2022 走看看