用邻接表实现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 //////////////// ...
随机推荐
- bach cello
http://bachlb.blog.163.com/blog/static/1819105120073275251223 一个偶然的机会,卡萨尔斯的父亲来巴塞罗那看卡萨尔斯,并且一起去逛了一间海边的 ...
- JQ 复制节点
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- Python-windows服务-重启自动化
一. 前言 有了上一篇的“python初学”的基础,咱们就有了python的开发包,有了开发环境IDE,那我们就可以干活了.我的第一个选题就是让我们的windows服务可以按照我们的意愿进行自动重启. ...
- hdu2309ICPC Score Totalizer Software
Problem Description The International Clown and Pierrot Competition (ICPC), is one of the most disti ...
- USACO 1.4 ariprog 解题报告
这是继虫洞之后又让我为难的一个 剪枝题目,无论如何,做的再快,也只能过6个点,最后三个点也TLE.后来参考了一下标答,大概思路是这样的. 朴素算法就不多说了,枚举a,b然后判断就行,网上说这样优化到位 ...
- VS2013 编译错误 error: MSB8031
VS2010 创建的 MFC 程序,用 VS2013 打开后编译出现错误: C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V120\Microso ...
- 关于ajax提交的公共接口的一大用处
在项目框架搭建的时候,就写了ajax提交的公共接口,是想统一的日志和处理ajax返回的错误信息. 今天,却又帮我解决了另外一个问题:每次点开某个页面,有一个ajax请求总是会调用两次,于是打开chro ...
- 重写QSqlTableModel的flags函数实现tableview中某些列不可编辑,某些可以编辑
Qt中使用QsqlTableModel和QTableView来显示数据库的查询结果是非常方便的,但是为了使QTableView中某些了列不可用,就需要重写 Qt::ItemFlags flags(co ...
- Android 使用网络ADB调试.
前提: android Phone和PC在同一局域网内. android Phone 有虚拟终端(CM系统集成了ADB网络调试,比较赞.); 1.在android phone虚拟终端输入 stop a ...
- wxwidgets demo
环境说明: IOS: mac 10.9 wx: wxWidgets-2.9.5 (http://www.wxwidgets.org/downloads/) gcc: $gcci686-apple- ...