首页 > 其他分享 >C语言 图的遍历(广度优先和深度优先、邻接矩阵)

C语言 图的遍历(广度优先和深度优先、邻接矩阵)

时间:2022-12-11 15:34:33浏览次数:57  
标签:优先 int VertexNum MG 邻接矩阵 C语言 queue printf

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
/*--------辅助广度优先遍历用的空闲单元法循环队列-----------*/
#define MaxQueuenNum 20
typedef struct queue
{
    int* array;
    int front;
    int rear;
}Queue;
/*---------------------------------------------------------*/

/*-----------------邻接矩阵的结构体类型--------------------*/
typedef char VextexType;
typedef int EdgeType;
#define MaxNum 15    //邻接矩阵的最大顶点数

typedef struct adjacency_matrix
{
    VextexType MGVexTexArray[MaxNum]; //顶点表
    EdgeType Edge[MaxNum][MaxNum];
    int VertexNum, EdgeNum;    //顶点数和边数
}MGraph;
/*---------------------------------------------------------*/


/*邻接矩阵的创建*/
void Creat_Adjacency_Matrix(MGraph* MG)
{
    int i, j, x, y;
    //先输入顶点数和边数
    printf("输入邻接矩阵的顶点数和边数:");
    scanf_s("%d %d", &MG->VertexNum, &MG->EdgeNum);
    //初始化顶点表
    printf("输入邻接矩阵各个顶点的信息:");
    for (i = 0; i < MG->VertexNum; i++)
    {
        getchar();
        scanf_s("%c", &MG->MGVexTexArray[i]);
    }
    //初始化边表
    for (x = 0; x < MG->VertexNum; x++)
    {
        for (y = 0; y < MG->VertexNum; y++)
        {
            MG->Edge[x][y] = 0;
            //初始化边表的各项为0,表示两者还没有直达的边
        }
    }
    //开始构造邻接矩阵
    for (j = 0; j < MG->EdgeNum; j++)
    {
        printf("请输入边两个顶点的下标:");
        scanf_s("%d %d", &x, &y);
        MG->Edge[x][y] = 1;
        //由于无向网和无向图是对称的所以
        MG->Edge[y][x] = MG->Edge[x][y];
    }

    printf("\n临接矩阵输出如下:\n");
    for (x = 0; x < MG->VertexNum; x++)
    {
        for (y = 0; y < MG->VertexNum; y++)
        {
            printf("%d ", MG->Edge[x][y]);
        }
        printf("\n");
    }
}

int visited[20];//全局变量标记数组,用于记录顶点有没有被访问过,访问过记为1反之为0
                //由于C没有bool或者boolean,所以用0表示False,1表示True
//深度优先算法遍历邻接矩阵
void DFS_MG(MGraph* MG, int i)
{
    int k;
    visited[i] = 1;
    printf("%c ", MG->MGVexTexArray[i]);
    for (k = 0; k < MG->VertexNum; k++)
    {
        if (MG->Edge[i][k] == 1 && !visited[k])
        {
            DFS_MG(MG, k);
        }
    }
}
void DFS_Traverse_MG(MGraph* MG)
{
    int i;
    //初始化标志数组
    for (i = 0; i < MG->VertexNum; i++)
    {
        visited[i] = 0;
    }
    //开始深度优先遍历
    for (i = 0; i < MG->VertexNum; i++)
    {
        if (!visited[i])
        {
            DFS_MG(MG, i);
        }
    }
}

//空闲单元法创建循环队列
void CreatQueue(Queue* queue)
{
    queue->array = (int*)malloc(sizeof(int) * MaxQueuenNum);
    queue->front = 0;
    queue->rear = 0;
}
//入队
void EnQueue(Queue* queue, int EnElem)
{
    if ((queue->rear + 1) % MaxQueuenNum == queue->front)
    {
        printf("无法入队,队列满");
        return;
    }
    queue->array[queue->rear] = EnElem;
    queue->rear = (queue->rear + 1) % MaxQueuenNum;
}
//出队
int DeQueue(Queue* queue)
{
    int temp;
    if (queue->rear == queue->front)
    {
        printf("队列为空,没有元素可以出队");
        return 0;
    }
    temp = queue->array[queue->front];
    queue->front = (queue->front + 1) % MaxQueuenNum;
    return temp;
}
//判断队列是否为空,空就赋1表示为空,反之为0
int Queue_isEmpty(Queue* queue)
{
    if (queue->rear == queue->front)
    {
        return 1;
    }
    return 0;
}
//广度优先算法遍历邻接矩阵
void BFS_Traverse_MG(MGraph* MG)
{
    int i, j;
    Queue q;
    CreatQueue(&q);
    //初始化标志数组
    for (i = 0; i < MG->VertexNum; i++)
        visited[i] = 0;
    //开始构建广度优先算法遍历
    for (i = 0; i < MG->VertexNum; i++)//若是连通图只执行一次即可遍历完
    {
        if (!visited[i])
        {
            EnQueue(&q, i);
            visited[i] = 1;
            while (!Queue_isEmpty(&q))  //队不为空 
            {
                i = DeQueue(&q);
                printf("%c ", MG->MGVexTexArray[i]);
                for (j = 0; j < MG->VertexNum; j++)
                {
                    if (!visited[j] && MG->Edge[i][j] == 1)
                    {
                        visited[j] = 1;
                        EnQueue(&q, j);
                    }
                }
            }
        }
    }
}

int main()
{
    int i;
    MGraph* MG = (MGraph*)malloc(sizeof(MGraph));
    printf("-----输入每个数都是用空格隔开------\n");
    Creat_Adjacency_Matrix(MG);

    printf("--------------------------------------------\n");
    printf("\n邻接矩阵的深度遍历:");
    DFS_Traverse_MG(MG);
    printf("\n");

    printf("邻接矩阵的广度遍历:");
    BFS_Traverse_MG(MG);
    printf("\n");

    printf("\n--------------------------------------------\n");
    printf("\n");
    free(MG);

    system("pause");
    return 0;
}

标签:优先,int,VertexNum,MG,邻接矩阵,C语言,queue,printf
From: https://www.cnblogs.com/smartlearn/p/16973733.html

相关文章

  • C语言分支语句和循环语句
    一、分支语句1.if语句//用法if(表达式){语句}()中的表达式为真,执行语句,如果只有1条语句,可以不加{}。 2.if-else语句//用法if(表达式){语句1}else{语句2}()中表达式......
  • C语言--函数
    什么是函数?函数是一组一起执行一个任务的语句。每个C程序都至少有一个函数,即主函数 main()。函数声明:告诉编译器函数的名称、返回类型和参数函数定义:提供了函数的实......
  • c语言表达式求值和操作符属性
    一、表达式求值表达式求值顺序一部分是由操作符的优先级和结合性决定。同样,有些表达式的操作数在求值的过程中可能需要转化为其他类型1.隐式类型转换表达式中的字符和短整型......
  • 初识C语言(4)
    指针初步应用intmain(){inta=10;//向内存申请了4个字节空间,a是变量,类型是int&a;printf("%p\n",&a);//地址是存在的int*p=&a;//p是指针变量,类型是(*),int*也说......
  • 【C语言】指针运算、指针+-整数、指针-指针、指针的关系运算、标准关系、标准规定、指
    ......
  • 从 695. 岛屿的最大面积 入手深度优先搜素DFS
    一、什么是深度优先遍历(DFS)以“深度”为第一关键词,每次都沿路径到不能再前进时,才退回到最近的岔路口,然后继续按同样的逻辑搜索。 二、题目与解答题目: Leetcode695.......
  • C语言操作符
    C语言的操作符分为:算术操作符、移位操作符、位操作符、赋值操作符、单目操作符、关系操作符、逻辑操作符、条件操作符、逗号操作符、下标引用,函数调用和结构成员。 ​一、......
  • c语言获取系统时间跨平台方法及计算程序运行时间
    voidgetCurrentDateTime(char*current_datetime){time_tnowtime;structtm*timeinfo;time(&nowtime);timeinfo=localtime(&nowtime);intxtn=t......
  • 一个递归的bug(深度优先)
    一.前情回顾1.题目介绍与正确源码二.问题分析1.答辩的时候,发现代码异常,代码有两点错误:1.1递归出口有问题。1.2结果出来的时候没有结束递归。三.错误源码四.错误结......
  • 初识C语言(3)
    练习:求两个数中的较大值intmain(){intmax(intx,inty);inta=0;intb=0;intc=0;scanf("%d%d",&a,&b);c=max(a,b);printf("max=%d\n",c);retu......