MatGraph.h

#pragma once
#include <iostream>
using namespace std;#define MAXV 7      //最大顶点个数
#define INF 32767   //表示∞typedef int InfoType;
typedef char VertexType;
//图的邻接表存储定义
typedef struct ANode
{int adjvex;//该边的终点编号struct ANode* nextarc;//指向下一条边的指针InfoType weight;//该边的权值等信息
}ArcNode;typedef char Vertex[10];
typedef struct Vnode
{Vertex data;//顶点信息ArcNode* firstarc;//指向第一条边
}VNode;typedef struct
{VNode adjlist[MAXV];//邻接表int n1, e1;//顶点数n和边数e
}AdjGraph;
//初始化邻接表
void InitALGraph(AdjGraph* A);
//建立邻接表AdjGraph
void CreateALGraph(AdjGraph*& A);
//输出邻接表
void DispALGraph(AdjGraph* A, ArcNode* L);//, int n,//深度优先遍历DFS
void DFS(AdjGraph* A, int v);
//广度优先遍历
void BFS(AdjGraph* A, int v);队列/
typedef struct
{int data[MAXV];//存放队中元素int front, rear;//队头、队尾指针
}SqQueue;//初始化队列
void InitQueue(SqQueue*& qu);
//入队
bool enQueue(SqQueue*& qu,int& e);
//出队
bool deQueue(SqQueue*& qu, int& e);
//判断队列空
bool QueueEmpty(SqQueue*& qu);

MatGraph.cpp

#include "MatGraph.h"
//初始化邻接表
void InitALGraph(AdjGraph* A)
{A = (AdjGraph*)malloc(sizeof(AdjGraph));A->n1 = 0;A->e1 = 0;
}
//建立邻接表AdjGraph
void CreateALGraph(AdjGraph*& A)
{A = (AdjGraph*)malloc(sizeof(AdjGraph));int i, j = 0,w=0;ArcNode* L=0;cout << "请输入顶点数和边数:";cin >> A->n1 >> A->e1;//cout << "输入顶点信息(A B C...):";for (i = 0; i < A->n1; i++){//cin >> A->adjlist[i].data;//输入顶点信息A->adjlist[i].firstarc = 0;//将邻接表初始化}cout << "输入边(vi,vj)上的顶点序号以及权值:";for (int k = 0; k < A->e1; k++){cin >> i >> j>>w;L = (ArcNode*)malloc(sizeof(ArcNode));L->adjvex = j;//边的终点编号L->nextarc = A->adjlist[i].firstarc;L->weight = w;A->adjlist[i].firstarc = L;//将当前顶点的指针指向LL = (ArcNode*)malloc(sizeof(ArcNode));L->adjvex = i;L->nextarc = A->adjlist[j].firstarc;L->weight = w;A->adjlist[j].firstarc = L;}cout <<endl;DispALGraph(A,L);
}
//输出邻接表
void DispALGraph(AdjGraph* A,ArcNode*L)//
{cout << "图的邻接表:" << endl;for (int i = 0; i < A->n1; i++){L = A->adjlist[i].firstarc;cout << i << "  ";while (L){cout << "→" << L->adjvex << "  " << L->weight<<"(权重)";L = L->nextarc;}cout << endl;}
}int visited[20] = { 0 };
//深度优先遍历DFS
void DFS(AdjGraph* A, int v)
{ArcNode* p;visited[v] = 1;cout << v << " ";//输出被访问的当前编号p = A->adjlist[v].firstarc;//p指向顶点v第一个邻接点(边)while (p){if (visited[p->adjvex] == 0)DFS(A,p->adjvex);p = p->nextarc;}
}//
//初始化队列
void InitQueue(SqQueue*& qu)
{qu = (SqQueue*)malloc(sizeof(SqQueue));qu->front = 0;qu->rear = 0;
}//入队
bool enQueue(SqQueue*& qu,int& e)
{if ((qu->rear+1)%MAXV==qu->front)return false;qu->data[qu->rear] = e;//rear位置插入元素qu->rear = (qu->rear + 1) % MAXV;return true;
}
//出队
bool deQueue(SqQueue*& qu, int& e)
{if (qu->rear == qu->front)//队空return false;e = qu->data[qu->front];qu->front = (qu->front + 1) % MAXV;return e;
}
//判断队列空
bool QueueEmpty(SqQueue*& qu)
{if (qu->front == qu->rear)return true;return false;
}
int _visited[MAXV] = { 0 };
//广度优先遍历
void BFS(AdjGraph* A, int v)
{int w = 0;ArcNode* p;SqQueue* qu;//定义队列指针InitQueue(qu);//初始化队列cout << v << " ";_visited[v] = 1;enQueue(qu, v);//v入队while (!QueueEmpty(qu)){deQueue(qu, w);//出队一个顶点wp = A->adjlist[w].firstarc;//指向w第一个邻接点while (p!=NULL){//j = p->adjvex;if (_visited[p->adjvex] == 0)//当前结点未被访问{cout << p->adjvex<<" ";//访问该邻接点_visited[p->adjvex] = 1;//标记已访问enQueue(qu, p->adjvex);//该顶点进队}p=p->nextarc;}}cout << endl;
}

Graph.cpp

#include "MatGraph.h"int main()
{AdjGraph* A=0;InitALGraph(A);CreateALGraph(A);cout << "深度优先遍历:";DFS(A,0);cout << "广度优先遍历:";BFS(A, 0);
}

输入:7 9

第二次输入:

0 1 28
0 5 10
1 2 16
1 6 14
5 4 25
4 6 24
4 3 22
3 2 12
3 6 18

结果:

以0结点为起点实现上述图的深度优先和广度优先遍历算法相关推荐

  1. P202 例9-2 以如图9-8所示的带权有向图为例,编写测试上述图的深度优先和广度优先遍历函数的程序。

    P202 例9-2 以如图9-8所示的带权有向图为例,编写测试上述图的深度优先和广度优先遍历函数的程序. 头文件1:SeqList.h #include<stdio.h>#define M ...

  2. c++ 数据结构 图的应用(实现图的深度优先和广度优先遍历)——以邻接表为存储结构

    数据结构实习--图及应用(图的遍历) 一.问题描述 很多涉及图上操作的算法都是以图的遍历操作为基础的.试写一个程序,演示无向图的遍历操作. 二.基本要求 以邻接表为存储结构,实现连通无向图的深度优先和 ...

  3. 图数据结构,以及使用递归方式实现图的深度优先和广度优先遍历

    源码概览 1.GraphDemo,用于演示一个图结构以及图的遍历. 2.Graph,表示图数据结构,维护顶点的集合与边的集合,并提供广度优先遍历和深度优先遍历方法. 3.Edge<V>,表 ...

  4. Java实现图的深度和广度优先遍历算法

    概述: 最近要学习写网络爬虫,所以把图的深度和广度搜索都再温习一下. 图结构展示: 实现过程: 首先,我们来看看图结构在代码中的实现.有三块逻辑: 1.图中的节点: public class Grap ...

  5. 图的理解:深度优先和广度优先遍历及其 Java 实现

    遍历 图的遍历,所谓遍历,即是对结点的访问.一个图有那么多个结点,如何遍历这些结点,需要特定策略,一般有两种访问策略: 深度优先遍历 广度优先遍历 深度优先 深度优先遍历,从初始访问结点出发,我们知道 ...

  6. 数据结构 - 图 (图的深度优先和广度优先)

    图的基本介绍 为什么要有图这种数据结构 数据结构有线性表和树 线性表局限与一个直接前驱和一个直接后继的关系 树也只能右一个直接前驱也就是父节点 当我们需要表示多对多的关系时,这里我们就需要用到图这种数 ...

  7. Python 实现图的深度优先和广度优先搜索

    在介绍 python 实现图的深度优先和广度优先搜索前,我们先来了解下什么是"图". 1 一些定义 顶点 顶点(也称为"节点")是图的基本部分.它可以有一个名称 ...

  8. 【2023王道数据结构】【图】通过C++实现图的BFS(广度优先遍历)算法求单源最短路径问题C、C++完整实现(可直接运行)

    ~~~笔锋至此又怎能平淡而终,故事开始便不承认普通✌✌✌ ✌ 题目及题解持续更新中 [2023王道数据结构目录]课后算法设计题C.C++代码实现完整版大全 题目: 通过C++实现图的BFS(广度优先遍 ...

  9. 图的存储以及深度优先以及广度优先遍历

    转载自:http://blog.csdn.net/gamer_gyt/article/details/51498546 一:图的分类 1:无向图 即两个顶点之间没有明确的指向关系,只有一条边相连,例如 ...

最新文章

  1. 大数据中台之Kafka,到底好在哪里?
  2. DL之self-attention:self-attention自注意力机制的简介、应用之详细攻略
  3. 最新版FreeTextBox(版本3.1.6)在ASP.Net 2.0中使用简解(提供博客园本地下载)
  4. 创建一个framework
  5. string_View理解与用法(一)
  6. 让 UV4 支持STC 单片机
  7. swift mvvm_Swift中的MVVM设计模式概述
  8. java代码实现画板_求好心人帮找或做个JAVA画板程序 代码,主要能实现简单的画板功能!...
  9. 使用nose_parameterized使unitTest实现参数化
  10. Javc处理图片各种效果的类库Java Image Filters
  11. 服务器阵列卡缓存显示错误,服务器阵列卡(缓存)
  12. android微信换行,微信终于支持换行输入了,只需要一个简单的操作-excel自动换行...
  13. 盲盒app源码,可搭建部署二开.模式功能介绍.
  14. A-MPDU与A-MSDU各是什么意思
  15. 【解决方案】STM32L152单片机驱动段码LCD屏,执行HAL_LCD_Init函数失败返回HAL_TIMEOUT,长时间卡在LCD_FLAG_RDY的while循环里面的解决办法
  16. 生成html水印,兼容ie8,ie兼容性问题与解决办法,移动端水印给出的建议
  17. VB的界面设计~ 值得一看
  18. ABAP VF01 / VF04销售开票增强 增加校验
  19. 无法进入BIOS解决
  20. Redis进阶-主从,哨兵,集群

热门文章

  1. 利用java输出星号金字塔
  2. 用于表检测和结构识别的深度学习:综述
  3. Centos7.3上使用rpm方式安装CUDA9.2
  4. ggplot2学习笔记5:工具箱(一)基础图层、标签、注释、群组几何对象、曲面图
  5. 第二部分 Mysql数据库管理_第二篇 数据库MySql
  6. Python爬虫篇:实现铃声采集
  7. 前端水平一坨屎的我竟然能写出这种页面,python dash给了我希望--持续更新
  8. MATLAB 怎样将for循环转换为矩阵【MATLAB 入门笔记 1】
  9. 优秀!94年出生的她,受聘为深圳大学正教授!
  10. Python黑科技——暴力破解邻居家的WiFi密码,用WiFi不需要求人