数据结构(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)图的 ...
随机推荐
- linux内核编程笔记【原创】
以下为本人学习笔记,如有转载请注明出处,谢谢 DEFINE_MUTEX(buzzer_mutex); mutex_lock(&buzzer_mutex); mutex_unlock(& ...
- eclipse启动报错 java was started but returned exit code = -805306369
前几天还工作的好好的eclipse昨天下午启动时突然报错 报错如图: 妹的,好端端突然报错,非常奇怪,关键还是返回一堆看不懂的东西,细看都是eclipse.ini里面的配置信息,看到熟悉的jdk,误以 ...
- poj -3614 Sunscreen(贪心 + 优先队列)
http://poj.org/problem?id=3614 有c头奶牛在沙滩上晒太阳,每头奶牛能忍受的阳光强度有一个最大值(max_spf) 和最小值(min_spf),奶牛有L种防晒霜,每种可以固 ...
- POJ -3050 Hopscotch
http://poj.org/problem?id=3050 给定一个5×5矩阵,问选6个数的不同排列总数是多少! 二维的搜索,注意要判重,数据量很小,直接用map就好. #include<cs ...
- php面向对象(一) 初窥
初窥php面向对象 1.类:类就是属性和方法的集合 是一个抽象的概念比如生活中的“人”,"汽车"2.对象:对象是具体的事物 比如一叫“小强”的人 一辆叫“奥迪a7”的汽车3.类和对 ...
- Using dblink in Postgres
select contractid from tcim_s_enterprice EXCEPT select contractid from dblink ( 'host=172.16.51.25 p ...
- System.Linq.Dynamic
http://dynamiclinq.codeplex.com/ 10万回 用动态表达式 0.19s ,普通Lamba 0.02s,效率还可以 /* User: Peter Date: 2016/4/ ...
- HDU 1072 (不一样的入队条件) Nightmare
之前的BFS都是需要一个标记数组,但这个题不一样,因为可能一个格子不止走一次. 那么我们就要寻找新的入队条件:left比上次经过的时候大才入队(left表示上次经过该点时剩余的时间). 为什么呢?我们 ...
- UVa 1587 Box
题意:给出6个矩形的长和宽,问是否能够构成一个长方体 先假设一个例子 2 3 3 4 2 3 3 4 4 2 4 2 排序后 2 3 2 3 3 4 3 4 4 2 4 2 如果要构成一个长方体的话, ...
- 转:整理一下Entity Framework的查询
Entity Framework是个好东西,虽然没有Hibernate功能强大,但使用更简便.今天整理一下常见SQL如何用EF来表达,Func形式和Linq形式都会列出来(本人更喜欢Func形式). ...