数据结构(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)图的 ...
随机推荐
- PHP中对数据库操作的封装
在动态网面设计中很多都要涉及到对数据库的操作,但是有时跟据需要而改用其它后台数据库,就需要大量修改程序.这是一件枯燥.费时而且容易出错的功作.其实我们可以用PHP中的类来实现对数据库操作的封装,从而使 ...
- vmware 虚拟机 桥接 设置静态 IP
最简单的方式: 图形界面下,进入设置IP的地方,设置一个静态IP. 然后再转入命令行继续工作.. 不行就 重启
- windows服务删除后,在次安装时无法安装启动。
当我在windows的cmd下卸载evtsys evtsys -u 再次安装时evtsys.exe -i -h 192.168.32.12 -p 514 提示“指定的服务已标记为删除”,进入服务管理 ...
- vs中常用的快捷键
VS中常用的快捷键: ctrl+s 保存 ctrl+Shift+S 保存所有VS中打开的所有文件 ctrl+O 打开新文件 ctrl+Shift+O 打开项目 ...
- c#获取机器唯一识别码
前言 在客户端认证的过程中,我们总要获取客户机的唯一识别信息,曾经以为MAC地址是不会变的,但是现在各种改,特别是使用无线上网卡,MAC地址插一次变一次,所以这样使用MAC就没有什么意义了,怎么办,又 ...
- 查看mysql存储引擎
一般情况下,mysql会默认提供多种存储引擎,你可以通过下面的查看: 看你的mysql现在已提供什么存储引擎:mysql> show engines; 看你的mysql当前默认的存储引擎:mys ...
- IE6下margin出现双边距
在IE6下,块元素有浮动和横向margin的时候,横向的margin值会被放大成两倍 解决方法:添加display:inline; eg:下面的例子在IE6下会有两倍边距 <style> ...
- Replication in Kafka
Replication简介 Kafka中的Replication功能是为了给每个partition提供备份,当某个Broker挂掉时可以迅速实现故障切换(failover).我们可以在创建或修改top ...
- 高性能WEB开发之Web性能测试工具推荐
Firebug: Firebug 是firefox中最为经典的开发工具,可以监控请求头,响应头,显示资源加载瀑布图: HttpWatch: httpwatch 功能类似firebug,可以监控请求头, ...
- BZOJ 1202 狡猾的商人
前缀和+带权并查集. #include<iostream> #include<cstdio> #include<cstring> #include<algor ...