程序只能遍历连通图,如果想遍历不连通的,那需要再在BFS函数里面加个for循环,遍历visited数组。

代码写的很乱,半C不C。

代码是从创建队列到生成邻接表图再到BFS遍历。

因为是邻接表,所以我的算法是这样:

1.假设从v0这个头结点开始,进队列,然后出队,设置visited数组。用一个变量e接住头结点v0

2.进入循环,while(!Q.empty()),然后在写个for(auto i=e.first;i;i=i->next),这里就是在遍历边结点了

3.因为边结点的数据结构,里面存储着下表,所以再来个if(),判断是否已经访问过,如果没访问,直接加入队列,并设置visited数组。

大概就是这样。

#include <iostream>
struct OtherInfo {char name;int iWeight;
};
struct AcrNode {OtherInfo other;//存储其他信息int index;//用于储存下表AcrNode* next;//链表形式 指向下一个ArcNode
};
struct VexNode {char name;AcrNode* first;//指向第一个
};
struct ALGraph {int Vexnum,Acrnum;//存储顶点数量VexNode AdList[100];//存储的是那个链表总共的ALGraph(int,int);void BFS();//BFS算法
};
struct Queue {VexNode base[100];//队列储存的元素int rear, front;Queue() {rear = front = 0;//初始化}void EnQueue(VexNode acrnode);VexNode DeQueue();bool empty();
};
bool Queue::empty() {if (front == rear) return true;else return false;
}
void Queue::EnQueue(VexNode node) {if ((rear + 1) % 100 == front) return;//此时已经满了base[rear] = node;rear = (rear + 1) % 100;
}
VexNode Queue::DeQueue() {if (rear == front) return base[rear];//此时已经是空了return base[front++];
}
int LocateVex(ALGraph G, char name) {//这个Locate只能定位头顶点for (int i = 0; i < G.Vexnum; i++) {if (name == G.AdList[i].name) return i;}
}
ALGraph::ALGraph(int Vexnum,int Acrnum) {this->Acrnum = Acrnum;this->Vexnum = Vexnum;for (int i = 0; i < Vexnum; i++) {//先初始化那个ALGraph VexNode数组里面的名字 hezhizhenstd::cout << "输入顶点名字:";std::cin >> this->AdList[i].name;this->AdList[i].first = NULL;//把指针置空}for (int k = 0; k < Acrnum; k++) {//假如是无向网std::cout << "请输入顶点1 顶点2 和权重:";char cName1; char cName2; int iWeight;std::cin >> cName1 >> cName2 >> iWeight;auto i = LocateVex(*this, cName1);auto j = LocateVex(*this, cName2);//注意 这个时候返回的是总表 每个分头顶点的下表//从顶点一出发 作为头结点auto p = new AcrNode;//指向链表的结点p->other.name = cName2;p->index = j;//??存疑p->other.iWeight = iWeight;p->next = this->AdList[i].first;this->AdList[i].first = p;//运用头插法/无向网 反过来auto p1 = new AcrNode;//指向链表的结点p1->other.name = cName1;p1->index = i;//??存疑p1->other.iWeight = iWeight;p1->next = this->AdList[j].first;this->AdList[j].first = p1;//运用头插法}
}
bool visited[5];void ALGraph::BFS() {Queue Q;std::cout << "请输入开始顶点的名字:";char name;std::cin >> name;Q.EnQueue(this->AdList[LocateVex(*this, name)]);//从这个索引开始visited[LocateVex(*this, name)] = true;//从输入的那个顶点开始while (!Q.empty()) {//队列不空auto e = Q.DeQueue();//获取出队列的那个VexNode;std::cout << e.name<<"被访问";//for (auto i = e.first; i; i=i->next) {//for循环链表 一直到null链表//其实是来找索引的if (!visited[i->index]) {Q.EnQueue(this->AdList[i->index]);//判断索引没有被访问 进队列visited[i->index] = true;}}}
}
int main() {memset(visited, false, sizeof(visited));ALGraph G(5, 6);G.BFS();return 0;
}

c++邻接表实现BFS算法遍历相关推荐

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

    数据结构-邻接表的BFS 原理:参考趣学数据结构 代码: 队列代码: #pragma once #define elemType int #define N 100 #include<stdli ...

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

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

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

    数据结构实验之图论二:基于邻接表的广度优先搜索遍历 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Descript ...

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

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

  5. 数据结构【图】—023邻接表深度和广度遍历

    1 #include "000库函数.h" 2 //无向图 3 4 #define MAXSIZE 9 /* 存储空间初始分配量 */ 5 #define MAXEDGE 15 6 ...

  6. 邻接表实现Prim算法

    Prim算法 Prim算法是通过连通网找最小生成树(mst)的算法 过程: 1.首先选取任意顶点作为树的根 2.遍历其他(不在树中)的顶点,对于每个顶点,找到一条到mst路径最短的边,这样,每个顶点都 ...

  7. 图的邻接表存储与深度优先遍历代码实现

    Graph.h Vnode结构成员firstarc在定义时赋初值NULL,在Visual Stdio 2013下编译通过,VC6.0就不行(非静态数据成员不能初始化) #include <std ...

  8. dijkstra邻接表_掌握算法-图论-最短路径算法-Dijkstra算法

    如果图是赋权图,那么问题就变得更困难了不过我们仍然可以使用来自无权情形时的想法. 我们保留所有与前面相同的信息.因此,每个顶点或者标记为Known的,或者标记为Unknown的.像之前一样,对每一个顶 ...

  9. 图:图的邻接表创建、深度优先遍历和广度优先遍历代码实现

    邻接表介绍 邻接矩阵是不错的一种图存储结构,但是我们也发现,对于边数相对顶点较少的图,这种结构比较较浪费存储空间.如果不想浪费存储空间,大家肯定会先到链表.需要空间的时候再才想内存去申请,同样适用于图 ...

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

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

最新文章

  1. 15. Python 函数
  2. LSTM情感分类问题再战
  3. 小功率荧光灯拆解分析
  4. centos linux 系统上 log4j打印的时间与CST时间差8小时的解决方法
  5. 转;VC++中Format函数详解
  6. js-移动端android浏览器中input框被软键盘遮住的问题解决方案
  7. Nuget多项目批量打包上传服务器的简明教程
  8. Javolution 2.2.5 - Java Struct/Union Simplified
  9. windows下启动activemq闪退
  10. Servlet 工程 web.xml 中的 servlet 和 servlet-mapping 标签
  11. MongoDB(window安装及服务配置)
  12. windows平台搭建opencv_python
  13. 各种边缘检测算子特点比较(canny)
  14. 爬虫学习5-JSON 数据的分析与解析
  15. 使用计算机用眼卫生,长期用电脑致眼睛干涩 注意用眼卫生
  16. 电脑摄像头未能创建连接服务器,电脑提示未能创建视频预览,请检查设备连接的原因及解决办法...
  17. C# unity 中实现汉字转拼音
  18. 在qt实现手机通讯录系统_通讯录管理系统的设计与实现(QT,SQlite)
  19. 通过logback-spring.xml配置,概述log4j与logback之间的使用
  20. 如何通过启启宝盒打造你自己的“水井”

热门文章

  1. 信息收集--wmic命令
  2. Git三大特色之Stage(暂存区)--留着当资料
  3. mysql数据库定时清理数据
  4. 系统集成项目管理工程师(中级)考试心得经验
  5. MySql主键和唯一索引的区别
  6. AIM 2020 Challenge on Learned Image Signal Processing Pipeline(个人笔记,勿喷)
  7. Unity CityEngine 根据地图中建筑矢量数据批量建模
  8. python数字字母识别_字符图像识别——数字字母混合
  9. Mob免费短信验证教程
  10. 新版个人信息安全规范正式发布:收集生物识别信息前需告知