用邻接表实现DFS和BFS
#include <stdio.h>
#include <stdlib.h>
#define MAXVERTEX 10
typedef char VertexType; //顶点类型
typedef int EdgeType; //边的类型
typedef int ElemType; //队列中元素类型
typedef struct EdgeNode
{
int adjvex;
EdgeType weight;
struct EdgeNode *next;
}EdgeNode; //在邻接表中存放邻接顶点下标值的结点
typedef struct VertexNode
{
int Flag;
int vertex;
VertexType data;
EdgeNode *firstedge;
}VertexNode,AdjList[MAXVERTEX]; //定义一个MAXVERTEX个顶点的邻接表
typedef struct GraphAdjList
{
AdjList adjList;
int numVertex;
int numEdge;
}GraphAdjList; //定义一个图 typedef struct QNode
{
ElemType qData;
struct QNode *nextNode;
}QNode; //定义队列的结点
typedef struct QueueList
{
QNode *front;
QNode *rear;
}QueueList,*queue; //定义一个队列 //初始化队列
void InitQueue(QueueList *Q)
{
Q->front = (QNode*)malloc(sizeof(QNode));
if( Q->front == NULL )
{
printf("Error!");
exit(0);
}
Q->rear = Q->front;
// Q->rear = NULL;
Q->front->nextNode = NULL;
} //插入一个结点到队列
void InsertQueue(QueueList *Q,ElemType *e)
{
QNode *p;
p = (QNode *)malloc(sizeof(QNode));
p->qData = *e;
p->nextNode = NULL;
Q->rear->nextNode = p;
Q->rear = p;
} //删除队列中的结点(出队列)
void DeleteQueue(QueueList *Q,ElemType *e)
{
QNode *s;
if(Q->front == Q->rear)
{
return;
}
s = Q->front->nextNode;
*e = s->qData;
Q->front->nextNode = s->nextNode;
if(Q->front->nextNode == NULL)
{
Q->rear = Q->front;
}
free(s);
return;
} void CreateGraph(GraphAdjList *G) //构建一个我们要遍历的图
{
int i = 0,j = 0,k = 0;
EdgeNode *s;
VertexType c;
printf("请输入图的顶点数和边数,中间用英文逗号隔开 :\n");
scanf("%d,%d",&G->numVertex,&G->numEdge);
printf("请输入各个顶点中存放的数据:\n");
fflush(stdin);
scanf("%c",&c);
while(i < G->numVertex)
{
if(c == '\n')
{
break;
}
G->adjList[i].data = c;
G->adjList[i].Flag = 0;
G->adjList[i].vertex = i;
G->adjList[i].firstedge = NULL;
i++;
scanf("%c",&c);
}
fflush(stdin);
for(k = 0;k < G->numEdge;k++)
{
printf("请输入边Vi~Vj依附的顶点下标 i 和 j :\n");
scanf("%d,%d",&i,&j);
s = (EdgeNode*)malloc(sizeof(EdgeNode));
s->adjvex = j;
s->next = G->adjList[i].firstedge;
G->adjList[i].firstedge = s;
s = (EdgeNode*)malloc(sizeof(EdgeNode));
s->adjvex = i;
s->next = G->adjList[j].firstedge;
G->adjList[j].firstedge = s;
}
}
//查看邻接表是否构建的正确,这个函数只是为了验证
void print(GraphAdjList *G)
{
int i = 0;
EdgeNode *p;
for(i = 0;i < G->numVertex;i++)
{
printf("\n %d->",i);
p = G->adjList[i].firstedge;
while(p)
{
printf("%d->",p->adjvex);
p = p->next;
}
printf("End\n");
}
} //DFS遍历
void DFSTraverse(GraphAdjList *G,int i)
{
int j = 0;
EdgeNode *p;
G->adjList[i].Flag = 1;
printf("%c->",G->adjList[i].data);
p = G->adjList[i].firstedge;
while(p != NULL)
{
if(G->adjList[p->adjvex].Flag == 0)
{
DFSTraverse(G,p->adjvex);
}
p = p->next;
}
}
//判断队列是否为空
int QueueEmpty(QueueList *Q)
{
if(Q->front == Q->rear)
return 0;
else
return 1;
}
//BFS遍历
void BFSTraverse(GraphAdjList *G)
{
int i = 0,k = 0,flag = 0;
EdgeNode *s;
QueueList Q;
InitQueue(&Q);
for(i = 0;i < G->numVertex;i++)
{
G->adjList[i].Flag = 0;
}
for(i = 0;i < G->numVertex;i++)
{
if(G->adjList[i].Flag == 0)
{
G->adjList[i].Flag = 1;
// printf("%c ",G->adjList[i].data);
InsertQueue(&Q,&i);
while(QueueEmpty(&Q))
{
DeleteQueue(&Q,&i);
printf("%c->",G->adjList[i].data);
s = G->adjList[i].firstedge;
while(s != NULL)
{
k = s->adjvex;
if(G->adjList[k].Flag == 0)
{
G->adjList[k].Flag = 1;
// printf("%c ",G->adjList[k].data);
InsertQueue(&Q,&(s->adjvex));
}
s = s->next;
} }
}
}
printf("End\n");
} int main()
{
int k = 0; //深度优先遍历从第1个顶点(按输入顺序)开始
GraphAdjList *G;
CreateGraph(G);
printf("\n顶点的邻接表为:\n");
print(G); //按照头插法得到的邻接表
printf("\nDFS的结果是:\n");
DFSTraverse(G,k); //深度优先遍历
printf("End\n");
printf("\nBFS的结果是:\n");
BFSTraverse(G); //广度优先遍历
return;
}
用邻接表实现DFS和BFS的更多相关文章
- PAT1013. Battle Over Cities(邻接矩阵、邻接表分别dfs)
//采用不同的图存储结构结构邻接矩阵.邻接表分别dfs,我想我是寂寞了吧,应该试试并查集,看见可以用并查集的就用dfs,bfs代替......怕了并查集了 //邻接矩阵dfs #include< ...
- JAVA实现图的邻接表以及DFS
一:定义邻接表结构储存图 package 图的遍历; //邻接表实现图的建立 //储存边 class EdgeNode { int index; // 习惯了用index,其实标准写法是(adjVer ...
- All Roads Lead to Rome(30)(MAP【int,string】,邻接表,DFS,模拟,SPFA)(PAT甲级)
#include<bits/stdc++.h>using namespace std;map<string,int>city;map<int,string>rcit ...
- POJ 1724 ROADS(使用邻接表和优先队列的BFS求解最短路问题)
题目链接: https://cn.vjudge.net/problem/POJ-1724 N cities named with numbers 1 ... N are connected with ...
- 【数据结构】图的基本操作——图的构造(邻接矩阵,邻接表),遍历(DFS,BFS)
邻接矩阵实现如下: /* 主题:用邻接矩阵实现 DFS(递归) 与 BFS(非递归) 作者:Laugh 语言:C++ ***************************************** ...
- 数据结构 《2》----基于邻接表表示的图的实现 DFS(递归和非递归), BFS
图通常有两种表示方法: 邻接矩阵 和 邻接表 对于稀疏的图,邻接表表示能够极大地节省空间. 以下是图的数据结构的主要部分: struct Vertex{ ElementType element; // ...
- 数据结构学习笔记05图 (邻接矩阵 邻接表-->BFS DFS、最短路径)
数据结构之图 图(Graph) 包含 一组顶点:通常用V (Vertex) 表示顶点集合 一组边:通常用E (Edge) 表示边的集合 边是顶点对:(v, w) ∈E ,其中v, w ∈ V 有向边& ...
- 邻接表实现Dijkstra算法以及DFS与BFS算法
//============================================================================ // Name : ListDijkstr ...
- 数据结构(11) -- 邻接表存储图的DFS和BFS
/////////////////////////////////////////////////////////////// //图的邻接表表示法以及DFS和BFS //////////////// ...
随机推荐
- android XML解析之DOM解析方式
DOM 解析方式步骤: 第一步:首选需要获得DOM解析器工厂实例 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance ...
- 百度Echarts使用心得
echarts官网:http://echarts.baidu.com/index.html 最近用了echart,有一下问题需要注意: 1.echarts的使用实例 代码:从地图中取得whitejso ...
- hibernate联合主键注解配置
在网上看到好多方法,结果拿来用还是出现了一些问题.现在整理一下 1.主键类 import javax.persistence.Column; public class UserRoleUionPK i ...
- python运维开发(十)----IO多路复用线程基本使用
内容目录: python作用域 python2.7和python3.5的多继承区别 IO多路复用 socketserver模块源分析 多线程.进程.协程 python作用域 python中无块级作用 ...
- Python成长之路第二篇(1)_数据类型内置函数用法
数据类型内置函数用法int 关于内置方法是非常的多这里呢做了一下总结 (1)__abs__(...)返回x的绝对值 #返回x的绝对值!!!都是双下划线 x.__abs__() <==> a ...
- MYSQL truncate table
准备: 要说truncate table 就要先说一下delete 它们两个都可以用来从表中删除数据行!表面上看是delete 删除的慢一些,truncate table 快一些. delete : ...
- 解决Java调用Azure SDK证书错误javax.net.ssl.SSLHandshakeException
Azure作为微软的公有云平台,提供了非常丰富的SDK和API让开发人员可以非常方便的调用的各项服务,目前除了自家的.NET, Java, Python, nodeJS, Ruby,PHP等语言都提供 ...
- Nginx 配置指令的执行顺序(二)
我们前面已经知道,当 set 指令用在 location 配置块中时,都是在当前请求的 rewrite 阶段运行的.事实上,在此上下文中,ngx_rewrite 模块中的几乎全部指令,都运行在 rew ...
- Android Studio 如何导入第三方jar 包
第一步: 将第三方jar包加入到libs文件夹中 第二步: 分为两种情况 第一种是打开工程所在Project Structure,然后选择Dependencies,点击那个加号选择File Depen ...
- Oracle EBS-SQL (PO-13):检查报价单.sql
select pha.segment1 报价单号 -- ,pha.end_date -- ,decode(pha.status ...