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. Java对象序列化详解
  2. C/C++数组指针和指针数组
  3. 中文分词之HMM模型详解
  4. 如何在 Kubernetes Pod 内进行网络抓包
  5. XML和JSON的比较
  6. 【Lucene】lucene 视频教程 笔记
  7. Oracle内存管理(五)
  8. php 字库,矢量字库的剪裁_php
  9. 详细设计的工具——程序流程图
  10. pyecharts基础图表汇总(三国演义可视化)
  11. Web前端:一些用于Web开发的最佳精选IDE和代码编辑器
  12. WinISO5.3的注册码吧
  13. Win10 如何将40G大文件极致压缩
  14. 用gin+xorm+docker编写Online Judge后端
  15. Codesys使用电子凸轮实现追剪功能
  16. 垃圾小白羊leetcode刷题记录1
  17. 过压保护芯片,IC电路方案集合
  18. spring加载xsd文件
  19. matlab金字塔,高斯金字塔的matlab实现
  20. 酷!60 s 速学HTTP 状态码 !

热门文章

  1. python apriori算法 sklearn_使用Apriori算法进行关联分析
  2. pomelo配置logger时日志无法输出到日志文件的问题解决方案
  3. 产品窜货是什么意思?怎么防止窜货行为?
  4. C++获取linux时间戳
  5. 8核16g服务器性能,8核16g云服务器
  6. CentOS7 Yum卸载open-jdk
  7. 雨课堂提交作业步骤 10步帮你弄好
  8. PS4游戏机相比以前有什么创新吗?
  9. 宝塔安装sqlserver_windows 宝塔安装sql_server 2008,php链接配置流程
  10. python消除C语言注释