`
jacobcookie
  • 浏览: 94244 次
社区版块
存档分类
最新评论

无向图的DFS和BFS遍历

 
阅读更多
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX_VER 100//最大顶点数

typedef struct edgnode{//邻接点域
	int vertex;
	struct edgnode *next;
}enode;

typedef struct vnode{
	char data;
	enode *link;
}vlist[MAX_VER];

typedef struct node2{
  int v;    
  struct node2 *next;
}qnode;

typedef struct {
  qnode *front,*rear;
}linkQueue;

int n;
int visited[MAX_VER];//用于标志顶点是否被访问过
vlist g;
linkQueue queue;

void Init(linkQueue *q)
{
	q->front=q->rear=NULL;
}

void InsertQueue(linkQueue * &q,int e)
{
	qnode * node;
	node=(qnode*)malloc(sizeof(qnode));
	node->v=e;
	node->next=NULL;
	if(NULL==q->front)
	{
		q->front=q->rear=node;
	}
	else
	{
		q->rear->next=node;
		q->rear=node;
	}
}

int outQueue(linkQueue * &q)
{
	int e;
	qnode *temp;
	if(NULL==q->front)
		e=NULL;
	else
	{
		temp=q->front;
		e=temp->v;
		q->front=temp->next;
		free(temp);
	}
	return e;
}

//创建无向图
void createGraphic(vlist g)
{
	int e,i=1,start,end;
	enode *p;
	printf("请输入顶点数(n)和边数(e):\n");
	scanf("%d%d",&n,&e);
	while(i<=n) //初始化顶点表
	{
		fflush(stdin);
		printf("请输入第 %d 个顶点:",i);
		g[i].data=getchar();
		g[i].link=NULL;
		i++;
	}
	i=1;
	while(i<=e)//采用头插法初始化邻接点域
	{
		fflush(stdin);
		printf("请输入第 %d 条边的起点和终点:",i);//无向图是双向的 1-2 2-1
		scanf("%d%d",&start,&end);
		p=(enode *)malloc(sizeof(enode));
		p->vertex=end;
		p->next=g[start].link;
		g[start].link=p;
		p=(enode *)malloc(sizeof(enode));
		p->vertex=start;
		p->next=g[end].link;
		g[end].link=p;
		i++;
	}
}

//Breadth First Search 广度优先搜索 相当于树的层次遍历
void BFS(linkQueue *queue,int i)
{
	int temp;
	enode *p;
	InsertQueue(queue,i);
	while(NULL!=queue->front)
	{
		temp=outQueue(queue);
		if(!visited[temp])
		{
			printf("%d ",temp);
			visited[temp]=1;
		}
		p=g[temp].link;
		while(NULL!=p)
		{
			if(!visited[p->vertex])
			{
				InsertQueue(queue,p->vertex);
			}
			p=p->next;
		}
	}
}

//Depth First Search 深度优先搜索 相当于树的先序遍历
void DFS(vlist g,int i)
{
	enode *p;
	printf("%c ",g[i].data);
	visited[i]=1;
	p=g[i].link;
	while(NULL!=p)
	{
		if(!visited[p->vertex])
		{
			DFS(g,p->vertex);
		}
		p=p->next;
	}
}

//遍历每个顶点
void DFSGraphic(vlist g)
{
	int i;
	memset(visited,0,n);
	for(i=1;i<=n;i++)
	{
		if(!visited[i])
		{
			//DFS(g,i);
			BFS(&queue,i);
		}
	}
	printf("\n");	
}

int main()
{
	Init(&queue);
	createGraphic(g);
	DFSGraphic(g);
	return 0;
}

 

0
4
分享到:
评论

相关推荐

    无向图的DFS、BFS遍历

    总之,无向图的DFS和BFS遍历是图论中的基础操作,它们在许多问题中起到关键作用,如路径查找、拓扑排序和寻找连通分量等。理解和掌握这些概念以及如何在实际编程中实现它们,对于提升在算法和数据结构方面的技能非常...

    图的dfs和bfs遍历-c语言版

    DFS在有向图和无向图中都能应用。 **DFS的步骤:** 1. 从起点开始,标记为已访问。 2. 访问该节点的未访问邻接节点。 3. 对每个邻接节点递归执行DFS。 4. 回溯到上一个节点,重复步骤2和3,直到所有可达节点都被...

    图的DFS、BFS遍历补充

    总结来说,无向图的DFS和BFS遍历是图论中的基础操作,它们在解决许多问题中发挥着重要作用,如寻找最短路径、检测环路、判断连通性等。熟练掌握这两种遍历方法及其实现是IT从业者必备的技能之一。通过具体编程实现,...

    图的 DFS 和BFS

    - **连通性判断**:通过DFS或BFS遍历图的所有节点,若能从任意一点到达其他所有点,说明图是连通的。 - **最短路径问题**:例如Dijkstra算法,利用BFS寻找图中两个节点间的最短路径。 - **拓扑排序**:对于有向无环...

    邻接矩阵存储的无向图广度和深度遍历文件操作

    本话题将深入探讨如何使用邻接矩阵来实现无向图的广度优先搜索(BFS)和深度优先搜索(DFS)的文件操作。 首先,邻接矩阵是一个二维数组,其中的元素代表图中节点之间的连接。如果节点i与节点j之间有一条边,那么在...

    数据结构实验报告-图-基于邻接表求连通无向图的DFS与BFS生成树-实验内容与要求.docx

    1. **图的存储结构**:实验要求使用邻接表来存储连通无向图。在邻接表中,每个顶点都有一个链表,链表中的节点代表与该顶点相连的其他顶点。这种结构适合处理稀疏图,即边的数量远小于顶点数量的平方。 2. **深度...

    图的遍历(有向图和无向图)

    本主题将详细介绍有向图和无向图的深度优先遍历(DFS)与宽度优先遍历(BFS),并探讨递归和非递归两种实现方式。 首先,我们来理解有向图和无向图的区别。有向图的边具有方向性,即从一个节点指向另一个节点,而无...

    无向图的建立和遍历(C++)

    在计算机科学中,图是一种数据结构,...总的来说,这个项目涵盖了无向图的基本操作,包括构建、遍历和查询,这些都是图算法和数据结构学习的重要组成部分。通过理解和实践这些概念,可以增强对图论和C++编程的理解。

    无向图建立、深度优先遍历和广度优先遍历实现算法[借鉴].pdf

    无向图建立、深度优先遍历和广度优先遍历实现算法 本文将详细介绍无向图的建立、深度优先遍历和广度优先遍历的实现算法。这些算法是数据结构中非常重要的内容,掌握它们对后续学习和应用非常重要。 一、无向图的...

    邻接表或者邻接矩阵为存储结构实现连通无向图的深度优先和广度优先遍历

    在这个程序设计任务中,我们需要实现的是连通无向图的深度优先遍历(DFS)和广度优先遍历(BFS),这两种遍历方法是图算法的基础。无向图指的是图中的边没有方向,即任意两个节点之间可以双向连接。 1. **邻接表和...

    无向图邻接矩阵的遍历

    无向图的遍历是指从图中的某个起点出发,按照一定的规则访问图中所有节点的过程。遍历的主要目的是探索图的所有节点并确保每个节点只被访问一次。常见的遍历方法有两种:深度优先搜索(DFS,Depth-First Search)和...

    无向图遍历

    无向图主要包括双方面内容,图的遍历和寻找联通分量。 无向图的遍历 无向图的遍历有两种方式—广度优先搜索(BFS)和深度优先搜索(DFS)。广度优先搜索在遍历一个顶点的全部节点时,先把当前节点全部相邻节点遍历了。...

    DFS BFS 图.zip_DFS BFS_bfs_bfs dfs_dfs_dfs bfs输出图

    Prim算法用于找到加权无向图的最小生成树,而Dijkstra算法是单源最短路径问题的一种解决方案。 - `8.5 所有简单路径.cpp`:可能实现了找出图中所有起点到终点的简单路径的代码,可能涉及到DFS或BFS的变种。 - `8.2 ...

    无向图的建立及其遍历

    本主题主要探讨如何建立无向图的邻接表存储结构,并实现深度优先搜索(DFS)和广度优先搜索(BFS)这两种遍历方法。 1. **邻接表**:相比于邻接矩阵,邻接表更适合于存储稀疏图(边的数量远小于顶点数量的平方)。...

    邻接矩阵,邻接表实现图的创建,遍历(DFS,BFS)

    对于无向图,邻接表包含两部分:出边列表和入边列表;而对于有向图,通常只需要出边列表。邻接表适合表示稀疏图,因为它只存储实际存在的边,空间效率较高。 DFS是一种递归的遍历策略,从起始节点开始,探索尽可能...

    C语言:图的DFS和BFS(内附代码和算法思路).docx

    在本文档中,我们讨论了如何使用C语言实现无向图的深度优先遍历(DFS)和广度优先遍历(BFS)。首先,我们需要理解数据结构中的图,它由顶点(vertices)和边(edges)组成,无向图意味着边没有方向。图的存储通常有...

    数据结构图bfs,Dfs遍历算法

    - 拓扑排序:对于无环有向图(DAG),DFS可以用于进行拓扑排序,将节点按照它们的访问顺序排列。 - 最短路径:BFS在寻找图中的最短路径问题(如BFS树)中非常有用,例如Dijkstra算法就是基于BFS思想。 总结起来,...

    无向图的遍历演示(两种遍历方式)

    本主题将详细介绍两种主要的无向图遍历方法:深度优先搜索(DFS,Depth-First Search)和广度优先搜索(BFS,Breadth-First Search),以及如何使用邻接多重表作为存储结构来实现这两种遍历。 首先,我们来理解邻接...

    标准C的图的实现+BFS和DFS遍历+Dijkstra算法+Prim算法+Kruskal算法实现

    Prim算法是求解最小生成树的一种方法,适用于加权无向图。它从一个顶点开始,逐步添加边到当前生成树中,使得每次添加的边连接的是两个不同的树且具有最小权重,直到所有顶点都被包含。可以使用优先队列或者 ...

    图的遍历实验操作

    实验中,无向图G1和有向图G2的BFS遍历结果不同,原因是有向图中边的方向性导致了顶点的访问顺序变化。 在实验报告中,我们还会探讨图结构在人工智能和工程领域的应用,例如路径规划、网络爬虫、社交网络分析等。...

Global site tag (gtag.js) - Google Analytics