(深度/广度优先算法)——遍历邻接矩阵(C语言)

本文介绍了如何使用C语言实现深度优先遍历和广度优先遍历邻接矩阵的算法,并提供了相应的代码示例,同时展示了运行结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

算法代码

//采用邻接矩阵表示图的遍历
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 100							//最大顶点数
typedef int VerTexType;						//顶点的数据类型
typedef int EdgeType;						//边的数据类型
typedef struct{
	VerTexType verxs[MAXSIZE];				//顶点表
	EdgeType arcs[MAXSIZE][MAXSIZE];		//邻接矩阵
	int vexnum,arcnum;						//点数和边数
}AMGraph;									//Adjacency Matrix Graph
int visited[MAXSIZE];						//访问数组
void Create_AMGraph(AMGraph * G);			//创建图
void DFSTraverse(AMGraph G);				//深度优先遍历
void BFSTraverse(AMGraph G);				//广度优先遍历
int main(){
	AMGraph G;
	printf("\n---采用邻接矩阵表示图的遍历---\n\n");
	Create_AMGraph(&G);
	printf("\n-----------邻接矩阵深度优先搜索遍历序列---------------\n\n");
	DFSTraverse(G);
	printf("\n-----------邻接矩阵广度优先搜索遍历序列---------------\n\n");
	BFSTraverse(G);
	printf("\n\n");
	system("pause");
	return 0;
}

//--------------------------创建图-------------------------------------------------
void Create_AMGraph(AMGraph * G){
	int i,j,k;
	printf("请输入要创建的顶点数和边数:(空格间隔)\n");
	scanf("%d %d",&G->vexnum,&G->arcnum);	//输入总顶点数,总边数
	getchar();
	printf("请输入%d个顶点的值:(空格间隔)\n",G->vexnum);
	for(i=0;i<G->vexnum;++i){
		scanf("%d",&G->verxs[i]);			//构造顶点表
		getchar();
	}
	for(i=0;i<G->vexnum;++i)
		for(j=0;j<G->arcnum;++j)
			G->arcs[i][j]=0;				//初始化邻接矩阵的元素为0
	printf("请输入邻接顶点的下标:(空格间隔)\n");
	for(k=0;k<G->arcnum;++k){				//构造邻接矩阵
		scanf("%d %d",&i,&j);
		G->arcs[i][j]=1;
		G->arcs[j][i]=G->arcs[i][j];		//对称矩阵
	}
}
//--------------------------链队列定义-------------------------------------------------
//链队列的结构
typedef int QElemType;
typedef struct QNode{	//结点结构
	QElemType data;
	struct QNode *next;
}QNode,*QueuePtr;
typedef struct{			//队列的链表结构
	QueuePtr front,rear;//队头、队尾指针
}LinkQueue;
int initQueue(LinkQueue *q){
	q->front=q->rear=(QueuePtr)malloc(sizeof(QNode));
	if(!q->front) return 0;
	q->front->next=NULL;
	return 1;
}
int EnQueue(LinkQueue *q,QElemType e){
	QueuePtr s=(QueuePtr)malloc(sizeof(QNode));
	if(!s) return 0;
	s->data=e;
	s->next=NULL;
	q->rear->next=s;
	q->rear=s;
	return 1;
}
int DeQueue(LinkQueue *q,QElemType *e){	
	QueuePtr p;	
	if(q->front==q->rear) return 0;
	p=q->front->next;
	*e=p->data;
	q->front->next=p->next;	
	if(q->rear==p) q->rear=q->front;
	free(p);
	return 1;
}
int QueueEmpty(LinkQueue q){
	if(q.front == q.rear) return 1;
	return 0;
}

//-----------------------------深度优先遍历---------------------------------------------
//递归函数
void DFS(AMGraph G,int v){					//图G为邻接矩阵类型
	visited[v]=1;							//访问下标为v的顶点
	printf("%d ",G.verxs[v]);
	for(int j=0;j<G.vexnum;j++)				//依次检查邻接矩阵v所在的行
		if((G.arcs[v][j]!=0)&&!(visited[j]))
			DFS(G,j);						//j是v的邻接点,如果j未访问,则递归调用DFS
}
void DFSTraverse(AMGraph G){
	for(int i=0;i<G.vexnum;i++)
		visited[i]=0;	//初始化所有结点为未访问
	for(int i=0;i<G.vexnum;i++)
		if(!visited[i]) DFS(G,i);
}

//-----------------------------广度优先遍历---------------------------------------------
void BFSTraverse(AMGraph G){
	int i,j;
	LinkQueue Q;
	for(i=0;i<G.vexnum;i++) visited[i] = 0;
	initQueue(&Q);							//初始化一辅助用的队列	
	for(i=0;i<G.vexnum;i++){				//对每一个顶点做循环
		if(!visited[i]){					//若是未被访问过就处理
			visited[i] = 1;					//设置当前顶点访问过
			printf("%d ",G.verxs[i]);		//打印顶点
			EnQueue(&Q,i);					//将此顶点入队列			
			while(!QueueEmpty(Q)){			//若当前顶点不为空
				DeQueue(&Q,&i);	 			//将队中元素出队列,赋值给i
				for(j=0;j<G.vexnum;j++){
					//判断其他顶点若与当前顶点存在边且未被访问过
					if(G.arcs[i][j] ==1 && !visited[j]){
						visited[j] = 1;		//将找到的此顶点标记为已访问
						printf("%d ",G.verxs[j]);//打印此顶点
						EnQueue(&Q,j);		//将找到的此顶点入队列
					}
				}
			}
		}
	}
}

运行结果

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值