BFS DFS

#define _CRT_SECURE_NO_WARNINGS
#include <stdlib.h>
#include<stdio.h>
#define MAXSIZE 5 
//图的邻接矩阵(Adjacency Matrix) 存储方式是用两个数组来表示图。
// 一个一维数组存储图中顶点信息,一个二维数组(称为邻接矩阵)存储图中的边或弧的信息。
//typedef struct Graph {
//    char* vexs;//顶点表 vertex
//    int** arcs;//二级指针  相当于二维数组-->邻接矩阵
//    int vexNum;//图当顶点数
//    int arcNum;//图当前边数
//}Graph;

typedef struct Graph {
    char* vexs;
    int** arcs;
    int vexNum;
    int arcNum;
}Graph;

typedef struct Queue {
    int front;
    int rear;
    int data[MAXSIZE];
}Queue;

Queue* initQueue() {
    Queue* Q = (Queue*)malloc(sizeof(Queue));
    Q->front = Q->rear = 0;
    return Q;
}

int isFull(Queue* Q) {
    if ((Q->rear + 1) % MAXSIZE == Q->front) {
        return 1;
    }
    else {
        return 0;
    }
}

int isEmpty(Queue* Q) {
    if (Q->front == Q->rear) {
        return 1;
    }
    else {
        return 0;
    }
}

int enQueue(Queue* Q, int data) {
    if (isFull(Q)) {
        return 0;
    }
    else {
        Q->data[Q->rear] = data;
        Q->rear = (Q->rear + 1) % MAXSIZE;
        return 1;
    }
}

int deQueue(Queue* Q) {
    if (isEmpty(Q)) {
        return -1;
    }
    else {
        int data = Q->data[Q->front];
        Q->front = (Q->front + 1) % MAXSIZE;
        return data;
    }
}

Graph* initGraph(int vexNum) {
    Graph* G = (Graph*)malloc(sizeof(Graph));
    G->vexs = (char*)malloc(sizeof(char)*vexNum);
    G->arcs = (int**)malloc(sizeof(int*) * vexNum);//分配行指针的 这是二级指针 指向一级指针
    for (int i = 0;  i<vexNum;i ++)
    {
        G->arcs[i] = (int*)malloc(sizeof(int) * vexNum);//分配一级指针的 这里的指针指向邻接矩阵 每一行的元素
    }
    G->vexNum = vexNum;
    G->arcNum = 0;//最开始没有边
    return G;
}
//初始化函数    传入 图 顶点 边
void createGraph(Graph* G, char* vexs, int* arcs){
    for (int i = 0; i < G->vexNum; i++) {
        G->vexs[i] = vexs[i];//传入顶点表到结构体中
        for (int j = 0; j < G->vexNum; j++) {
            G->arcs[i][j] = *(arcs + i * G->vexNum + j);
            //这里相当于把二维数组arcs一维化, i * G->vexNum 相当于跳过前面i行  j时第i+1行的偏移量
            if (G->arcs[i][j] != 0)
                G->arcNum++;
        }
    }
    G->arcNum /= 2;//无向图 算以此
}

//图的遍历
//BFS 
// 和二叉树的层次遍历相似
// 
// 
// 
//DFS深度优先遍历 
//一条路走到黑,不到南墙不回头 撞墙之火再回头 回头之后再撞墙
//1.找一个节点访问
//2.找这个节点可以访问的节点
//3.重复第一步,直到所有节点访问完毕
void DFS(Graph* G,int* visited ,int index)//传入一个图 一个数组标识是否访问 传入一个索引
{
    printf("%c\t",G->vexs[index]);
    visited[index] = 1;//访问完标记一下
    for (int i = 0; i < G->vexNum; i++)
    {
        if (G->arcs[index][i] == 1 && !visited[i]) {
            DFS(G, visited, i);
        }
    }
}

void BFS(Graph* G, int* visited, int index) {
    Queue* Q = initQueue();
    printf("%c\t", G -> vexs[index]);
    visited[index] = 1;
    enQueue(Q, index);
    while (!isEmpty(Q)) {
        int i = deQueue(Q);
        for (int j = 0; j < G -> vexNum; j++) {
            if (G -> arcs[i][j] == 1 && !visited[j]) {
                printf("%c\t", G -> vexs[j]);
                visited[j] = 1;
                enQueue(Q, j);
            }
        }
    }
}
int main()
{
    Graph* G = initGraph(5);
    int* visited = (int*)malloc(sizeof(int) * G->vexNum);
    for (int i = 0; i < G->vexNum; i++)
        visited[i] = 0;
    int arcs[5][5] = {
    0,1,1,1,0,
    1,0,1,1,1,
    1,1,0,0,0,
    1,1,0,0,1,
    0,1,0,1,0
    };
    createGraph(G,"ABCDE",(int*)arcs);
    DFS(G, visited, 0);
    printf("\n");
    for (int i = 0; i < G->vexNum; i++)
        visited[i] = 0;
    BFS(G, visited, 0);
    printf("\n");
    return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值