数据结构之图的深度优先遍历和广度优先遍历

基础:结构体,指针,图。

本文编译环境:Dev c++ 5.4.0

语言:c

 
//代码可直接运行
#include <stdio.h>
#include <stdlib.h>
 
#define maxsize 100
 
typedef struct ArcNode {
    int num;
    struct ArcNode *next;
}ArcNode;
typedef struct VNode{
    ArcNode *firstarc;
}VNode;
typedef struct Graph {
    VNode VNodeList[maxsize];
    int n,e;
}Graph;
 
void bulidGraph(Graph *&g);
 
int visitdfs[maxsize];
void DFS(Graph *g ,int v);
void dfs(Graph *g);
 
int visit[maxsize];
void bfs(Graph *g);
void BFS(Graph *g ,int v);
 
int main()
{
    Graph *g;
    g=(Graph *) malloc(sizeof(Graph));
    bulidGraph(g);
 
    dfs(g);
    printf("\n");
    bfs(g);
    return 0;
}
 
void DFS(Graph *g ,int v){
    ArcNode *p=g->VNodeList[v].firstarc;
    visitdfs[v]=1;
    printf("%d",v);
    while (p!=NULL){
        if(visitdfs[p->num]==0)
        DFS(g,p->num);
        p=p->next;
    }
}
void dfs(Graph *g){
    for(int i=0;i<g->n;i++){
        if(visitdfs[i]==0)
            DFS(g,i);
    }
}
 
void BFS(Graph *g,int v){
    ArcNode *p ;
    int que [maxsize], top=0,rear=0;
    int j;
    printf("%d",v);
    visit[v]=1;
    rear =(rear+1)%maxsize;
    que[rear]=v;
    while(top!=rear){
        top =(top+1)%maxsize;
        j=que[top];
        p=g->VNodeList[j].firstarc;
        while (p!=NULL){
            if(visit[p->num]==0){
                printf("%d",p->num);
                visit[p->num]=1;
                rear=(rear+1)%maxsize;
                que[rear]=p->num;
 
                }
                p=p->next;
        }
    }
}
void bfs(Graph *g){
    for(int i=0;i<g->n;i++){
        if(visit[i]==0)
            BFS(g,i);
    }
}
 
void bulidGraph(Graph *&g){
    g->n=6;
    g->e=7;
 
    VNode v0,v1 ,v2, v3 ,v4 ,v5,v6;
    ArcNode *v01,*v03,*v04,*v14,*v12,*v20,*v32,*v56;
 
    v01=(ArcNode *) malloc(sizeof(ArcNode));
    v01->num=1;
    v03=(ArcNode *) malloc(sizeof(ArcNode));
    v03->num=3;
    v04=(ArcNode *) malloc(sizeof(ArcNode));
    v04->num=4;
    v14=(ArcNode *) malloc(sizeof(ArcNode));
    v14->num=4;
    v12=(ArcNode *) malloc(sizeof(ArcNode));
    v12->num=2;
    v20=(ArcNode *) malloc(sizeof(ArcNode));
    v20->num=0;
    v32=(ArcNode *) malloc(sizeof(ArcNode));
    v32->num=2;
    v56=(ArcNode *) malloc(sizeof(ArcNode));
    v56->num=6;
 
    v0.firstarc=v01;
    v1.firstarc=v14;
    v2.firstarc=v20;
    v3.firstarc=v32;
    v4.firstarc=NULL;
    v5.firstarc=v56;
    v6.firstarc=NULL;
 
    v01->next=v03;
    v03->next=v04;
    v14->next=v12;
    v32->next=NULL;
    v20->next=NULL;
    v12->next=NULL;
    v04->next=NULL;
    v56->next=NULL;
 
    g->VNodeList[0]=v0;
    g->VNodeList[1]=v1;
    g->VNodeList[2]=v2;
    g->VNodeList[3]=v3;
    g->VNodeList[4]=v4;
    g->VNodeList[5]=v5;
    g->VNodeList[6]=v6;
 
}

结果:

这些代码都是跑过的,建议大家还是自己亲手敲一遍加深印象,作者这里也是一字一字敲出来的,要避免眼高手低。

本章的内容有误或者不懂的地方,大家可以私信我,我也会第一时间回复大家的,差不多暑假两个月,复习下这些基本知识,其他的问题也可以问我,就算我不知道的,在能力范围之内的一定竭尽全力为你们解答。我的QQ:932824098.


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值