数据结构—邻接表的BFS


原理:参考趣学数据结构

代码:

队列代码:

#pragma once
#define elemType int
#define N 100
#include<stdlib.h>
typedef struct dQueue {int data;struct dQueue* next;
}dQueue;
typedef struct queue {dQueue *front, *rear;
}queue;
bool initQueue(queue &Queue) {//初始化队列//Queue.front = new dQueue;Queue.front = Queue.rear = (dQueue*)malloc(sizeof(dQueue));if (!Queue.front) {return false;}Queue.front->next = NULL;//头结点return true;
}
int getQueueTopElem(queue &Queue) {//获取队列队头的元素int u = -1;if (Queue.front != Queue.rear) {dQueue* p = Queue.front->next;u = p->data;}return u;
}
bool enQueue(queue &Queue, int e) {//入队dQueue* p = Queue.rear;dQueue* s = (dQueue*)malloc(sizeof(dQueue));s->data = e;s->next = NULL;p->next = s;Queue.rear = s;return true;
}
bool deQueue(queue &Queue, int &e) {//出队if (Queue.front == Queue.rear) {return false;//空队}dQueue* p = Queue.front->next;e = p->data;Queue.front->next = p->next;if (p == Queue.rear) {//队尾只有一个元素的时候Queue.rear = Queue.front;}delete p;return true;
}
bool emptyQueue(queue Queue) {//队列为空的判断if (Queue.front == Queue.rear) {return true;}return false;
}

BFS代码:

#include<stdio.h>
#include<stdlib.h>
#include"queue.h"
#define typeNode int //每个头结点的标识数据类型
#define N 100 //最大结点数
int degree[N];
int result[N];
bool visited[N];
typedef struct dNode {//每个头结点后紧跟的单位结点int data;struct dNode * next;
}dNode;
typedef struct mNode {//邻接表中每一行的头结点typeNode data;dNode * first;//指向第一个有效的后继结点
}mNode;
typedef struct {mNode vNode[N];//所有头结点int vNum, eNum;//图中顶点的数量和边数量
}zNode;
void init(zNode &ZNode) {printf("规定顶点从0开始取\n");scanf_s("%d%d", &ZNode.vNum, &ZNode.eNum);//输入有向图的顶点数和边数for (int i = 0; i < ZNode.vNum; i++) {//规定顶点从0开始取scanf_s("%d", &ZNode.vNode[i].data);ZNode.vNode[i].first = NULL;}for (int i = 0; i < ZNode.eNum; i++) {//头插法int u, v;scanf_s("%d%d", &u, &v);//u顶点到v顶点有边dNode* p = new dNode();p->data = v;p->next = ZNode.vNode[u].first;//只有指针域,指向地址ZNode.vNode[u].first= p;}
}
void print14(zNode ZNode) {printf("遍历链表:\n");for (int i = 0; i < ZNode.vNum; i++) {dNode* temp = ZNode.vNode[i].first;printf("%d ->", ZNode.vNode[i].data);while(temp){printf("%d ->",temp->data);temp = temp->next;}printf("NULL\n");}
}
void BFSLinkGraph(zNode ZNode, int u) {//邻接表的DFSqueue Queue;initQueue(Queue);visited[u] = true;enQueue(Queue, u);while (!emptyQueue(Queue)) {u = getQueueTopElem(Queue);printf("%d ", u);int e = -1;deQueue(Queue, e);dNode* p=ZNode.vNode[u].first;while (p) {int i = p->data;if (!visited[i]) {visited[i] = true;enQueue(Queue, i);}p = p->next;}}
}
int main() {zNode ZNode;printf("邻接表的构造:\n");init(ZNode);print14(ZNode);for (int i = 0; i < ZNode.vNum; i++) {visited[i] = false;}printf("BFS遍历邻接表\n");BFSLinkGraph(ZNode, 0);printf("\n");system("pause");return 0;
}

测试截图:

时间复杂度为O(n+e),空间复杂度为O(n)

如果存在什么问题,欢迎批评指正!谢谢!

数据结构---邻接表的BFS相关推荐

  1. 数据结构---邻接表的DFS

    数据结构-邻接表的DFS 原理:参考趣学数据结构 代码: #include<stdio.h> #include<stdlib.h> #define typeNode int / ...

  2. C++笔记-基于邻接表的BFS(宽度优先遍历)

    这里是基于邻接表的,有向的,具体代码如下: #include <iostream> #include <list>using namespace std;class Graph ...

  3. 数据结构实验之图论二:基于邻接表的广度优先搜索遍历

    题目描述 给定一个无向连通图,顶点编号从0到n-1,用广度优先搜索(BFS)遍历,输出从某个顶点出发的遍历序列.(同一个结点的同层邻接点,节点编号小的优先遍历) 输入 输入第一行为整数n(0< ...

  4. Java数据结构——邻接矩阵+邻接表

    文章目录 一.邻接矩阵 二.邻接表 一.邻接矩阵 1. 定义 vexs[](存储顶点)和 arcs[][](存储边关系,叫邻接矩阵)集合.因此,用一个一维数组存放图中所有顶点数据: 用一个二维数组存放 ...

  5. PTA 旅游规划(邻接表) 思路分析及代码解析

    PTA 旅游规划_使用邻接表 思路分析及代码解析v1.0 一.前导 1. 需要掌握的知识 2. 题目信息 二.解题思路分析 1. 题意理解 1. 1 输入数据 1.2 输出数据 2. 思路分析(重点) ...

  6. 数据结构(廿六) -- C语言版 -- 图 - 图的遍历 -- 邻接表 - 深度/广度优先遍历/搜索(DFS、BFS)

    内容预览 零.读前说明 一.深度优先遍历 1.1.深度优先的遍历过程 1.2.深度优先的遍历实现代码 二.广度优先遍历 2.1.广度优先的遍历过程 2.2.广度优先的遍历实现代码 三.源码测试效果 3 ...

  7. 数据结构与算法(7-2)图的遍历(深度优先遍历DFS、广度优先遍历BFS)(分别用邻接矩阵和邻接表实现)

    目录 深度优先遍历(DFS)和广度优先遍历(BFS)原理 1.自己的原理图 2.官方原理图 一.邻接矩阵的深度优先遍历(DFS) 1.原理图 2. 过程: 3.总代码 二.邻接表的深度优先遍历(DFS ...

  8. 数据结构——无向图创建邻接表以及深度遍历、广度遍历(C语言版)

    摘自:数据结构--无向图创建邻接表以及深度遍历.广度遍历(C语言版) 作者:正弦定理 发布时间:2020-12-22 20:55:12 网址:https://blog.csdn.net/chinese ...

  9. 分别用邻接矩阵和邻接表实现图的深度优先遍历和广度优先遍历_数据结构|图的邻接表与深度、广度优先搜索

    线性存储元素时,元素的关系也同时确定了.而非线性数据结构就不同了,需要同时考虑存储数据元素和数据元素的关系. 由于图的结构比较复杂,任意两个顶点之间都可能存在联系,因此无法以数据元素在存储区中的物理位 ...

最新文章

  1. A*算法解决八数码问题 Java语言实现
  2. Bootstrap3 栅格系统-简介
  3. Python 基础 - Day 1 Assignment - Login 模拟登陆
  4. PAT_B_1085_Java(25分)
  5. 计算机网络的定义功能和分类,计算机网络的定义和分类.ppt
  6. 趣挨踢 | 阿里员工吐槽:我在阿里工作五年,面试一个小公司竟然挂了
  7. python如何读取数据时出现错误_在python3中,关于redis读取数据带有‘b’的问题...
  8. 进入hadoop_hadoop:伪分布模式参数配置指南
  9. Jenkins 无法运行 putty.exe问题解决
  10. 【CQOI2017】小Q的表格
  11. 41.D3D数学库 GameProject7
  12. python中对象排序的两种方式
  13. PanDownloadSpeedPan迅雷极速版合集
  14. 什么是连接池?为什么需要连接池呢?连接池的组成原理又是什么呢?
  15. 七种常见的电子邮件安全协议简析
  16. HTTP POST GET
  17. 阿里云aliyun 的SLB 对 ECS的健康检查
  18. java mongo replica_mongo 的replica set的集群模式 实现读写分离
  19. if 判断条件为纯数字
  20. 万卷书 - 欧洲的门户[The Gates of Europe]

热门文章

  1. Android之SharedPreferences 存储复杂对象
  2. Android之Launcher分析和修改1——Launcher默认界面配置(default_workspace)
  3. google+stackoverflow_哪些开发问题最让程序员“头秃”?我们分析了Stack Overflow的11000个问题...
  4. 360文件粉碎机_中山三乡资料文件销毁粉碎销毁资料文件公司一览表
  5. eks volumn s3_威客电竞 深渊联赛S3欧洲区总决赛,Secret成就八连冠
  6. 千万别让男朋友穿你的短裙......
  7. 神PS!老爸把儿子的画作P成现实,看完我笑哭了
  8. 老师:你根本不知道我有多想逃课
  9. 收藏 | 分享 3 种脑洞大开的Excel技巧
  10. 2018年最后一个月最值得关注的13个优质公号