用邻接表实现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 //////////////// ...
随机推荐
- XML.ObjTree -- XML source code from/to JavaScript object like E4X
转载于:http://www.kawa.net/works/js/xml/objtree-try-e.html // ========================================= ...
- Android开发中一些常见的问题解决方案
分享一下自己开发中遇到的一些常见问题及解决方案,方面以后快速开发少走弯路,也可以供大家一起学习. 1.开发中很常见的一个问题,项目中的listview不仅仅是简单的文字,常常需要自己定义listvie ...
- 简单的oracle sql 语句
创建表空间 create tablespace qnhouse --表空间文件路径 datafile 'E:\qnhost\qnhouse.dbf' --表空间文件大小 size 100M; 创建用户 ...
- 【Remoting-4】
[服务对象三种激活方式的不同] [1]客户端激活方式 [A]对象的创建,对象方法的执行都是在远程服务端. [B]服务端为每一个客户端创建其专属的对象,为这个客户提供服务,并且保存状态 [C]可以从远程 ...
- hdu2304Electrical Outlets
Problem Description Roy has just moved into a new apartment. Well, actually the apartment itself is ...
- LInux系统及其文件系统
Linux系统:Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用户.多任务.支持多线程和多CPU的操作系统.它能运行主要的UNIX工具软件.应用程序和网络协 ...
- R - 递推
Description 我们看到过很多直线分割平面的题目,今天的这个题目稍微有些变化,我们要求的是n条折线分割平面的最大数目.比如,一条折线可以将平面分成两部分,两条折线最多可以将平 ...
- Android 开发使用lambda实现< JDK8兼容
代码精简无疑是每个程序员的目标,简短易读.java 8中的lambda表达式的使用: 4 easy steps Download and install jdk8. Add the following ...
- 纯CSS3技术 加载中
你能相信吗?这些都是由一个DIV元素实现的动画,纯CSS3技术 html <div class="loader">加载中...</div> css: 图( ...
- 新版703n刷openwrt
自带的官方固件: 3.17.1 Build 140120 Rel.56593n WR703N v1 00000000 在不能web页面刷固件,因为带了校验功能. 老外给出了不上TTL刷路由的方法: h ...