用邻接表实现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 //////////////// ...
随机推荐
- 自学HTML的几个例子
此处不赘述HTML中不同标签的用法仅仅给出自己学习时写的一些自娱自乐的例子,具体标签用法请参考W3C(http://www.w3school.com.cn/),毕竟这个才是最靠谱的,请不要相信任何二道 ...
- .net web api 一
web api可以提供方便简单可靠的web服务,可以大量的用于不需要提供复杂的soap协议的环境,以简单明了的形式返回数据,在不太复杂的环境中web api可以做为wcf等重级web服务的一种可替代方 ...
- 写sql语句注意事项
做管理系统的,无论是bs结构的还是cs结构的,都不可避免的涉及到数据库表结构的设计,sql语句的编写等.因此在开发系统的时候,表结构设计是否合理,sql语句是否标准,写出的sql性能是否优化往往会成为 ...
- CodeForces 698A - Vacations (Codeforces Round #363 (Div. 2))
要么去体育馆,要么去比赛,要么闲在家里 给出每一天体育馆和比赛的有无情况,要求连续两天不能去同一个地方 问最少闲几天 DP方程很容易看出 dp(第i天能去的地方) = min(dp(第i-1天的三种情 ...
- IRP 与 派遣函数
什么是派遣函数: 派遣函数是 WIndows 驱动程序中的重要概念.驱动程序的主要功能是负责处理I/O请求,其中大部分I/O请求是在派遣函数中处理的.也就是说,派遣函数是用来处理驱动程序提交过来的 I ...
- 基于java的InputStream.read(byte[] b,int off,int len)算法学习
public int read(byte[] b, int off, int len) throws IOException 将输入流中最多 len 个数据字节读入字节数组.尝试读取多达 len 字节 ...
- 使用ThinkPHP开发中MySQL性能优化的最佳21条经验
使用ThinkPHP开发中MySQL性能优化的最佳21条经验讲解,目前,数据库的操作越来越成为整个应用的性能瓶颈了,这点对于Web应用尤其明显.关于数据库的性能,这并不只是DBA才需要担心的事,而这更 ...
- iOS正则表达式的使用
@import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/c ...
- Linux下Nginx+PHP 简单安装配置
测试环境 Linux 2.6.18nginx-1.0.4 http://www.nginx.org/php-5.3.6 http://www.php.net/ 一,安装Nginxwget http:/ ...
- PCB電路板為何要有測試點?
對學電子的人來說,在電路板上設置測試點(test point)是在自然不過的事了,可是對學機械的人來說,測試點是什麼?可能多還有點一頭霧水了.我記得我第一次進電子組裝廠工作當製程工程師的時候,還曾經為 ...