dfs, bfs之邻接表无向图实验

dfs, bfs之邻接表无向图实验

标签:dfs bfs


#include <stdio.h>
#include <stdlib.h>
#include <queue>
using namespace std;

#define M 20  //预定义图的最大顶点数
int visited[M];

typedef char DataType;  //顶点信息数据类型

typedef struct node{  //边表结点
    int adjvex;
    struct node *next;
}EdgeNode;

typedef struct vnode{   //头结点
    DataType vertex;
    EdgeNode *FirstEdge;
}VertexNode;

typedef struct{  //邻接表类型
    VertexNode adjlist[M];  //存放头结点的顺序表
    int n, e;  //图的顶点数与边数
}LinkedGraph;

void creat(LinkedGraph *g){
    freopen("g11.txt", "r", stdin);
    EdgeNode *s;

    scanf("%d %d", &g->n, &g->e);
    for(int i = 0; i < g->n; i++){
        scanf("%1s", &g->adjlist[i].vertex);  //读入顶点信息
        g->adjlist[i].FirstEdge = NULL;  //边表置为空表
    }
    for(int k = 0; k < g->e; k++){  //循环e次建立边表
        int i, j;

        scanf("%d %d",&i,&j);
        s = (EdgeNode *)malloc(sizeof(EdgeNode));
        s->adjvex = j;  //邻接点序号为j
        s->next = g->adjlist[i].FirstEdge;
        g->adjlist[i].FirstEdge = s;  //将新结点*s插入顶点vi的边表头部

        s = (EdgeNode *)malloc(sizeof(EdgeNode));  //无向图
        s->adjvex = i;  //邻接点序号为i
        s->next = g->adjlist[j].FirstEdge;
        g->adjlist[j].FirstEdge = s;  //将新结点*s插入顶点vj的边表头部
        }
}

void print(LinkedGraph  g){
    for(int i = 0; i < g.n; i++){
        printf("%c", g.adjlist[i].vertex);
        EdgeNode *p = g.adjlist[i].FirstEdge;
        while(p){
            printf("-->%d", p->adjvex);
            p = p->next;
        }
     printf("\n");
   }
}

void dfs(LinkedGraph g,int i){
    visited[i] = 1;
    printf("%c", g.adjlist[i].vertex);
    for(EdgeNode *p = g.adjlist[i].FirstEdge; p; p = p->next)
        if(!visited[p->adjvex])  dfs(g, p->adjvex);
}

void DfsTraverse(LinkedGraph g){
    for(int i = 0; i < g.n; i++)  visited[i] = 0;
    for(int i = 0; i < g.n; i++)
       if(!visited[i])  dfs(g, i);
}

queue <int> q;

void bfs(LinkedGraph g, int i){
    visited[i] = 1;
    printf("%c", g.adjlist[i].vertex);
    q.push(i);
    while(!q.empty()){
        EdgeNode *u = g.adjlist[q.front()].FirstEdge;
        q.pop();
        for(EdgeNode *p = u; p; p = p->next)
            if(!visited[p->adjvex]){
                visited[p->adjvex] = 1;
                printf("%d", p->adjvex);
                q.push(p->adjvex);
            }
    }
}

void BfsTraverse(LinkedGraph g){
    for(int i = 0; i < g.n; i++)  visited[i] = 0;
    for(int i = 0; i < g.n; i++)
       if(!visited[i])  bfs(g, i);
}

int main(){
    LinkedGraph g;

    creat(&g);
    printf("The graph is:\n");
    print(g);
    printf("\n");

    DfsTraverse(g);
    printf("\n");

    BfsTraverse(g);
    printf("\n");

    return 0;
}

数据文件
file
输出结果
graph

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值