先看 定义邻接表
//边
struct Edge {
int AdjVertex;//邻接顶点
int Weight;//权值
Edge* next;//下一条边
};
using VertexValue = use define
//顶点
struct Vertex {
VertexValue value; // 顶点数据
Edge* First;//获取第一条边
};
//邻接顶点
using AdjVertex = Vertex*;
//邻接表
using AdjList = AdjVertex*;
//图
struct Graph {
//邻接列表
AdjList List;
//顶点数
int VertexSize;
//边数
int EdgeSize;
};
看的清清楚楚 !
using AdjVertex = Vertex*;
你也可以不用指针 用 了也没啥事我的就是方法方式不一样
为了更好的构建图结构 画图是避免不了的事情
请看现露出只因(鸡)脚,本作者 带来的精彩图
首先来看圆圆的带着字 ! 蔡徐坤与其他人关系 是没有任何的关系
邻接表:包含数据 并且有一个 Edge* First; 获取第一条边 当然现在也显示不出来
来看看邻接表如何组合成图结构的吧
//图
struct Graph {
//邻接列表
AdjList List;
//顶点数
int VertexSize;
//边数
int EdgeSize;
};
//邻接列表
AdjList List; //本质就是 一个指针数组 List指向蔡徐坤这个虚拟结点 当然你也可以认为是一个结点指向蔡徐坤这个结点
算法实现
算法声明
//图初始化
void GraphInit(Graph& graph);
//添加顶点
void AddVertex(Graph& graph, VertexValue value);
//添加边
void AddSingleEdge(Graph& graph, VertexValue VertexValueFirst, VertexValue VertexValueSecond);
//添加边的权值
void SetEdgeOFWeight(Graph& graph, VertexValue VertexValueFirst, VertexValue VertexValueSecond, Ikun Weight);
//深度优先遍历
void DepthFirstSearch(const Graph& graph);
void DepthFirstSearch(const Graph& graph, int VertexIndex);
初始化图结构
你需要多少个顶点 ?
看你的需求 定义常量
所以添加顶点的的时候 动态? 还是一次性分配好
当然 效率来说当然是还是一次性分配好 难道你想一个个扩展? 产生时间成本 有的时候一切的安排或许有效率 但也要学会变动态,比如说:突然忘记带笔记本电脑上班,赶紧回去找笔记本电脑 没有发生什么事情 .比如说 :遇见好久不见的朋友 聊一下什么的 我们需要理性的动态 而不是一边一次性安排计划 这个点我要干嘛 ;只会感觉没有意义 完全是计划绑定死了的人
所以一切看你的需求来 我的需求是 如果顶点数大于1024 那么不需要添加
//顶点添加最大值
const int MaxSize = 1024;
//邻接表初始化
static void AdjListInit(AdjList& List) {
//遍历邻接表数组
for (size_t i = 0; i < MaxSize; i++) {
//初始化所有元素为null
List[i] = nullptr;
}
}
//图初始化
void GraphInit(Graph& graph){
//动态分配邻接表数组
graph.List = new AdjVertex[MaxSize];
//调用邻接表初始化函数
AdjListInit(graph.List);
//初始化顶点数量和边数量
graph.VertexSize = 0;
graph.EdgeSize = 0;
}
添加顶点
static AdjVertex CreateAdjVertex(VertexValue& value) {
//创建新顶点
Vertex *vertex = new Vertex;
//设置顶点的值
vertex->value = value;
//设置第一条边为null
vertex->First = nullptr;
//返回邻接顶点,实际上就是新顶点的指针
return vertex;
}
void AddVertex(Graph& graph, VertexValue value){
//获取顶点数量的引用
int& VertexSize = graph.VertexSize;
//如果顶点数量达到上限,不再添加
if (VertexSize >= MaxSize) {
return;
}
//获取邻接表的引用
AdjList& List = graph.List;
//调用CreateAdjVertex创建新顶点
AdjVertex adjVertex = CreateAdjVertex(value);
//将新顶点添加到邻接表中
List[VertexSize] = adjVertex;
//更新顶点数量
++VertexSize;
}
添加顶点非常像顺序表添加一样简单
真正的man,不需要绽放光芒也能闪亮
添加完毕后的 图结构:
感觉有点枯燥起来,唉 也不知道为啥总觉得自己提高不上来,可能过于自信了吧 不管怎么样实力永远都是比比不了学历 这我知道,但尝试过去休闲日子,因为自己太失败了,一个不太正常的人,当然我说的是我本人 但有的时候有点怪 怎么说呢看看这个链接我的故事
唉 避免不了的事情 就是这件事情 我虽然放弃了我的学业 当然学习的机会是自己争取,当然这怎么可能一个人呢 当然资源
竞争往往都是给别人,但我敢于投资策略 ,总之一切靠的是人脉网络 我其实写这个博客就是需要这些人脉网络扩大我的就业机遇这才是目的,谢谢你们关注 ,我会继续更新所学到的内容 以及分享一些有趣的话题