数据结构(11) -- 邻接表存储图的DFS和BFS
///////////////////////////////////////////////////////////////
//图的邻接表表示法以及DFS和BFS
///////////////////////////////////////////////////////////////
#include <iostream>
#include <stdlib.h>
#include <queue>
using namespace std;
//图的邻接表表示法
#define MaxVertexNum 100
enum GraphType{DG, UG, DN, UN};//有向图,无向图,有向网图,无向网图 typedef struct node
{
int AdjV; //邻接点域
struct node *Next; //指向下一个邻接点的指针域
//若要表示边上的权值信息,则应增加一个数据域Weight
}EdgeNode; //边表节点 typedef char VertexType; //顶点用字符表示
typedef struct Vnode
{
VertexType Vertex; //顶点域
EdgeNode *FirstEdge; //边表头指针
}VertexNode; typedef VertexNode AdjList[MaxVertexNum]; //AdjList是邻接表类型 typedef struct
{
AdjList adjlist; //邻接表
int n, e; //顶点数和边数
enum GraphType GType; //图的类型
}ALGraph; //ALGraph是以邻接表方式存储的图类型 void CreateALGraph(ALGraph *G)
{
int i, j, k;
EdgeNode *edge;
G->GType = UG; //有向图
cout << "请输入顶点数和边数(输入格式为:顶点数,边数):\n" << endl;
cin >> G->n >> G->e; //读入顶点数和边数
cout << "请输入顶点信息(输入格式为:顶点号<CR>):\n";
for (i = ; i < G->n; i++)
{//建立有n个顶点的顶点表
cin >> &G->adjlist[i].Vertex; //读入顶点信息
G->adjlist[i].FirstEdge = NULL; //顶点的边表头指针设为空
}
cout << "请输入边的信息(输入格式为:i,j<CR>):\n";
for (k = ; k < G->e; k++) //建立边表
{
cin >> i >> j;
edge = new EdgeNode;
edge->AdjV = j;
edge->Next = G->adjlist[i].FirstEdge;
//将新边表节点edge插入到顶点vi的边表头部
G->adjlist[i].FirstEdge = edge;
//若是无向图,还要生成一个节点,用来表示边<vj, vi>
EdgeNode *edge2 = new EdgeNode;
edge2->AdjV = i;
edge2->Next = G->adjlist[j].FirstEdge;
G->adjlist[j].FirstEdge = edge2;
}
} //邻接表存储的图--DFS
//visited[]为全局变量,已经初始化为false
bool Visited[MaxVertexNum] = { false };
void DFS(ALGraph *G, int i)
{
//以vi为出发点对邻接表存储的图G进行DFS搜索
EdgeNode *W;
cout << "visit vertex:" << G->adjlist[i].Vertex << " ";
//相当于访问顶点vi
Visited[i] = true;
for (W = G->adjlist[i].FirstEdge; W; W = W->Next)
if (!Visited[W->AdjV])
DFS(G, W->AdjV);
} //邻接表存储的图--DFS
//visited[]为全局变量,已经初始化为false
void BFS(ALGraph *G ,int i)
{
queue<VertexNode> Q;
Q.push(G->adjlist[i]);
Visited[i] = true; //依次入队列,每次取出下一个要访问的节点
while (!Q.empty())
{
VertexNode tmp = Q.front();
cout << tmp.Vertex << " ";
Q.pop();
EdgeNode *p = tmp.FirstEdge;
while (p != NULL)
{
if (Visited[p->AdjV] != true)
{
Q.push(G->adjlist[p->AdjV]);
Visited[p->AdjV] = true;
}
p = p->Next;
}
}
} void Print(ALGraph *G)
{
for (int i = ; i < G->n; i++)
{
EdgeNode *p = G->adjlist[i].FirstEdge;
cout << G->adjlist[i].Vertex << " ";
while (p != NULL)
{
cout << p->AdjV << " ";
p = p->Next;
}
cout << endl;
}
} int main()
{
ALGraph *G = new ALGraph;
CreateALGraph(G);
Print(G);
//DFS(G, 0);
BFS(G, );
system("pause");
return ;
}
测试结果:
数据结构(11) -- 邻接表存储图的DFS和BFS的更多相关文章
- 邻接表存储图,DFS遍历图的java代码实现
import java.util.*; public class Main{ static int MAX_VERTEXNUM = 100; static int [] visited = new i ...
- PTA 邻接表存储图的广度优先遍历(20 分)
6-2 邻接表存储图的广度优先遍历(20 分) 试实现邻接表存储图的广度优先遍历. 函数接口定义: void BFS ( LGraph Graph, Vertex S, void (*Visit)(V ...
- PTA 邻接表存储图的广度优先遍历
试实现邻接表存储图的广度优先遍历. 函数接口定义: void BFS ( LGraph Graph, Vertex S, void (*Visit)(Vertex) ) 其中LGraph是邻接表存储的 ...
- c++邻接表存储图(无向),并用广度优先和深度优先遍历(实验)
一开始我是用c写的,后面才发现广搜要用到队列,所以我就直接使用c++的STL队列来写, 因为不想再写多一个队列了.这次实验写了两个多钟,因为要边写边思考,太菜了哈哈. 主要参考<大话数据结构&g ...
- 数据结构之---C语言实现图的邻接表存储表示
// 图的数组(邻接矩阵)存储表示 #include <stdio.h> #include <stdlib.h> #include <string.h> #defi ...
- 图的邻接表存储 c实现
图的邻接表存储 c实现 (转载) 用到的数据结构是 一个是顶点表,包括顶点和指向下一个邻接点的指针 一个是边表, 数据结构跟顶点不同,存储的是顶点的序号,和指向下一个的指针 刚开始的时候把顶点表初始化 ...
- 图的DFS和BFS(邻接表)
用C++实现图的DFS和BFS(邻接表) 概述 图的储存方式有邻接矩阵和邻接表储存两种.由于邻接表的实现需要用到抽象数据结构里的链表,故稍微麻烦一些.C++自带的STL可以方便的实现List,使算 ...
- 图的邻接表存储表示(C)
//---------图的邻接表存储表示------- #include<stdio.h> #include<stdlib.h> #define MAX_VERTEXT_NUM ...
- 数据结构C++使用邻接表实现图
定义邻接表存储的图类.[实验要求] (1)创建一个邻接表存储的图:(2)返回图中指定边的权值:(3)插入操作:向图中插入一个顶点,插入一条边:(4)删除操作:从图中删除一个顶点,删除一条边:(5)图的 ...
随机推荐
- 超大整数运算算法——为RSA加密算法提供运算工具
/* program: Large integer operations * Made by: Daiyyr * date: 2013/07/09 * This software is licen ...
- GitHub的使用(下)—— 如何下载一个已存在的 Repository
导读:本篇主要介绍如何使用EGit下载GitHub上已存在的库.如果不是为了下载一个Java Project,直接在Eclipse中导入使用,那可以使用GitHub的桌面程序(GitHub for W ...
- ubuntu 14.04 与 CentOS 升级GCC/G++至5版本
# 支持 ubuntu 14.04 add-apt-repository ppa:ubuntu-toolchain-r/test && apt-get update apt-get i ...
- poj -1065 Wooden Sticks (贪心or dp)
http://poj.org/problem?id=1065 题意比较简单,有n跟木棍,事先知道每根木棍的长度和宽度,这些木棍需要送去加工,第一根木棍需要一分钟的生产时间,如果当前木棍的长度跟宽度 都 ...
- 总结Selenium自动化测试方法(四)WebDriver常用的操作
四.WebDriver常用的操作 1.控制浏览器操作 #控制浏览器的大小 self.driver.set_window_size(480,800) #控制浏览器返回 self.driver.back( ...
- shell 实例收集
shell编程入门 http://www.runoob.com/linux/linux-shell-variable.html http://c.biancheng.net/cpp/shell/ 1. ...
- java获取系统指定时间年月日
java获取系统指定时间年月日 private String setDateTime(String falg) { Calendar c = Calendar.getInstance(); c.set ...
- hdu4430Yukari's Birthday(二分)
4430 去年长春最简单一题 二分啊 错了好多遍 有个大坑 是个圆心处的1 可选可不选 #include <iostream> #include<cstdio> #incl ...
- 齐次坐标概念&&透视投影变换推导
http://daehgib.blog.163.com/blog/static/1861071422011579551134/ 透视投影是3D固定流水线的重要组成部分,是将相机空间中的点从视锥体(fr ...
- 【Todo】所有Locked的题目的分析解答
下面这个链接有比较全的leetcode题目包括锁的 http://www.cnblogs.com/grandyang/p/4606334.html https://leetcode.com/probl ...