C语言邻接表、邻接矩阵的BFS/DFS方法实现

引入

看了一下,在网上似乎很少有邻接表和邻接矩阵的简单可行的BFS/DFS方法进行实现,于是我就把我的代码贴上来供大家参考好了。

C语言邻接表的BFS/DFS方法实现:

#include <stdio.h>
#include "stdlib.h"

#define VNum 100
int visited[VNum] = {0};
int visited2[VNum]={0};
typedef struct ArcNode {
    int adjvex;
    struct ArcNode *nextarc;
} ArcNode;//定义边结点
typedef struct VertexNode {
    char data;
    struct ArcNode *firstarc;
} VNode, AdjList[VNum];//定义头结点
typedef struct {
    AdjList vexs;
    int vnum, arcnum;
} ALGraph;//定义邻接表
ALGraph createALGraph() {
    ALGraph G;
    int v, e, k1, k2;
    char a, b;
    ArcNode *p1, *p2;
    printf("请输入无向图的顶点数和边数:\n");
    scanf("%d %d", &G.vnum, &G.arcnum);
    getchar();
    for (int i = 0; i < G.vnum; i++) {
        printf("请输入顶点%d的值:\n", i + 1);
        scanf("%c", &G.vexs[i].data);
        getchar();
        G.vexs[i].firstarc = NULL;
    }//初始化头结点
    for (int j = 0; j < G.arcnum; j++) {
        printf("请输入无向图第%d条边的两端结点:\n", j + 1);
        scanf("%c,%c", &a, &b);
        getchar();
        p1 = (ArcNode *) malloc(sizeof(ArcNode));
        p1->adjvex = b - 'A';
        p2 = (ArcNode *) malloc(sizeof(ArcNode));
        p2->adjvex = a - 'A';
        k1 = a - 'A';
        k2 = b - 'A';
        p1->nextarc = G.vexs[k1].firstarc;
        G.vexs[k1].firstarc = p1;
        p2->nextarc = G.vexs[k2].firstarc;
        G.vexs[k2].firstarc = p2;
    }//初始化边结点
    return G;
}

void Print(ALGraph G) {
    for (int i = 0; i < G.vnum; i++) {
        ArcNode *node = G.vexs[i].firstarc;
        printf("%c ->", G.vexs[i].data);
        while (node != NULL) {
            printf("%5c|", G.vexs[node->adjvex].data);
            node = node->nextarc;
        }
        printf("\n");
    }
}

void DFS(ALGraph G, VNode n) {

    printf("%5c", n.data);
    visited[n.data - 'A'] = 1;
    for (ArcNode *node = n.firstarc; node != NULL; node = node->nextarc) {
        if (visited[node->adjvex] == 0)
            DFS(G, G.vexs[node->adjvex]);
    }
}

void BFS(ALGraph G, VNode n) {
    VNode queue[G.vnum];
    ArcNode *temp;
    int front = 0, rear = 0;
    printf("\n接下来是BFS算法:\n");
    printf("%5c", n.data);
    visited2[n.data - 'A'] = 1;//设置已访问标签
    queue[rear] = n;//结点入队
    rear = (rear + 1) % G.vnum;
    while (((rear + 1) % G.vnum) != front) {
        temp = queue[front].firstarc;//出队
        front = (front + 1) % G.vnum;
        for (temp; temp != NULL; temp = temp->nextarc) {
            if (!visited2[temp->adjvex]) {
                printf("%5c", G.vexs[temp->adjvex].data);//进行访问并且输出
                visited2[temp->adjvex] = 1;//设置访问过标记
                queue[rear] = G.vexs[temp->adjvex];//入队
                rear=(rear+1)%G.vnum;
            }
        }
    }//当队不为空



}

int main() {
    ALGraph G;
    G = createALGraph();
    Print(G);
    printf("\n接下来是DFS遍历:\n");
    DFS(G, G.vexs[0]);
    printf("\n");
    BFS(G,G.vexs[1]);

}

邻接矩阵的BFS/DFS实现及结构体的定义:

#include <stdio.h>
#define VNum 100
int visited[VNum]={0};
int BFSVisited[VNum]={0};
typedef struct {
    char vexs[VNum];
    int edges[VNum][VNum];
    int v, e;
}Graph,AMGraph;
void Create2(Graph *G){
    int v, e;
    char a, b;
    printf("请输入图的边数和顶点数:\n");
    scanf("%d %d", &e, &v);
    getchar();
    G->v = v;
    G->e = e;
    for (int i = 0; i < G->v; i++) {
        printf("请输入顶点%d的值:\n", i + 1);
        scanf("%c", &G->vexs[i]);
        getchar();
    }
    for (int i = 0; i < G->e; i++) {
        printf("请输入第%d条边的两边顶点:\n", i + 1);
        scanf("%c,%c", &a, &b);
        getchar();
        G->edges[a - 'A'][b - 'A'] = 1;
        G->edges[b - 'A'][a - 'A'] = 1;
    }
    printf("初始化完成!\n");
    for (int i = 0; i < G->v; i++) {
        for (int j = 0; j < G->v; j++) {
            printf("%d ", G->edges[i][j]);
        }
        printf("\n");
    }
}
AMGraph createAMGraph() {
    AMGraph G;
    int v, e;
    char a, b;
    printf("请输入图的边数和顶点数:\n");
    scanf("%d %d", &e, &v);
    getchar();
    G.v = v;
    G.e = e;
    for (int i = 0; i < G.v; i++) {
        printf("请输入顶点%d的值:\n", i + 1);
        scanf("%c", &G.vexs[i]);
        getchar();
    }
    for (int i = 0; i < G.e; i++) {
        printf("请输入第%d条边的两边顶点:\n", i + 1);
        scanf("%c,%c", &a, &b);
        getchar();
        G.edges[a - 'A'][b - 'A'] = 1;
        G.edges[b - 'A'][a - 'A'] = 1;
    }
    printf("初始化完成!\n");
    for (int i = 0; i < G.v; i++) {
        for (int j = 0; j < G.v; j++) {
            printf("%d ", G.edges[i][j]);
        }
        printf("\n");
    }
    return G;
}
void DFS(AMGraph G,int v){
    printf("%5c",G.vexs[v]);
    visited[v]=1;
    for(int i=0;i<G.v;i++){
        if((G.edges[v][i]==1)&&(!visited[i]))
            DFS(G,i);
    }
}
void BFS(AMGraph G,int v){
    printf("\n接下来是BFS算法:\n");
    int queue[G.v],temp;//初始化队列queue用数组表示
    int front = 0, rear = 0;//初始化队列指针
    printf("%3c",G.vexs[v]);
    BFSVisited[v]=1;
    queue[rear]=v;//入队
    rear=(rear+1)%G.v;//入队
    while (((rear + 1) % G.v) != front){
        temp=queue[front];//出队
        front=(front+1)%G.v;
        for(int i=0;i<G.v;i++){
            if((G.edges[temp][i]!=0)&&!(BFSVisited[i])){
                printf("%3c",G.vexs[i]);
                BFSVisited[i]=1;
                queue[rear]=i;
                rear=(rear+1)%G.v;
            }//存在边并且后面这个节点没有被访问过则进行访问并入队
        }
    }
}
int main() {
    Graph G;
    AMGraph G1;
   	Create2(&G);
   	char temp;
    printf("请输入您要开始进行DFS的顶点:");
    scanf("%c",&temp);
    DFS(G,temp-'A');
    BFS(G,temp-'A');
    return 0;
}

保存一下,当个纪念吧~

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

weixin_45230280

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值