用邻接表实现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 //////////////// ...
随机推荐
- 转载 Eclipse下的SSH开发例子
前言 确实好久没有写过了,一直以来把写博文当作自己学习的总结,当作做过的笔记,随时都可以拿出来看看.不过最近习惯了用OneNote和印象笔记,所以就很少在论坛写博文.但是偶尔看到几篇被转载了,也小小的 ...
- Ubuntu中nfs服务器安装与配置
一.执行命令 sudo apt-get install nfs-kernel-server 二.为创建nfs文件夹 sudo mkdir /usr/nfs 更改目录权限:sudo chmod 777 ...
- Linq to DataSet 和 DataSet使用方法学习
简单入门: using System; using System.Collections.Generic; using System.Linq; using System.Text; using Sy ...
- Spring配置扫描mybatis的mapper文件注意:
一般会将不业务的mapper文件放到不同的包中: spring配置扫描就需要配置下面的方式(两个*): <!-- mybatis文件配置,扫描所有mapper文件 --> <bean ...
- 我用爬虫一天时间“偷了”知乎一百万用户,只为证明PHP是世界上最好的语言
我用爬虫一天时间“偷了”知乎一百万用户,只为证明PHP是世界上最好的语言 2015-08-06 猿圈 我用爬虫一天时间“偷了”知乎一百万用户 只为证明PHP是世界上最好的语言 看了不少朋友圈里推荐的P ...
- Windows上Python3.5安装Scrapy(lxml)
常用网址: Python 3.5: https://www.python.org/downloads/ Wheel文件:http://www.lfd.uci.edu/~gohlke/pythonlib ...
- 显示Title和隐藏Title的ListView
一.主要步骤 ①.调用ListView的addHeaderView(),创建一个与Title一样高的View,这样ListView就不会刚开始被遮盖了 ②.调用ListView的setOnTouchE ...
- js跑马灯效果
function nextPage() { /* 克隆第一张图片并添加到box后 box前移一张图片的距离动画 动画回调里把box的 ...
- Java魔法堂:打包知识点之META-INF/MAINFEST.MF(转)
一.前言 通过执行形如 jar -cvf src.jar src 命令将多个.class文件打包成JAR包时,你会发现JAR包中除了src目录外还多了个MATE-INF/MAINFEST.MF,那是为 ...
- Linux下安装nfs服务器
1. 安装nfs服务 $sudo apt-get install nfs-kernel-server portmap 2. 在配置文件/etc/exports中添加以下内容/home/jxhui/nf ...