#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;
}
分享到:
相关推荐
总之,无向图的DFS和BFS遍历是图论中的基础操作,它们在许多问题中起到关键作用,如路径查找、拓扑排序和寻找连通分量等。理解和掌握这些概念以及如何在实际编程中实现它们,对于提升在算法和数据结构方面的技能非常...
DFS在有向图和无向图中都能应用。 **DFS的步骤:** 1. 从起点开始,标记为已访问。 2. 访问该节点的未访问邻接节点。 3. 对每个邻接节点递归执行DFS。 4. 回溯到上一个节点,重复步骤2和3,直到所有可达节点都被...
总结来说,无向图的DFS和BFS遍历是图论中的基础操作,它们在解决许多问题中发挥着重要作用,如寻找最短路径、检测环路、判断连通性等。熟练掌握这两种遍历方法及其实现是IT从业者必备的技能之一。通过具体编程实现,...
- **连通性判断**:通过DFS或BFS遍历图的所有节点,若能从任意一点到达其他所有点,说明图是连通的。 - **最短路径问题**:例如Dijkstra算法,利用BFS寻找图中两个节点间的最短路径。 - **拓扑排序**:对于有向无环...
本话题将深入探讨如何使用邻接矩阵来实现无向图的广度优先搜索(BFS)和深度优先搜索(DFS)的文件操作。 首先,邻接矩阵是一个二维数组,其中的元素代表图中节点之间的连接。如果节点i与节点j之间有一条边,那么在...
1. **图的存储结构**:实验要求使用邻接表来存储连通无向图。在邻接表中,每个顶点都有一个链表,链表中的节点代表与该顶点相连的其他顶点。这种结构适合处理稀疏图,即边的数量远小于顶点数量的平方。 2. **深度...
本主题将详细介绍有向图和无向图的深度优先遍历(DFS)与宽度优先遍历(BFS),并探讨递归和非递归两种实现方式。 首先,我们来理解有向图和无向图的区别。有向图的边具有方向性,即从一个节点指向另一个节点,而无...
在计算机科学中,图是一种数据结构,...总的来说,这个项目涵盖了无向图的基本操作,包括构建、遍历和查询,这些都是图算法和数据结构学习的重要组成部分。通过理解和实践这些概念,可以增强对图论和C++编程的理解。
在这个程序设计任务中,我们需要实现的是连通无向图的深度优先遍历(DFS)和广度优先遍历(BFS),这两种遍历方法是图算法的基础。无向图指的是图中的边没有方向,即任意两个节点之间可以双向连接。 1. **邻接表和...
无向图建立、深度优先遍历和广度优先遍历实现算法 本文将详细介绍无向图的建立、深度优先遍历和广度优先遍历的实现算法。这些算法是数据结构中非常重要的内容,掌握它们对后续学习和应用非常重要。 一、无向图的...
无向图的遍历是指从图中的某个起点出发,按照一定的规则访问图中所有节点的过程。遍历的主要目的是探索图的所有节点并确保每个节点只被访问一次。常见的遍历方法有两种:深度优先搜索(DFS,Depth-First Search)和...
无向图主要包括双方面内容,图的遍历和寻找联通分量。 无向图的遍历 无向图的遍历有两种方式—广度优先搜索(BFS)和深度优先搜索(DFS)。广度优先搜索在遍历一个顶点的全部节点时,先把当前节点全部相邻节点遍历了。...
Prim算法用于找到加权无向图的最小生成树,而Dijkstra算法是单源最短路径问题的一种解决方案。 - `8.5 所有简单路径.cpp`:可能实现了找出图中所有起点到终点的简单路径的代码,可能涉及到DFS或BFS的变种。 - `8.2 ...
本主题主要探讨如何建立无向图的邻接表存储结构,并实现深度优先搜索(DFS)和广度优先搜索(BFS)这两种遍历方法。 1. **邻接表**:相比于邻接矩阵,邻接表更适合于存储稀疏图(边的数量远小于顶点数量的平方)。...
对于无向图,邻接表包含两部分:出边列表和入边列表;而对于有向图,通常只需要出边列表。邻接表适合表示稀疏图,因为它只存储实际存在的边,空间效率较高。 DFS是一种递归的遍历策略,从起始节点开始,探索尽可能...
在本文档中,我们讨论了如何使用C语言实现无向图的深度优先遍历(DFS)和广度优先遍历(BFS)。首先,我们需要理解数据结构中的图,它由顶点(vertices)和边(edges)组成,无向图意味着边没有方向。图的存储通常有...
- 拓扑排序:对于无环有向图(DAG),DFS可以用于进行拓扑排序,将节点按照它们的访问顺序排列。 - 最短路径:BFS在寻找图中的最短路径问题(如BFS树)中非常有用,例如Dijkstra算法就是基于BFS思想。 总结起来,...
本主题将详细介绍两种主要的无向图遍历方法:深度优先搜索(DFS,Depth-First Search)和广度优先搜索(BFS,Breadth-First Search),以及如何使用邻接多重表作为存储结构来实现这两种遍历。 首先,我们来理解邻接...
Prim算法是求解最小生成树的一种方法,适用于加权无向图。它从一个顶点开始,逐步添加边到当前生成树中,使得每次添加的边连接的是两个不同的树且具有最小权重,直到所有顶点都被包含。可以使用优先队列或者 ...
实验中,无向图G1和有向图G2的BFS遍历结果不同,原因是有向图中边的方向性导致了顶点的访问顺序变化。 在实验报告中,我们还会探讨图结构在人工智能和工程领域的应用,例如路径规划、网络爬虫、社交网络分析等。...