数据结构---图的邻接表(创建、打印、深度优先遍历,广度优先遍历C语言)

图论之邻接表 本文介绍了图的邻接表存储方法,使用邻接表存储图要稍微复杂一些,但能够提高空间利用率。本文给出了两种实现方法,一种是链式前向星,另一种是链表实现,链式前向星是利用数组来模拟链表,并且在最后给出了邻接表的一种打印方法。 阅读详情
AI摘要

本文详细介绍了邻接表作为稀疏图存储结构的优势,通过结合顺序存储和链式存储,有效减少存储空间浪费。阐述了邻接表的构建过程,包括顶点表和边表的实现,并提供了创建图、打印边表、深度优先遍历和广度优先遍历的代码示例。

当一个图为稀疏图时,使用邻接矩阵会浪费大量存储空间。

邻接表法结合了顺序存储和链式存储方法,减少了不必要的浪费。

参照博文:https://blog.youkuaiyun.com/qq_39630587/article/details/77409869

邻接表

1)对图G的每个顶点vi建立一个单链表,第i个单链表中的结点表示依附于顶点vi的边(对于有向图则是以顶点vi为尾的弧)。这个单链表就称为顶点vi的边表(对于有向图则称为出边表)。

2)边表的头指针和顶点的数据信息采用顺序存储(称为顶点表)

3)邻接表中存在两种结点:顶点表结点和边表结点

4)顶点表结点由顶点域(data)和指向第一条邻接边的指针(firstarc)构成

5)边表(邻接表)结点由邻接点域(adjvex)和指向下一条邻接边的指针域(nextarc)构成

无向图的邻接表表示

头结点和表结点的表示

有向图的邻接表表示

代码如下:

#include <stdio.h>
#include <malloc.h>
#define  MaxVertices 100
typedef int VertexType;  

/***********边表**********/
typedef struct EdgeNode
{
	int adjvex;      //该边所指向结点的位置
	struct EdgeNode *next;   //该边所指向下一个结点的指针
}EdgeNode;

/*********顶点表*********/
typedef struct 
{
	int vertex;     //顶点的信息
	EdgeNode *edgenext;  //指向第一条边的指针
}VertexNode,AdjList[MaxVertices];

/*********图结构********/
typedef struct
{
	AdjList adjlist;
	int nodeNum;  //顶点数
	int edgeNum;  //边数
}ALGraph;

/*********创建图********/
void create_Graph(ALGraph *G)
{
	int i, j;
	int vi, vj;     //相连接的两个顶点序号
	EdgeNode *s;    //边表结点

	printf("请输入顶点数和边数(以空格隔开)");
	scanf_s("%d%d", &G->nodeNum, &G->edgeNum);

	printf("建立顶点表:\n");
	for (i = 0; i < G->nodeNum; i++)
	{
		//getchar();
		printf("请输入第%d个顶点的信息:", i + 1);
		scanf_s("%d", &G->adjlist[i].vertex);
		G->adjlist[i].edgenext = NULL;
	}

	printf("\n打印顶点下标及顶点数据:\n");
	for (i = 0; i < G->nodeNum; i++)
		printf("顶点下标:%d  顶点数据:%d\n ", i,G->adjlist[i]);

	printf("\n建立边表:\n");
	for (i = 0; i < G->edgeNum; i++)
	{
		printf("请输入相连接的两个顶点下标:");
		scanf_s("%d%d",&vi,&vj );
		s = malloc(sizeof(EdgeNode));
		s->adjvex = vj;    //边所指向结点的位置
		s->next = G->adjlist[vi].edgenext;
		G->adjlist[vi].edgenext = s;

		//输入(0 1)在1中也把0编入
		s = malloc(sizeof(EdgeNode));
		s->adjvex = vi;    //边所指向结点的位置
		s->next = G->adjlist[vj].edgenext;
		G->adjlist[vj].edgenext = s;
	}
}

/***********打印边表*********/
void print_Graph(ALGraph *G)
{
	int i, j;
	for (i = 0; i < G->nodeNum; i++)
	{
		printf("%d->",i);
		while (1)
		{
			if (G->adjlist[i].edgenext == NULL)
			{
				printf("^");
				break;
			}
			printf("%d->", G->adjlist[i].edgenext->adjvex);
			G->adjlist[i].edgenext = G->adjlist[i].edgenext->next;
		}
		printf("\n");

	}
}

/**************深度优先遍历**************/
int visit[maxSize];
void DFS(ALGraph G,int v)
{
	EdgeNode *p;
	if (v<0 || v>=G.nodeNum)
		return;
	else
	{
		visit[v] = 1;     //已经访问标记
		printf("%d ", G.adjlist[v].vertex);
		p = G.adjlist[v].edgenext;   //p指向顶点v的第一条边
		while (p != NULL)
		{
			if (visit[p->adjvex] != 1)
				DFS(G,p->adjvex);
			p = p->next;
		}
	}
}
void DFSTravel(ALGraph G)
{
	int v;
	printf("深度优先遍历顺序为:");
	for (v = 0; v < G.nodeNum; v++)
		visit[v] = 0;
	for (v = 0; v < G.nodeNum; v++)                         
	{
		if (!visit[v])
			DFS(G, v);
	}
}

/***************广度优先遍历*************/
int visitBFS[maxSize];
void BFS(ALGraph G,int v)
{
	EdgeNode *p;
	int que[maxSize], front = 0, rear = 0;   //队列定义的简单写法
	int j;
	printf("%d ", G.adjlist[v].vertex);
	visitBFS[v] = 1;
	rear = (rear + 1) % maxSize;     //当前顶点v进入队列
	que[rear] = v;
	while (front!=rear)     //队空时遍历完成
	{
		front = (front + 1) % maxSize;     //顶点出队
		j = que[front];
		p = G.adjlist[j].edgenext;    //p指向出队顶点j的第一条边
		while (p != NULL)
		{
			if (visitBFS[p->adjvex] == 0)
			{
				printf("%d", p->adjvex);
				visitBFS[p->adjvex] = 1;
				rear = (rear + 1) % maxSize;   //该顶点进队
				que[rear] = p->adjvex;
			}
			p = p->next;
		}
	}
}

void BFSTravel(ALGraph G)
{
	int i;
	printf("\n广度优先遍历顺序为:");
	for (i = 0; i < G.nodeNum; i++)
	{
		if (visitBFS[i] == 0)
			BFS(G, i);
	}
}

void main()
{
	ALGraph *G = malloc(sizeof(ALGraph));
	create_Graph(G);
	print_Graph(G);
        DFSTravel(G);
	system("pause");
}

 

运行示例

无向图如下所示:

 

 

【数据结构与算法】图——邻接表与邻接矩阵 邻接表与邻接矩阵 阅读详情

相关推荐

图的邻接表存储法:高效节省空间的图表示方法

在图论中,图是一种常见的数据结构,用于表示各种实际问题中的关系。图的存储方法有多种,其中邻接表存储法是一种常用且高效的表示方法。本文将详细介绍图的邻接表存储法及其实现原理,同时分析其优缺点,并提供实际应用示例,以帮助读者深入了解和应用这一图表示方法。// 定义图的边结构// 与边相连的当前此顶点的索引Edge* next;// 指向下一个邻接边的指针} Edge;// 定义图的顶点结构// 顶点数据// 指向第一个邻接边的指针} Vertex;// 定义图的邻接表结构。

m0_68805093的博客 2391

图的存储结构——邻接表

图的存储结构之邻接表一、邻接表表示法无向图的邻接表有向图的邻接表有向图的逆邻接表二、图的邻接表存储表示 一、邻接表表示法 回忆在线性表时,顺序存储结构就存在预先分配内存可能造成存储空间浪费的问题,于是引出了链式存储结构,同样的,我们可以考虑对边或弧使用链式存储方式来避免空间浪费问题 邻接表是图的一种链式存储结构。 由两部分组成:表头结点表和边表。 邻接表中每个单链表的第一个结点存放有关顶点的信...

ker的博客 5万+

数据结构(C语言)图的基本操作及应用

图的基本操作及应用 用邻接表法创建无向图 以邻接表形式打印无向图 深度遍历无向图并打印 利用队列知识实现广度遍历无向图并打印 取各顶点在表中序号 头文件及数据 头文件定义及所需数据 #include <iostream> using namespace std; #define MAX 100 //最大顶点数 图存储结构 边结点的存储结构 typedef st...

qq_44629708的博客 2482

图:邻接表法创建图

邻接表法创建图

qq_46785243的博客 3717

数据结构(廿六) -- C语言版 -- 图 - 图的遍历 -- 邻接表 - 深度/广度优先遍历/搜索(DFS、BFS)

图是一种非线性的数据结构,图的遍历指的是:从图中的某一顶点出发,沿着一些边访问图中所有的顶点,使得每个顶点都被访问且仅被访问一次。根据遍历路径的不同,通常有两种遍历图的方法:深度优先遍历(Depth First Search)和广度优先遍历(Breadth First Search)。它们对无向图和有向图都适用,图的遍历算法是求解图的连通性问题、拓扑排序和求关键路径等算法的基础。

青椒*^_^*凤爪爪的博客 5687

【低空经济】森林火情高精度监测与早期预警无人机巡护方案

在全球范围内,森林火灾已成为一个严重的生态和社会问题。它不仅对自然生态系统造成了毁灭性的影响,还对人类的生命财产安全构成了极大的威胁。根据国际森林发展组织的统计,全球每年因森林火灾造成的经济损失高达数百亿美元,甚至在某些年份,火灾损失占到某些国家国民经济总量的相当一部分。因此,开展高效的森林火情监测与早期预警工作显得尤为重要。随着科技的发展,无人机作为新兴的监测工具,以其高效、灵活和经济的特点在森林火灾监测领域展现出了巨大的潜力。

2502_92579126的博客 1212

数据结构-图的邻接表的定义与实现

邻接表是一种基于链表的存储方式,它将每个顶点的所有邻接点存储在一个链表中。具体来说,邻接表由一个顶点数组和一个边链表组成,顶点数组中的每个元素表示一个顶点,边链表中的每个结点表示一条边。// 邻接表中的边结构体int to;// 目标节点int weight;// 权重// 邻接表中的节点结构体int val;// 节点的值// 邻居节点// 图的邻接表结构体// 节点集合i < n;return 0;

m0_61789994的博客 6028

深入解析LinuxCNC源码:从界面开发到硬件交互

本文深入解析LinuxCNC开源数控系统的源码架构与二次开发实践。详细介绍了从GTK+界面定制、Python脚本绑定,到硬件抽象层(HAL)配置与核心运动控制模块的完整开发流程。通过实战案例,帮助开发者掌握如何基于LinuxCNC源码进行界面开发和硬件交互定制,实现个性化数控系统。

weixin_29164843的博客 542

数据结构——无向图创建邻接表以及深度遍历、广度遍历(C语言版)

数据结构——无向图创建邻接表以及深度遍历、广度遍历一、邻接表概念二、创建邻接表 一、邻接表概念 在无向图中,顶点存储在顶点表中,以一个顶点为标记,指向边链表,两者组合在一起,称为 邻接表 对无向图的每个顶点vi建立一个单链表,第i个单链表中的结点表示依附于顶点vi的边(对于有向图则是以顶点vi为尾的弧)。这个单链表就称为顶点vi的边表(对于有向图则称为出边表) 边表的头指针和顶点的数据信息采用顺序存储(称为顶点表) 邻接表中存在两种结点:顶点表结点和边表结点 顶点表结点由顶点域(data)和指向第一条

正弦定理的博客 1万+

新硬盘到手,在统信UOS或麒麟系统上怎么认?保姆级教程从识别到挂载一步到位

本文提供新硬盘在统信UOS或麒麟KYLINOS系统上的完整配置指南,从识别物理硬盘到挂载全流程详解。通过终端命令如df和lsblk,帮助用户完成硬盘识别、分区、文件系统创建及挂载配置,确保新硬盘顺利投入使用。

weixin_30698297的博客 442

如何用Deep OC-SORT提升多目标跟踪精度?实战配置与性能优化指南

本文是一份针对开发者的Deep OC-SORT多目标跟踪实战指南。详细解析了如何通过部署其核心的“动态外观记忆”与“相机防抖”模块来有效应对遮挡与抖动,从而显著提升跟踪精度与连续性。内容涵盖从环境搭建、参数调优到性能压榨的全流程,并提供针对不同场景的配置建议与工程落地技巧。

f9g0h的博客 670

邻接表—广度优先遍历

深度优先遍历和广度优先遍历的参考知识点:https://blog.youkuaiyun.com/a2217018103/article/details/90678830 下面是使用邻接表做出的广度优先遍历案例: #include<stdlib.h> #include<stdio.h> #include<malloc.h> #include<string.h> //图的邻接表类型定义 typedef char VertexType[4]; typedef char Info

wh1236666的博客 6372

Adams软件安装与配置全攻略:从入门到机器人仿真

机械系统动力学仿真软件Adams是工业机器人开发的重要工具,其安装过程涉及许可证配置、环境变量设置等关键技术环节。专业仿真软件安装通常需要处理系统兼容性、组件依赖和授权验证等工程问题,特别是在机器人控制仿真等场景中,还需集成MATLAB/Simulink等第三方工具。本文以Windows平台为例,详解Adams安装的核心步骤,包括系统环境检查、许可证服务器配置、工业机器人专项模块安装等实践要点,并针对NVIDIA Quadro显卡优化、27500端口通信等常见问题提供解决方案,帮助用户快速搭建可靠的仿真环境

weixin_28523493的博客 199

2023王道C语言督学营(图的邻接表-深度及广度优先遍历)

数据结构

m0_51195865的博客 2560

神经形态芯片:IBM TrueNorth技术详解以及应用案例

2018年的一项演示中,机器人使用TrueNorth处理了复杂的路径规划,功耗仅为传统系统的1/10。它通过模仿人脑的结构,解决了传统芯片在功耗和并行性上的痛点,并在图像识别、物联网和机器人等领域展现了强大潜力。:不同于传统芯片的时钟驱动,TrueNorth是事件驱动的。例如,工厂中的振动传感器使用TrueNorth检测设备故障的早期迹象,实现了更高效的维护策略,避免了停机时间。:在医疗领域,TrueNorth可以用于可穿戴设备,比如一个智能助听器,它能过滤噪音并增强特定声音,功耗低到可以用纽扣电池供电。

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 2477

【Python基础】FastAPI 从入门到项目实战操作详解

【Python基础】FastAPI从入门到使用实战操作详解

congge_study的博客 441

C语言邻接表——广度优先遍历,深度优先遍历

#include<stdio.h> #include<stdlib.h> #define MaxVertices 100 typedef char DataType; //建立边表 typedef struct node { int adjvex; //指向边表结点 struct node *nextarc; //指向下一条边,没有则为NULL int info...

qq_18824403的博客 5849

safetensors_rust.SafetensorError: Error while deserializing header: MetadataIncompleteBuffer解决方案

本文主要介绍了safetensors_rust.SafetensorError: Error while deserializing header: MetadataIncompleteBuffer解决方案,希望能对使用Python的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案 2.1 Windows 2.2 Linux

weixin_43178406的博客 15万+

【数据结构】之图的遍历(C语言)

文章目录定义深度优先遍历 定义 从图中某一顶点出发访遍图中其余顶点,且使每一个顶点仅被访问一次,这一过程就叫做图的遍历(Traversing Graph)。 深度优先遍历 深度优先遍历(Depth_First_Search),也有称深度优先搜索,简称DFS。 ...

xiangjunyes的博客 1万+

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

【高阶数据结构】第三弹---图的存储与遍历详解:邻接表构建与邻接矩阵的BFS/DFS实现

图的存储结构:邻接表【边的结构,图的基本结构,图的创建,获取顶点下标,添加边,打印,测试一,测试二】;图的遍历:图的广度优先遍历,图的深度优先遍历~~~

小林熬夜学习编程的博客 2575

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

【数据结构】无向图创建邻接表以及深度遍历、广度遍历(C语言版)

100//深度遍历标记数组//广度遍历标记数组// 边链表int Local;// 存放该顶点对应边链表中数据// 边链表节点指针// 顶点表int Vertex;// 存放一条边链表对应的顶点// 指向该顶点对应边链表的头节点// 存放顶点和边,指向顶点表结构体数组int Vnum;// 存放顶点数int Enum;// 存放边数// 边链表对应的顶点表中顶点结构体}MyGraph;

咖喱年糕的博客 5089

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

【C语言】图的深度优先遍历&广度优先遍历(算法,代码一步到位)

图的两种遍历,你一定要学会

Jaye513的博客 5959

采用邻接表存储的图的深度优先遍历c语言,以邻接表作为存储结构的图的深度优先遍历和广度优先遍历(c++版)...

一、图的存储用邻接表法存储图,存储结构分为两部分,一部分为存储图的所有顶点的数组,另一部分为挂载在数组的每个元素后面的用来表示顶点的邻接点的链表。1、存储顶点的结构单元为:classvnode{public:stringnodename;boolvisted;//进行图的遍历时用于标记图是否被访问过node*next;vnode(){visted= false;next=NULL;}};链表的结构...

weixin_39531183的博客 3108

数据结构---图的邻接矩阵(创建,打印,深度优先遍历,广度优先遍历,C语言)

  邻接矩阵法   用一维数组图中顶点的信息,用一个二维数组存储图中边的信息(各顶点之间的邻接关系)。存储顶点之间邻接关系的二维数组称为邻接矩阵。      结点数为n的图G=(V,E)的邻接矩阵A是n*n的,将G的顶点编号为v1,v2,......vn。若(vi,vj)∈E,则A[i][j]=1,否则A[i][j]=0。   对于带权图而言,若顶点vi,vj之间有边相连,则邻接矩阵...

小陆同学LLR的博客 4万+

C语言实现数据结构的邻接矩阵----数组生成矩阵、打印、深度优先遍历和广度优先遍历

写在前面 **图的存储结构有两种:**一种是基于二维数组的邻接矩阵表示法。 另一种是基于链表的的邻接表表示法。 在邻接矩阵中,可以如下表示顶点和边连接关系: 说明: 将顶点对应为下标,根据横纵坐标将矩阵中的某一位置值设为1,表示两个顶点向联接。 图示表示的是无向图的邻接矩阵,从中我们可以发现它们的分布关于斜对角线对称。 我们在下面将要讨论的是下图的两种遍历方法(基于矩阵的):   我们已经说明了我们要用到的是邻接矩阵表示法,那么我首先要来构造图: 1.深度优先遍历算法   分析深度优先遍历     从图

weixin_44456608的博客 1739
上一篇: 数据结构---图的邻接矩阵(创建,打印,深度优先遍历,广度优先遍历,C语言)
下一篇: 经典小题目1(斐波拉契数列、杨辉三角形,C语言)
小陆同学LLR
博客等级 码龄10年 213粉丝 44原创
评论 16
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值