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

2023-11-07

一、算法代码

//采用邻接表表示图的遍历
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#define MAXSIZE 100
typedef int VerTexType;
int visited[MAXSIZE];			//访问数组
typedef struct ArcNode{			//边结点
	int adjvex;					//结点位置
	ArcNode *nextarc;			//指向下一结点的指针
}ArcNode;
typedef struct VNode{			//头结点
	VerTexType data;			//顶点信息
	ArcNode *firstarc;			//指向第一条依附该顶点的边的指针
}Vnode;
typedef struct{
	Vnode verxs[MAXSIZE];		//顶点表
	int numNodes,numEdqes;		//顶点数和边数
}AGraph;
AGraph* CreatAGraph();
void DFSTraverse(AGraph G);		//深度优先遍历
void BFSTraverse(AGraph G);		//广度优先遍历
int main(){
	AGraph * G;
	printf("\n---采用邻接表表示图的遍历---\n\n");
	G=CreatAGraph();
	printf("\n-----------邻接表深度优先搜索遍历序列---------------\n\n");
	DFSTraverse(*G);
	printf("\n-----------邻接表广度优先搜索遍历序列---------------\n\n");
	BFSTraverse(*G);
	printf("\n\n");
	system("pause");
	return 0;
}


//--------------------------链队列定义-------------------------------------------------
//链队列的结构
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;
}
//--------------------------创建图-------------------------------------------------
int LocateVex(AGraph *G,int v1){
	for(int i=0;i<G->numNodes;i++){
		if(G->verxs[i].data==v1) return i;
	}
	return 0;
}
AGraph* CreatAGraph(){
	AGraph *G=(AGraph*)malloc(sizeof(AGraph));		
	printf("请输入要创建图的顶点数和边数:(空格间隔)\n");
	scanf("%d %d", &G->numNodes, &G->numEdqes);		//输入总顶点数,总边数
	getchar();
	printf("请输入%d个顶点的值:(空格间隔)\n",G->numNodes);
	for(int i=0;i<G->numNodes;i++){					//输入各点,构造表头结点表
		scanf("%d",&G->verxs[i].data);				//输入顶点值
		G->verxs[i].firstarc=NULL;					//初始化表头结点的指针域
	}
	printf("请输入弧尾和弧头:(空格间隔)\n");
	for(int k=0;k<G->numEdqes;++k){					//输入各边,构造邻接表
		int v1,v2,i,j;
		scanf("%d %d",&v1,&v2);						//输入一条边依附的两个顶点
		i=LocateVex(G,v1);							//两个顶点位置
		j=LocateVex(G,v2);
		ArcNode *p=(ArcNode*)malloc(sizeof(ArcNode));			//生成一个新的边结点*p
		p->adjvex=j;								//邻接点序号为j
		p->nextarc=G->verxs[i].firstarc;
		G->verxs[i].firstarc=p;						//将新结点*p插入顶点verxs[i]的边表头部
		p=(ArcNode*)malloc(sizeof(ArcNode));		//生成另一个对称的新的边结点*p
		p->adjvex=i;								//邻接点序号为i
		p->nextarc=G->verxs[j].firstarc;
		G->verxs[j].firstarc=p;					//将新结点*p插入顶点verxs[j]的边表头部
	}
	return G;
}

//-----------------------------深度优先遍历-----------------------------------------
void DFS(AGraph G,int v){
	ArcNode *p;
	visited[v]=1;
	printf("%d ",G.verxs[v].data);
	p=G.verxs[v].firstarc;
	while(p!=NULL){
		if(visited[p->adjvex]==0){
			DFS(G,p->adjvex);
		}
		p=p->nextarc;	
	}
} 
void DFSTraverse(AGraph G){
	for(int i=0;i<G.numNodes;i++)
		visited[i]=0;	//初始化所有结点为未访问
	for(int i=0;i<G.numNodes;i++)
		if(!visited[i]) DFS(G,i);
}
//-----------------------------广度优先遍历----------------------------------------

void BFSTraverse(AGraph G){
	LinkQueue q;							//初始化队列q
	initQueue(&q);							//初始化标志数组
	for (int i=0;i<G.numNodes;i++) visited[i] = 0;
	for (int i=0; i<G.numNodes;i++){
		if (visited[i]==0){
			visited[i]=1;
			printf("%d ",G.verxs[i].data);
			EnQueue(&q,i);					//将下标i入队列
			while(!QueueEmpty(q)){
				int index;
				DeQueue(&q,&index);			//出队列
				//边表结点指针s用来遍历边表
				ArcNode* s=G.verxs[index].firstarc;
				while(s!=NULL){
					if(visited[s->adjvex]==0){
						visited[s->adjvex]=1;
						printf("%d ",G.verxs[s->adjvex].data);
						EnQueue(&q,s->adjvex);
					}
					s=s->nextarc;
				}
			}
		}
	}
}

二、运行结果

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

(深度/广度优先算法)——遍历邻接表(C语言) 的相关文章

随机推荐

  • Ant Design of Vue动态生成菜单项

    有这样一种情况 需要
  • 1. 嵌入式OpenWRT入门基础篇-----OpenWRT源码下载、编译

    之前一直在做关于op系统的项目 现在不从事这一行了 或许以后也不会了 趁现在还有点记忆 因此在此也算记录一下以前的工作吧 因为OpenWRT是一个很完善的系统 本系列博客也是按照整个系统的开发步骤进行的 本人技术水平不精 如有错误之处 还望
  • Kubernetes初始化集群时报错[ERROR Port-10259]: Port 10259 is in use

    错误原因 节点被占用 报错信息 W0823 00 33 45 142456 107567 validation go 28 Cannot validate kube proxy config no validator is availabl
  • Qt动态属性

    动态属性 在标准C 中 为了保证封装性 我们经常声明一个私有变量 然后声明两个公有函数 即set函数和get函数 在Qt中我们可以使用宏Q PROPERTY 宏来实现这些 一个属性可以使用常规函数QObject property 和QObj
  • 程序员赚钱致富的6种方法

    我认识一个朋友 也是程序员出身 他在一家还不错的外企上班 每个月工资收入也就差不多15K 五年的工作经验了 在他面前 我算是小弟 那天我们几个朋友一起打完球就去附近的饭馆吃饭 环境还不错 于是就边吃边聊工作 赚钱的事情 那天了解到 他不仅拿
  • macOS查看IP地址的命令

    查看内网的 IP 地址 ipconfig getifaddr en0 Last login Thu Aug 11 17 13 00 on ttys000 grnt wMacBook Pro ipconfig getifaddr en0 19
  • nginx用户认证配置

    1 用户认证模块 在 nginx 下 提供了 ngx http auth basic module 模块实现让用户只有输入正确的用户名密码才允许访问web内容 默认情况下 nginx 已经安装了该模块 所以整体的一个过程就是先用第三方工具设
  • GUI编程—PyQt5学习笔记1

    GUI 图形用户界面 Graphical User Interface 简称 GUI 又称图形用户接口 是指采用图形方式显示的计算机操作用户界面 PyQt5常用模块 QtWidgets 包含了一整套UI元素控件 用于建立符合系统风格的界面
  • 启动mysql服务报错:mysql服务无法启动

    一 问题描述 之前mysql服务好好的 突然无法启动了 win10系统 64位 mysql8 0 23 二 问题解决 1 mysqld console命令查看具体报错 C WINDOWS system32 gt mysqld console
  • C++ 2:new和delete,volatile关键字,auto关键字,基于范围for循环,string简单使用

    文章目录 1 B Tree 的结构设计 2 new和delete 2 1 new的三种用法 2 2 对于内置类型new delete malloc free 可以混用 3 C11的新特性 3 1 类型推导 3 2 auto的推导规则 3 2
  • geeksforgeeks —— 算法 1

    目录 算法 一 查找和排序 1 1 线性查找 1 2 二分查找 1 3 跳跃搜索 1 4 插值搜索 1 5 指数搜索 1 6 为什么二元搜索优于三元搜索 1 7 选择排序 1 8 冒泡排序 1 9 插入排序 1 10 归并排序 1 11 堆
  • 关于指针大小(c语言)

    32位系统默认指针大小为4个字节 8位为一个字节 因为32位系统默认的内存寻址空间是4G 所以指针大小为4个字节可以完成对4G空间的寻址 2 32约为4个G 64位系统默认指针大小为8个字节 理论上寻址空间可达到1800万个TB 指针大小为
  • git给服务器传文件在哪里,git上传文件服务器地址

    git上传文件服务器地址 内容精选 换一换 在本地主机和Windows弹性云服务器上分别安装QQ exe等工具进行数据传输 使用远程桌面连接mstsc方式进行数据传输 该方式不支持断点续传 可能存在传输中断的情况 因此不建议上传大文件 文件
  • qt怎么一个程序显示两个窗口

    首先我们要把 ui文件的QMainWindow改成QDialog 用记事本 然后把 ui对应的头文件和 cpp 出现QMainWindow改成QDialog 如图重点其包含头文件定义也记得修改 然后非模态显示 才不堵塞主窗口 然后在主窗口程
  • 星际2正在等待暴雪服务器的响应,win7系统玩星际2一直停留在"正在更新暴雪启动器"页面的解决方法...

    很多小伙伴都遇到过win7系统玩星际2一直停留在 正在更新暴雪启动器 页面的困惑吧 一些朋友看过网上零散的win7系统玩星际2一直停留在 正在更新暴雪启动器 页面的处理方法 并没有完完全全明白win7系统玩星际2一直停留在 正在更新暴雪启动
  • 【交叉二五码及其校验码计算方式】

    一 交叉二五码 交叉二五码是1972年美国Intermec公司发明的一种条 空均表示信息的连续型 非定长 具有自校验功能的双向条码 它的字符集为数字字符0 9 交叉二五条码由左侧空白区 起始符 数据符 终止符及右侧空白区构成 它的每一个条码
  • CentOS 7虚拟机安装常用软件

    依然是虚拟机安装常用软件系列 CentOS 7目前官方支持到2024 还行 1 VMWare 安装CentOS 7 默认都安装成功了 2 换源 更新 阿里源最近老是403 换了网易源 sudo wget O etc yum repos d
  • python对字符串中指定字符进行替换

    1 替换指定的所有字符 string replace a b 表示将字符串string中所有字符为a的替换为b 例子 string abcabcabc string string replace a b print string 输出 bb
  • SpringBoot默认Json框架Jackson解析-基础篇

    1 Springboot返回JSON数据的方式 目前SpringBoot提供的Json格式有三种 Jackson 默认 Gson JsonB 我们都可以在springboot自动配置模块spring boot autoconfigure中查
  • (深度/广度优先算法)——遍历邻接表(C语言)

    一 算法代码 采用邻接表表示图的遍历 include