【系列文章】数据结构与算法——图
---恢复内容开始---
接触C语言是很早以前的事了,大概是在初中二年级。后来发现只学语言,不学算法根本没用,于是乎萌发了学习数据结构和算法的想法,但一直没有什么实际进展。直到今天,才决定好好研究一番(ps:今年大一,甚是惭愧),顺便把学习过程记录在这一系列文章之中。好了,废话不多说,开始我这一系列的文章。文中可能有错误,如果你发现了,我恳请你帮我指出。谢谢。
图——图能很方便的描述一些实际问题,常用于寻找最优解类型的问题。其他相关概念,百度百科说的很清楚了。
学习图大概有以下几个过程。
一.创建图:(邻接表和领接矩阵)
二.遍历图:(深度遍历和广度遍历)
三.使用图:(普里姆算法,迪杰斯特拉算法等)
详解:
一:创建图:
常见的图的表示方法有两种,一是邻接矩阵方法,而是邻接表方法,各有优势。邻接矩阵法适合于节点较少的,稠密的图,而邻接表法则适合于相反情况。
但我个人在使用中更加偏向于使用邻接表法(可能是我更排斥C语言中静态数组的原因吧,所以我所有实例都会是邻接表法)
好,确定了采用哪种方法表示图后,还要确定具体的一些表示发放。例如图中节点的表示方法
具体思维过程如下:(以邻接表发为例)
首先创建一个结构体类型用来表示图
typedef struct _gragh { Vertex * vertexs; int vertexCount; }Gragh;
其中的Vertex代表顶点类型
typedef struct _vertex { ElemType data; Node *firstNode; }Vertex;
根据邻接表的定义方法,每一个顶点都有一个维护一个链表,用来存储他的邻接点
所以链表中节点类型为Node
typedef struct _node { ElemType data; int weight; struct _node *next; }Node;
每个节点包含节点数据data,该节点对应边的权值,以及下一个邻接点的指针。
好了,基本的类型定义完了,我们就实际的创建一个图。创建图我用函数CreateGragh
void CreateGragh(Gragh **gragh) { int i, j,k; int count; printf("输入顶点个数:\n"); scanf("%d", &count); *gragh = (Gragh *)malloc(sizeof(Gragh)); (*gragh)->vertexCount = count; (*gragh)->vertexs = (Vertex*)malloc(sizeof(Vertex)*count); if (*gragh == NULL) ErrorMsg(); for (i = 0; i < count; i++) { Vertex *newVertex = (Vertex*)malloc(sizeof(Vertex)); newVertex->firstNode = NULL; printf("输入此顶点数据和邻接点个数:\n"); scanf("%d%d", &newVertex->data, &newVertex->count); for (j = 0; j < newVertex->count; j++) { Node *newNode = (Node*)malloc(sizeof(Node)); printf("输入邻接点数据和该邻接点对应边权值:\n"); scanf("%d%d", &newNode->data, &newNode->weight); newNode->next = NULL; Node *temp = newVertex->firstNode; if (temp == NULL) newVertex->firstNode = newNode; else { while (temp->next != NULL) { temp = temp->next; } temp->next = newNode; } } (*gragh)->vertexs[i] = *newVertex; } }
在创建图的时候,我们只需要传入一个Gragh类型的指针变量即可。
调用如下:(在主函数中如下调用即可)
Gragh *gragh;
CreateGragh(&gragh);
具体调用实例不再给出。。嘿嘿。
本文章为系列文章,下一篇:遍历图
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?