图的广度优先遍历与深度优先遍历(C语言)

news2024/11/17 16:33:58

 这是结果

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

#define _CRT_SECURE_NO_WARNINGS

// 定义边表结点结构
typedef struct EdgeNode {
    int adjvex;  // 邻接顶点域,存储该边所指向的顶点
    struct EdgeNode* next;  // 指向下一条边的指针
} EdgeNode;

// 定义顶点表结点结构
typedef struct VertexNode {
    int data;  // 顶点域,存储顶点信息
    EdgeNode* firstEdge;  // 指向邻接表的第一个边表结点
} VertexNode;

// 定义图结构
typedef struct {
    VertexNode adjList[100];  // 顶点数组
    int numVertices, numEdges;  // 顶点数和边数
} GraphAdjList;



// 队列结构,用于广度优先遍历
typedef struct {
    int data[100];  // 存储顶点索引
    int front, rear;
} Queue;

// 初始化队列
void initQueue(Queue* q) {
    q->front = q->rear = 0;
}

// 判断队列是否为空
bool isEmpty(Queue* q) {
    return q->front == q->rear;
}

// 入队
void enqueue(Queue* q, int vertex) {
    q->data[q->rear++] = vertex;
}

// 出队
int dequeue(Queue* q) {
    return q->data[q->front++];
}

// 广度优先遍历(BFS)
void BFS(GraphAdjList G, int startVertex) {
    bool visited[100] = { false };  // 访问标记数组
    Queue q;
    initQueue(&q);  // 初始化队列

    printf("BFS Traversal: ");

    visited[startVertex] = true;  // 标记起始顶点已访问
    printf("%d ", G.adjList[startVertex].data);
    enqueue(&q, startVertex);  // 起始顶点入队

    while (!isEmpty(&q)) {
        int v = dequeue(&q);  // 出队当前顶点
        EdgeNode* e = G.adjList[v].firstEdge;  // 获取该顶点的邻接表

        // 遍历所有邻接节点
        while (e) {
            if (!visited[e->adjvex]) {  // 如果邻接顶点未被访问
                printf("%d ", G.adjList[e->adjvex].data);
                visited[e->adjvex] = true;  // 标记已访问
                enqueue(&q, e->adjvex);  // 邻接顶点入队
            }
            e = e->next;
        }
    }

    printf("\n");
}

// 深度优先遍历的递归函数
void DFSUtil(GraphAdjList G, int v, bool visited[]) {
    visited[v] = true;  // 标记该顶点已访问
    printf("%d ", G.adjList[v].data);  // 输出顶点

    EdgeNode* e = G.adjList[v].firstEdge;  // 获取该顶点的邻接表

    // 遍历所有邻接节点
    while (e) {
        if (!visited[e->adjvex]) {  // 如果邻接顶点未被访问
            DFSUtil(G, e->adjvex, visited);  // 递归访问邻接顶点
        }
        e = e->next;
    }
}

// 深度优先遍历(DFS)
void DFS(GraphAdjList G, int startVertex) {
    bool visited[100] = { false };  // 访问标记数组
    printf("DFS Traversal: ");
    DFSUtil(G, startVertex, visited);  // 从起始顶点开始递归遍历
    printf("\n");
}

// 创建图
void createGraph(GraphAdjList* G) {
    int i, j, k;
    EdgeNode* e;

    // 输入顶点数和边数
    printf("输入顶点数和边数: ");
    scanf_s("%d %d", &G->numVertices, &G->numEdges);

    // 输入顶点信息
    for (i = 0; i < G->numVertices; i++) {
        printf("输入顶点 %d 的信息: ", i + 1);
        scanf_s("%d", &G->adjList[i].data);
        G->adjList[i].firstEdge = NULL;  // 初始化顶点的边表指针为空
    }

    // 输入边信息,构建邻接表
    for (k = 0; k < G->numEdges; k++) {
        printf("输入边 (vi, vj) 的顶点下标 i 和 j: ");
        scanf_s("%d %d", &i, &j);

        // 头插法插入结点 (vi -> vj)
        e = (EdgeNode*)malloc(sizeof(EdgeNode));  // 创建边结点
        e->adjvex = j;  // 邻接顶点为 j
        e->next = G->adjList[i].firstEdge;  // 将新结点插入顶点 i 的边表
        G->adjList[i].firstEdge = e;

        // 无向图需要插入另一条边 (vj -> vi)
        e = (EdgeNode*)malloc(sizeof(EdgeNode));  // 创建边结点
        e->adjvex = i;  // 邻接顶点为 i
        e->next = G->adjList[j].firstEdge;  // 将新结点插入顶点 j 的边表
        G->adjList[j].firstEdge = e;
    }
}
int main() {
    GraphAdjList G;

    // 创建图 (这里假设图的输入方式与之前一致)
    createGraph(&G);  // 根据你的图结构输入顶点和边的信息

    // 执行广度优先遍历,从顶点 0 开始
    BFS(G, 0);

    // 执行深度优先遍历,从顶点 0 开始
    DFS(G, 0);

    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2119724.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Oracle Linux 8.10安装Oracle19c(19.3.0)完整教程

安装前请仔细将文档通读一遍&#xff0c;安装过程中根据安装命令仔细核对&#xff0c;特别留意一些字体加粗或标红的字样&#xff0c;遇到问题请及时咨询公司 1、基础环境 1.1、操作系统 cat /etc/redhat-release 1.2、主机名 医院默认分配的主机名可能跟其他主机会有重复&a…

【阿里云】10分钟在网站上增加一个AI助手

文章目录 方案预览1. 创建大模型问答应用1.1 创建应用1.2 获取调用 API 所需的凭证 2. 搭建示例网站2.1 创建应用2.2 访问网站 3. 为网站增加 AI 助手3.1 增加 AI 助手相关代码3.2 验证网站上的 AI 助手 4. 为 AI 助手增加私有知识4.1 配置知识库 总结应用于生产环境前端代码服…

mysql使用笔记

1、下载mysql,本教程适用于免安装版。 https://dev.mysql.com/downloads/mysql/ 当前最新版本是8.0.27,如果想安装其他版本,选择Achives. 下载后减压到要放置的目录中。 E:\mysql-5.7.35-winx64 这是我的路径,在根目录下建立一个my.ini 文件,用来放置配置信息,保存的时候…

猫咪浮毛有这么严重?你不知道的浮毛清理好物——宠物空气净化器

家人们谁懂啊&#xff0c;男朋友整天和我家猫争宠&#xff0c;最近还上升到了有猫没他的地步。猫咪刚开始接回来的时候压根不掉毛&#xff0c;他们相处的特别好&#xff0c;呆在一起玩的时间比我还多。可是这样温馨的相处没持续多久就变了&#xff0c;之前不掉毛都是猫咪的假象…

MIST:用于组织病理学亚型预测的多实例选择性Transformer|文献速递--基于深度学习的医学影像病灶分割

Title 题目 MIST: Multi-instance selective transformer for histopathological subtype prediction MIST&#xff1a;用于组织病理学亚型预测的多实例选择性Transformer 01 文献速递介绍 组织病理学亚型预测在癌症疾病的诊断和治疗中具有重要的临床意义。组织病理学亚型…

反序列化漏洞练习1

根据代码可以看出来sis类只是接收了参数cmd&#xff0c;下边是通过get获得cmd的值&#xff0c;所以可以在序列化过程中直接为cmd赋值。 根据源码编写序列化代码 <?php class sis{public $cmdsystem("whoami");?>;public function __wakeup(){eval($this-&g…

记录深度学习量化操作

0. 简介 深度学习中做量化提升运行速度是最常用的方法&#xff0c;尤其是大模型这类非常吃GPU显存的方法。一般是高精度浮点数表示的网络权值以及激活值用低精度&#xff08;例如8比特定点&#xff09;来近似表示达到模型轻量化&#xff0c;加速深度学习模型推理&#xff0c;目…

选择网站服务器有哪几种类型?

许多用户往往对服务器托管、服务器租用、独享带宽、VPS租用、虚拟主机、云服务器等概念没有很知道&#xff0c;记不清怎样挑选IDC业务&#xff0c;有的一味的认为质量&#xff0c;挑选了费用较高的套餐&#xff0c;但是却浪费资源&#xff0c;没有必要&#xff0c;也有一些用户…

【鸿蒙 HarmonyOS NEXT】使用EventHub进行数据通信

✨本人自己开发的开源项目&#xff1a;土拨鼠充电系统 ✨踩坑不易&#xff0c;还希望各位大佬支持一下&#xff0c;在GitHub给我点个 Start ⭐⭐&#x1f44d;&#x1f44d; ✍GitHub开源项目地址&#x1f449;&#xff1a;https://github.com/cheinlu/groundhog-charging-syst…

【回收站选址】

题目 代码 #include <bits/stdc.h> using namespace std; const int R 2e91; typedef long long LL; unordered_set<LL> s; int piles[5]; int dx[4] {-1, 0, 1, 0}, dy[4] {0, 1, 0, -1}; int dx1[4] {-1, -1, 1, 1}, dy1[4] {-1, 1, -1, 1};bool check(LL …

找不到ucrtbased.dll无法继续执行代码怎么办,总结5个方法

当计算机系统提示找不到ucrtbased.dll文件时&#xff0c;可能会引发一系列运行问题和故障现象。首先&#xff0c;我们需要了解ucrtbased.dll究竟是什么以及它在操作系统中扮演的角色。ucrtbased.dll是一个动态链接库&#xff08;DLL&#xff09;文件&#xff0c;它是Microsoft …

树莓派通过串口驱动HC-08蓝牙模块

树莓派通过串口驱动HC-08蓝牙模块 文章目录 树莓派通过串口驱动HC-08蓝牙模块一、HC-08蓝牙模块介绍二、树莓派与蓝牙模块硬件连接三、树莓派通过蓝牙控制设备 一、HC-08蓝牙模块介绍 蓝牙模块&#xff0c;是一种集成的蓝牙功能的PCB板&#xff0c;用于短距离无线通信&#xff…

小而强大!零一万物 Yi-Coder 模型震撼发布!

前沿科技速递&#x1f680; 在 AI 迅速发展的今天&#xff0c;代码生成和编辑工具已经成为开发者们追求高效开发的重要利器。近日&#xff0c;零一万物正式开源了 Yi-Coder 系列模型&#xff0c;一个专为编程任务设计的强大工具&#xff0c;为开发者们带来了全新的生产力提升方…

记录|C#的软件图标更换

目录 前言一、软件界面的图标二、软件外的图标更新时间 前言 参考文章&#xff1a; 自己开发出的软件&#xff0c;肯定要更换图标&#xff0c;无论是软件打开前还是软件上的。如下图&#xff1a; 一、软件界面的图标 直接在Form的属性中进行icon的更换【如下图&#xff1a;】…

2024年8款好用的图纸加密软件推荐|有效的图纸加密方法分享

在如今信息化迅速发展的时代&#xff0c;图纸作为企业的核心资产之一&#xff0c;特别是工程、制造、建筑等领域的CAD图纸&#xff0c;一旦泄露可能给企业带来巨大的经济损失和竞争风险。因此&#xff0c;如何有效地保护图纸安全&#xff0c;防止泄密&#xff0c;成为了每个企业…

记录:uniapp直播的弹幕的样式修改与发送弹幕会自动滚动到底部两个技巧

1、在直播页面的弹幕评论中&#xff0c;我们希望的样式是&#xff1a; 观众名字&#xff1a;评论 而且颜色有所区分&#xff0c;并在同一行显示 2、我们希望在发弹幕的时候可以回自动滚动到自己发的内容那里 一&#xff1a;弹幕样式修改 因为是小白&#xff0c;前端对于样式这…

Machine Learning Specialization 学习笔记(1)

文章目录 前言一、监督学习二、无监督学习三、一些基本概念线性回归模型简单线性回归多元线性回归模型训练模型评估应用 损失函数 &#xff08;cost function&#xff09;梯度下降 &#xff08;gradient descent&#xff09;多类特征&#xff08;multiple features&#xff09;…

微积分复习笔记 Calculus Volume 1 - 1.5 Exponential and Logarithmic Functions

1.5 Exponential and Logarithmic Functions - Calculus Volume 1 | OpenStax

JavaScript(进阶篇)

&#x1f30f;个人博客主页&#xff1a;心.c 前言&#xff1a;今天讲解的是JavaScript进阶&#xff0c;希望大家可以有所收获&#xff0c;话不多说&#xff0c;开干&#xff01; &#x1f525;&#x1f525;&#x1f525;文章专题&#xff1a;JavaScript &#x1f63d;感谢大家…

Numba坐标索引(CPU + 多线程)

文章目录 一、测试样本 —— 创建样本mask&#xff0c;具有 N 个唯一像素值&#xff0c;每个值有 M 个坐标。二、加速方法&#xff08;1&#xff09;多线程加速 —— 每次提取一个像素值&#xff0c;然后遍历图像&#xff0c;匹配并判断其与初始化坐标的关系。&#xff08;2&am…