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

 这是结果

#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;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

LLM 大模型产品经理学习指南:【2024 全新版】极致详细,一篇搞定!

前言 随着人工智能技术的蓬勃发展&#xff0c;尤其是大模型&#xff08;Large Model&#xff09;的强势兴起&#xff0c;越来越多的企业对这一领域愈发重视并加大投入。作为大模型产品经理&#xff0c;需具备一系列跨学科的知识与技能&#xff0c;方能有效地推动产品的开发、优…

六西格玛质量管理:让质量成为竞争的关键-优思学院

前言&#xff1a;六西格玛的传奇之路 提起质量管理&#xff0c;六西格玛无疑是绕不开的一个话题。从摩托罗拉到通用电气&#xff0c;从制造业到服务业&#xff0c;六西格玛质量管理的方法已经走遍全球&#xff0c;成为许多企业成功的关键。无论是提高产品质量、减少浪费&#…

DevC++编译及使用Opencv

1.依赖 需要如下依赖&#xff1a; DevC11Opencv4.10.0CMake.exe 整个安装过程参考下面的文章&#xff1a;https://blog.csdn.net/weixin_41673576/article/details/108519841 这里总结一下遇到的问题。 2.问题 2.1 DevC安装路径 一定不要有空格&#xff01;&#xff01;否则…

kubectl的安装使用

1. Windows下载kubectl 2.将kucectl的所在目录添加到PATH环境变量下 3.运行 kubectl version --client 命令来测试kubectl是否正确安装并显示其版本信息。这个命令会显示kubectl客户端的版本信息&#xff0c;如果一切正常&#xff0c;这将确认kubectl已经成功安装在你的Windo…

Git 学习与使用

0 认识⼯作区、暂存区、版本库 ⼯作区&#xff1a;是在电脑上你要写代码或⽂件的⽬录。 暂存区&#xff1a;英⽂叫stage或index。⼀般存放在.git ⽬录下的index⽂件&#xff08;.git/index&#xff09;中&#xff0c;我们 把暂存区有时也叫作索引&#xff08;index&#xff09;…

UDS 诊断 - ReadDTCInformation(读取 DTC 信息)(0x19)服务(2) - 请求消息

UDS 诊断服务系列文章目录 诊断和通信管理功能单元 UDS 诊断 - DiagnosticSessionControl&#xff08;诊断会话控制&#xff09;&#xff08;0x10&#xff09;服务 UDS 诊断 - ECUReset&#xff08;ECU重置&#xff09;&#xff08;0x11&#xff09;服务 UDS 诊断 - SecurityA…

怎么样处理浮毛快捷又高效?霍尼韦尔、希喂、米家宠物空气净化器实测对比

掉毛多&#xff1f;掉毛快&#xff1f;猫毛满天飞对身体有危害吗&#xff1f;多猫家庭经验分享篇&#xff1a; 一个很有趣的现象&#xff0c;很多人在养猫、养狗后耐心都变得更好了。养狗每天得遛&#xff0c;养猫出门前得除毛&#xff0c;日复一日的重复磨练了极好的耐心。我家…

SprinBoot+Vue学生信息管理系统的设计与实现

目录 1 项目介绍2 项目截图3 核心代码3.1 Controller3.2 Service3.3 Dao3.4 application.yml3.5 SpringbootApplication3.5 Vue 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍&#xff1a;CSDN认证博客专家&#xff0c;CSDN平台Java领域优质…

CSP-CCF★★201809-2买菜★★

目录 一、问题描述 二、解答&#xff1a; 三、总结 一、问题描述 问题描述 小H和小W来到了一条街上&#xff0c;两人分开买菜&#xff0c;他们买菜的过程可以描述为&#xff0c;去店里买一些菜然后去旁边的一个广场把菜装上车&#xff0c;两人都要买n种菜&#xff0c;所以也…

C 408—《数据结构》算法题基础篇—链表(上)

目录 Δ前言 一、链表中特定值结点的删除 0.题目&#xff1a; 1.算法设计思想&#xff1a; 2.C语言描述&#xff1a; 3.算法的时间和空间复杂度&#xff1a; 二、链表链表最小值结点的删除 0.题目 : 1.算法设计思想 : 2.C语言描述 : 3.算法的时间和空间复杂度 : 三、链…

【前端】探索webpack3项目build速度优化, 优化个p

文章目录 背景uglifyjs-webpack-pluginwebpack3 压缩混淆js 优化踩坑。结论 背景 webpack3 babel7 uglifyjs-webpack-plugin的项目&#xff0c;build起来是什么体验。 大抵是写了两个月后&#xff0c;发现build时间从120s激增到400s。而这400秒中&#xff0c;有50多秒是Ugli…

如何看待IBM中国研发部裁员?三个方向快速解析

如何看待IBM中国研发部裁员&#xff1f; 近日&#xff0c;有媒体从IBM中国方面确认&#xff0c;IBM将彻底关闭中国研发部门&#xff0c;涉及员工数量超过1000人。 3分钟裁员上千人&#xff01; IBM中国宣布撤出在华两大研发中心&#xff0c;引发了IT行业对于跨国公司在华研发战…

ubuntu16.04下qt5.7.1添加对openssl的支持

文章目录 前言一、编译安装openssl二、编译qt5.7.1三、配置qtcreator开发环境四、demo 前言 最近工作中要求客户端和服务端通过ssl加密通信,其中客户端是qt编程,服务端是linux编程.我的开发环境是ubuntu16.04;运行环境是debian9.13,是基于gnu的linux操作系统,64位arm架构. 一…

C++_17_友元

友元 > 友元 友元 是单向的 甲和乙 甲说 他是乙朋友 乙有可能不承认 所以 是单向的 > 只要是 友元 就可以访问他私有的东西 所以 友元会破坏 封装性作用&#xff1a;可以访问友元 的私有成员 特点&#xff1a; 单项性不能被传递不能被继承 关键字&#xff1a…

OpenCV结构分析与形状描述符(13)拟合椭圆函数fitEllipseDirect()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 围绕一组2D点拟合一个椭圆。 该函数计算出一个椭圆&#xff0c;该椭圆拟合一组2D点。它返回一个内切于该椭圆的旋转矩形。使用了由[91]提出的直接…

Ubuntu22.04之禁止内核自动更新(二百六十八)

简介&#xff1a; CSDN博客专家、《Android系统多媒体进阶实战》一书作者 新书发布&#xff1a;《Android系统多媒体进阶实战》&#x1f680; 优质专栏&#xff1a; Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a; 多媒体系统工程师系列【…

第二阶段(c语言)

内存&#xff1a;一块临时存储区域 虚拟内存 vm 物理内存 pm 内存单元&#xff1a;一个内存单元的大小是1byte 内存块&#xff1a;连续多个内存单元 内存地址&#xff1a;相当于是教室的门牌号 内存中的值&#xff1a;相当于是教室里面所存放的东西 int num 0&#xff1b; …

Prometheus + Grafana + nVisual 实现运维监控全面可视化

Prometheus主要实现采集、存储、查询设备数据指标、告警等功能&#xff1b;Grafana通过Prometheus的API以仪表板的形展示数据&#xff0c;同时在线提供了大量监测数据展示模版。然而&#xff0c;实际运维中我们不仅需要实时监测数据&#xff0c;还需要了解设备的物理位置、拓扑…

Axure科技感设计案例教程:从按钮到大屏的全面探索

Axure RP&#xff0c;作为一款强大的原型设计工具&#xff0c;不仅能够帮助设计师快速构建产品界面&#xff0c;还能通过其丰富的交互功能实现高度逼真的科技感效果。以下是一个简要的教程&#xff0c;介绍如何使用Axure RP设计科技感按钮、图标、统计、图表以及大屏界面。 1.…

24年最新版ocpp2.0.1文档目录:24年最新ocpp_201-v10欧标通讯协议

推荐一套企业级开源充电桩平台&#xff1a;完整代码包含多租户、硬件模拟器、多运营商、多小程序&#xff0c;汽车 电动自行车、云快充协议&#xff1b;——(慧哥)慧知开源充电桩平台&#xff1b;https://liwenhui.blog.csdn.net/article/details/134773779?spm1001.2014.3001…