邻接表构建全流程拆解,掌握C语言图存储的关键技术突破

第一章:邻接表构建的核心概念与意义

邻接表是一种广泛应用于图数据结构中的存储方式,特别适用于稀疏图的表示。它通过为每个顶点维护一个链表,记录与其相邻的所有顶点,从而高效地保存边的信息。相比邻接矩阵,邻接表在空间利用率和遍历效率方面具有显著优势。

邻接表的基本结构

邻接表由数组与链表(或动态数组)组合而成,其中数组索引对应图中的顶点,每个元素指向一个包含相邻顶点的链表。对于无向图,每条边会在两个顶点的链表中各出现一次;对于有向图,则仅在起点的链表中体现。
  • 适用于顶点数量大但边数较少的稀疏图
  • 节省内存空间,避免邻接矩阵中大量零元素的浪费
  • 便于深度优先搜索(DFS)和广度优先搜索(BFS)等图遍历操作

Go语言实现示例

以下是一个使用Go语言构建无向图邻接表的简单实现:
// 定义邻接表类型
type Graph struct {
    vertices int
    adjList  [][]int
}

// 初始化图
func NewGraph(n int) *Graph {
    adjList := make([][]int, n)
    return &Graph{n, adjList}
}

// 添加边(无向图)
func (g *Graph) AddEdge(u, v int) {
    g.adjList[u] = append(g.adjList[u], v) // u → v
    g.adjList[v] = append(g.adjList[v], u) // v → u
}
上述代码中,NewGraph 函数初始化一个具有指定顶点数的图结构,AddEdge 方法将边双向添加至两个顶点的邻接列表中,符合无向图特性。

邻接表与邻接矩阵对比

特性邻接表邻接矩阵
空间复杂度O(V + E)O(V²)
查询边是否存在O(degree)O(1)
适合图类型稀疏图稠密图

第二章:邻接表的数据结构设计与理论基础

2.1 图的基本表示方法对比:邻接矩阵与邻接表

在图的实现中,邻接矩阵和邻接表是最常用的两种存储结构,各自适用于不同的场景。
邻接矩阵:二维数组表示法
邻接矩阵使用二维数组 graph[i][j] 表示顶点 i 与顶点 j 之间是否存在边。对于无向图,矩阵对称;有向图则不一定。

bool graph[5][5] = {false};
// 添加边 (0, 1)
graph[0][1] = true;
graph[1][0] = true; // 无向图需双向设置
该方式适合边密集的图,查询任意两点是否相连的时间复杂度为 O(1),但空间消耗为 O(V²),对稀疏图不友好。
邻接表:链式存储优化空间
邻接表使用数组 + 链表(或向量)结构,每个顶点维护一个相邻顶点列表,显著节省空间。

vector<vector<int>> adjList(5);
// 添加边 (0, 1)
adjList[0].push_back(1);
adjList[1].push_back(0);
空间复杂度为 O(V + E),适合稀疏图,但查询两顶点是否有边需遍历邻接链表,最坏为 O(V)。
特性邻接矩阵邻接表
空间复杂度O(V²)O(V + E)
边查询时间O(1)O(V)
适用图类型稠密图稀疏图

2.2 邻接表的逻辑结构与存储原理深度解析

邻接表是一种以链式结构为主导的图存储方式,适用于稀疏图场景,能有效节省空间。其核心思想是为图中每个顶点维护一个邻接顶点链表。
基本结构设计
每个顶点对应一个节点,包含顶点数据和指向第一个邻接点的指针。邻接点通过链表串联,记录边的存在关系。
顶点邻接链表
AB → C
BA → D
CA
DB
代码实现示例

type EdgeNode struct {
    adjvex int         // 邻接点下标
    next   *EdgeNode   // 指向下一个邻接点
}

type VertexNode struct {
    data     int        // 顶点数据
    firstEdge *EdgeNode // 第一个邻接点
}
上述结构中,adjvex 表示与当前顶点相连的顶点索引,next 实现链式遍历。顶点通过 firstEdge 启动对邻接关系的访问,形成“数组 + 链表”的复合存储模式。

2.3 动态链表节点的设计与内存布局优化

在高性能系统中,动态链表的节点设计直接影响内存访问效率与缓存命中率。合理的内存布局可显著减少碎片并提升遍历性能。
节点结构的紧凑化设计
通过减少节点元数据冗余,将指针与数据字段重新排列以满足内存对齐要求,同时降低填充字节。例如:

typedef struct ListNode {
    int data;
    struct ListNode* next;
} ListNode;
该结构在64位系统中占用16字节(int 4字节 + 指针8字节 + 对齐填充4字节),可通过字段重排或使用内存池进一步优化。
内存布局优化策略
  • 使用对象池预分配节点,减少malloc调用开销
  • 采用缓存行对齐(如64字节对齐)避免伪共享
  • 批量分配连续内存块模拟链式结构,提升局部性
策略空间开销访问速度
常规malloc高低
内存池低高

2.4 头结点数组与边结点链表的协同工作机制

在图的邻接表表示中,头结点数组与边结点链表通过指针引用实现高效的数据关联。头结点数组存储每个顶点的起始地址,边结点链表则动态记录该顶点的所有邻接边。
数据结构定义

typedef struct EdgeNode {
    int adjVertex;                // 邻接顶点索引
    struct EdgeNode* next;        // 指向下一个边结点
} EdgeNode;

typedef struct {
    EdgeNode* head;               // 指向边结点链表
} VertexNode;

VertexNode graph[MAX_VERTICES];   // 头结点数组
上述代码中,graph 数组每个元素指向一个链表,链表中的节点表示从该顶点出发的所有边。
协同访问流程
  • 通过数组下标快速定位源顶点(O(1) 时间)
  • 遍历对应链表获取所有邻接点
  • 插入新边时动态分配边结点并链接到头部

2.5 稀疏图场景下邻接表的空间效率优势分析

在稀疏图中,边的数量远小于顶点数的平方(即 $|E| \ll |V|^2$),邻接表相较于邻接矩阵展现出显著的空间优势。
空间复杂度对比
  • 邻接矩阵:固定占用 $O(|V|^2)$ 空间,无论边是否存在;
  • 邻接表:仅存储实际存在的边,空间复杂度为 $O(|V| + |E|)$。
存储结构示例

// 邻接表的链表实现
typedef struct Node {
    int vertex;
    struct Node* next;
} Node;

Node* graph[MAX_VERTICES]; // 每个顶点对应一个链表头指针
上述代码使用数组+链表结构,每个顶点维护一条邻接边链表。对于稀疏图,避免了大量零元素的存储开销。
空间效率量化对比
图类型顶点数边数邻接矩阵邻接表
稀疏图100020001,000,000 项3000 节点
可见,在稀疏场景下,邻接表节省超过99%的存储空间。

第三章:C语言中邻接表的实现准备

3.1 结构体定义与指针在图存储中的关键作用

在图数据结构的实现中,结构体与指针的结合是高效建模节点与边关系的核心手段。通过结构体可以封装顶点属性和邻接信息,而指针则实现了动态连接与内存优化。
结构体设计示例
type Vertex struct {
    ID    int
    Data  string
    Edges *Edge // 指向第一条边的指针
}

type Edge struct {
    To     *Vertex // 指向目标顶点
    Weight int
    Next   *Edge   // 下一条邻接边
}
上述代码定义了图的邻接链表结构。Vertex 存储节点ID和数据,并通过 Edges 指针关联其所有出边;Edge 使用 To 指针形成节点间的引用关系,Next 实现边的链式存储,节省空间且支持动态扩展。
优势分析
  • 结构体提升数据封装性与可读性
  • 指针实现高效的动态内存管理
  • 避免数据冗余,支持稀疏图的紧凑表示

3.2 内存分配函数malloc与动态创建边结点实践

在图的邻接表表示中,动态创建边结点是核心操作之一。`malloc` 函数用于在运行时从堆中分配指定大小的内存空间,适用于节点数量不确定的场景。
malloc基础用法
Edge* newEdge = (Edge*)malloc(sizeof(Edge));
该语句为一个边结点分配内存。`sizeof(Edge)` 确保分配足够空间,强制类型转换将 `void*` 转为 `Edge*` 类型。若分配失败,返回 NULL,需做空指针检查。
动态创建边结点流程
  • 调用 malloc 分配内存
  • 初始化目标顶点和权重字段
  • 将新结点插入邻接表头部
  • 确保 next 指针正确链接
结合错误检测机制可提升程序健壮性:
if (newEdge == NULL) {
    fprintf(stderr, "内存分配失败\n");
    exit(1);
}
此段代码防止因内存不足导致的未定义行为,是系统级编程的重要防护措施。

3.3 边数据输入处理与图的初始化流程编码

在构建图计算系统时,边数据的输入处理是图初始化的核心环节。系统需从原始数据中解析顶点与边的关系,并高效加载至内存结构。
边数据预处理
输入的边数据通常以CSV或文本文件形式存在,每行表示一条有向或无向边。需进行格式校验与去重处理。
# 边数据读取与清洗
edges = []
with open("graph_edges.txt", "r") as f:
    for line in f:
        src, dst = map(int, line.strip().split())
        if src != dst:  # 过滤自环
            edges.append((src, dst))
该代码段读取边列表并剔除自环边,确保图结构的合理性。参数 src 和 dst 分别代表源节点与目标节点。
图的初始化
使用邻接表存储图结构,遍历边列表完成初始化:
  • 创建空的邻接字典
  • 逐条插入边,支持重复边合并
  • 初始化顶点元数据

第四章:邻接表构建全流程实战编码

4.1 创建空图与头结点数组的初始化实现

在图的邻接表表示中,创建空图是构建图结构的第一步。该过程核心是初始化一个大小为顶点数的头结点数组,每个元素指向一条链表,用于存储与其相邻的顶点。
头结点数组的内存分配
使用动态内存分配为头结点数组申请空间,确保每个顶点都有对应的链表入口。初始状态下,所有指针均置为 NULL,表示无边连接。

typedef struct AdjNode {
    int vertex;
    struct AdjNode* next;
} AdjNode;

typedef struct Graph {
    int numVertices;
    AdjNode** adjLists;
} Graph;

Graph* createGraph(int vertices) {
    Graph* graph = (Graph*)malloc(sizeof(Graph));
    graph->numVertices = vertices;
    graph->adjLists = (AdjNode**)calloc(vertices, sizeof(AdjNode*));
    return graph;
}
上述代码中,adjLists 是一个指针数组,每个元素类型为 AdjNode*,代表对应顶点的邻接链表头指针。函数 createGraph 分配图结构内存,并用 calloc 初始化所有指针为 NULL,确保图初始为空。

4.2 添加边操作的完整逻辑封装与错误边界处理

在图结构操作中,添加边是核心功能之一。为确保操作的健壮性,需对输入参数进行完整性校验,并封装统一的错误处理机制。
参数校验与前置判断
在执行添加边逻辑前,必须验证源节点和目标节点是否存在,以及边是否已存在,避免重复插入。

func (g *Graph) AddEdge(src, dst string) error {
    if !g.ContainsNode(src) {
        return fmt.Errorf("source node %s does not exist", src)
    }
    if !g.ContainsNode(dst) {
        return fmt.Errorf("destination node %s does not exist", dst)
    }
    if g.HasEdge(src, dst) {
        return fmt.Errorf("edge from %s to %s already exists", src, dst)
    }
    // 执行边插入逻辑
    g.edges[src] = append(g.edges[src], dst)
    return nil
}
上述代码中,AddEdge 方法首先检查节点存在性和边的唯一性,任一条件不满足即返回相应错误,防止非法状态写入。
错误类型分类与日志追踪
通过定义明确的错误类型(如 ErrNodeNotFound、ErrEdgeExists),便于调用方进行条件判断与恢复处理,同时结合结构化日志记录操作上下文,提升可维护性。

4.3 构建无向图与有向图的代码差异与统一接口设计

在图结构实现中,有向图与无向图的核心差异体现在边的存储方式。无向图的每条边需双向添加,而有向图仅单向记录。
核心代码实现

type Graph struct {
    adjMap map[int][]int
    directed bool
}

func (g *Graph) AddEdge(u, v int) {
    if !g.directed {
        g.adjMap[v] = append(g.adjMap[v], u) // 无向图反向边
    }
    g.adjMap[u] = append(g.adjMap[u], v)     // 正向边均需添加
}
上述代码通过 directed 标志位控制边的添加逻辑。若为无向图,则在添加 u→v 的同时补全 v→u,确保对称性。
统一接口设计优势
  • 共用同一套增删查接口,降低调用复杂度
  • 通过初始化参数区分图类型,提升可扩展性
  • 便于后续集成遍历、最短路径等通用算法

4.4 图的遍历输出验证:打印邻接表结构确认正确性

在构建图结构后,验证邻接表的正确性是确保后续遍历算法可靠执行的关键步骤。通过打印每个顶点的邻接节点,可以直观地检查边的插入逻辑是否符合预期。
邻接表输出代码实现

// PrintGraph 输出邻接表结构
func (g *Graph) PrintGraph() {
    for vertex, list := range g.adjList {
        fmt.Printf("顶点 %d -> ", vertex)
        for _, edge := range list {
            fmt.Printf("%d(权重:%d) ", edge.To, edge.Weight)
        }
        fmt.Println()
    }
}
该函数遍历图中每个顶点及其邻接链表,逐个输出相邻顶点与边权信息。通过格式化打印,可清晰观察图的连接关系。
输出示例与结构分析
假设图包含三个顶点及双向边,输出如下:
  • 顶点 0 -> 1(权重:5) 2(权重:3)
  • 顶点 1 -> 0(权重:5) 2(权重:1)
  • 顶点 2 -> 0(权重:3) 1(权重:1)
该结构表明顶点间连接对称且权值一致,符合无向图建模预期,验证了插入逻辑的正确性。

第五章:性能优化与扩展应用展望

缓存策略的精细化设计
在高并发场景下,合理使用缓存可显著降低数据库压力。采用多级缓存架构,结合本地缓存与分布式缓存,能有效提升响应速度。
  • 本地缓存适用于高频读取、低更新频率的数据,如配置信息
  • Redis 作为分布式缓存层,支持过期策略和数据持久化
  • 使用布隆过滤器预防缓存穿透

// 示例:使用 Redis 设置带过期时间的缓存
client.Set(ctx, "user:1001", userData, 5*time.Minute)
if err != nil {
    log.Error("缓存写入失败:", err)
}
异步处理与消息队列集成
将非核心流程(如日志记录、邮件通知)通过消息队列异步执行,可缩短主链路响应时间。Kafka 和 RabbitMQ 是主流选择,根据吞吐量与延迟需求进行选型。
方案吞吐量延迟适用场景
Kafka极高毫秒级日志流、事件溯源
RabbitMQ中等微秒级任务调度、通知系统
水平扩展与服务网格演进
基于 Kubernetes 的自动伸缩机制,可根据 CPU 或自定义指标动态扩缩容。未来可引入 Istio 实现流量管理、熔断与可观测性,构建云原生服务网格体系,支撑微服务架构持续演进。
数据结构--图的创建(邻接表) 数据结构–图的创建(邻接表) 邻接表结构: #include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; #define MAXVEX 20 typedef char VertexType; //边表结点 typedef struct EdgeNode{ int adjvex; struct EdgeNo... 阅读详情

相关推荐

【数据结构】图的构建(邻接表法)

最近整理电脑,发现了以前写的数据结构的代码,由于时间久了,好多代码都找不到了,现在扒出来复习一下。 如果看不懂下面关于图的术语或者压根就不知道图。建议看一下严蔚敏版的《数据结构》中对图的介绍 图的构建方法有好几种,如邻接矩阵法,邻接表法,十字链表法,邻接多重表。今天介绍邻接表法。 邻接表(Adjacency List) 是图的一种链式存储结构,在邻接表中,对图中每个顶点建立一个单链表

sundong_d的专栏 2万+

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

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

m0_61789994的博客 6028

图的存储结构——邻接表的建立

邻接表(无向图)

花开不败 1万+

图:邻接表法创建图

邻接表法创建图

qq_46785243的博客 3717

产业园区如何高效对接企业技术需求与高校科研成果?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

Zenoh:统一数据平面协议,重塑物联网与边缘计算架构

在分布式系统与物联网领域,数据通信与处理常面临协议割裂的挑战。传统方案如MQTT、Kafka、gRPC等,分别针对发布/订阅、流处理和RPC等不同场景,导致架构复杂、集成成本高。其核心问题在于未能统一处理“运动中数据”(Data in Motion)与“静止中数据”(Data at Rest)。Zenoh协议通过创新的“Key-Value”寻址与“Selector”查询语言,将发布/订阅、存储、查询和计算四种核心操作融合进单一协议,构建了统一的抽象层。这种设计实现了极低的协议开销(仅5字节头部)和地理分布式

weixin_29597551的博客 290

C语言邻接表构建与遍历:3种常见错误及避免方法,提升程序稳定性

掌握C语言邻接表的图遍历技巧,解决内存泄漏、指针越界与遍历死循环三大常见问题。适用于算法竞赛与数据结构开发,提升程序稳定性与执行效率,值得收藏。

StepLens的博客 940

中微8S6990实战:5分钟搞定GPIO配置与按键中断(附避坑指南)

本文以中微8S6990单片机为例,详细讲解了GPIO按键中断的快速配置方法与实战避坑指南。内容涵盖GPIO初始化、中断配置、软件消抖优化及低功耗唤醒等关键步骤,并提供了利用逻辑分析仪进行调试验证的有效方法,帮助开发者快速构建稳定可靠的嵌入式按键交互系统。

weixin_29194817的博客 280

邻接表的建立

做图的题目都是要先建立一个邻接表的,下面是简单的建立有向图的邻接表的。 #include <iostream> using namespace std; struct ENode{ int adjVex; ENode *nextArc; }; int main(){ int i; int n,e;//顶点,边 int u,v;//一条边的两个顶点 ENode **a...

jihome的博客 1061

stm32f407VET6 系统学习 day01 GPIO 配置

stm32f407VET6 系统学习 day01 GPIO 配置 LED 蜂鸣器 按键的不讲了,之前讲过了

she666666的博客 8905

特征模理论指导滤波天线设计的优势和方法

本文探讨了特征模理论在滤波天线设计中的应用优势和方法。特征模理论通过分析天线结构的本征模特性,突破了传统经验设计的局限,实现了辐射与滤波功能的一体化设计。文章重点阐述了如何利用模式显著性(MS)和模式加权系数(MWC)来指导辐射零点的产生,揭示了辐射零点形成的物理机制。通过特征模分析,设计师可以明确调控天线结构和馈电系统,优化滤波性能。这种方法为现代多频/宽带滤波天线设计提供了理论依据和实用工具,显著提升了设计效率和性能指标。

qq_64207806的博客 957

8-1 图的邻接表的建立

图有多种存储方式,邻接表是一链式存储结构。在邻接表中,对图中的每一个顶点建立一个单链表,第i个单链表表示依附于顶点Vi的边。每一个结点有三个组成,其邻接点域指示与顶点Vi邻接的点图中的位置,链域指示下一条边或弧的结点,数据域存储和边或弧的相关信息,如权值等。 每个链表附设一表头结点。如下图所示: 请编写程序对下图建立邻接表: 接口输入提示: 输入一个整数作为结点编号,再输入与该结点相关联的结点, 键入0结束,例如: 1 2 4 0 再输入一个整数作为结点编号,再输入与该结点相关联的结点, 键入.

m0_54491109的博客 938

python中使用squarify包可视化treemap图:为treemap图添加标题并自定义标题的字体大小、自定义设置treemap中标签字体的大小、添加数值数值标签、自定义设置边框的色彩

python中使用squarify包可视化treemap图:treemap将分层数据显示为一组嵌套矩形自定义设置每一个数据格的颜色、添加数值数值标签、自定义设置边框的色彩、自定义设置边框线条的粗细、为treemap图添加标题并自定义标题的字体大小、自定义设置treemap中标签字体的大小

data+scenario+science+insight 1064

图的邻接表的建立

图的邻接表表示法类似于树的孩子链表表示法。对于图G中的每个顶点vi,该方法把所有邻接于vi的顶点vj链成一个带头节点的单链表,这个单链表就称为顶点vj的邻接表。 单链表中的每个结点至少包含两个域,一个为邻接点域(adjvex),它指示与顶点vi邻接的顶点在图中的位序;另一个为链域,它指示与顶点vi邻接的下一个节点。如果是网络,可以在单链表的头节点中增加一个数据域用于存储和边(弧)相关的信息,如权值...

qq_43613793的博客 4606

【100%通过率】华为OD机试真题 Python【数字最低位排序】【最低位排序】

2023华为OD机试真题 Python【数字最低位排序】【最低位排序】 给定一个非空数组(列表) 起元素数据类型为整型 请按照数组元素十进制最低位从小到大进行排序 十进制最低位相同的元素,相对位置保持不变 当数组元素为负值时,十进制最低为等同于去除符号位后对应十进制值最低位

MISAYAONE的博客 1901

Android Activity面试题最全解析(5万字长文)

Intent是Android中用于启动活动、服务或广播的一种消息对象。它包含了一系列键值对数据,用于描述操作的目的以及需要传递的信息。IntentString:字符串intfloatlong:基本数据类型Parcelable:实现了Parcelable接口的对象:实现了接口的对象示例代码如下:Java深色版本1// 创建Intent并传递数据");67// 启动新的Activity是一个XML标签,用于定义ActivityService或可以响应的Intent类型。它包含了。

大模型大数据攻城狮的专栏 803

图——构建邻接表

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录一、题目二、代码三、反思a)私有变量中,一个是先创建的节点类数组,另一个是顶点的个数。b)公共函数中,一个是带参数的构建图,另一个就是输出邻接表。1) Graph(int n, int k)2)void AdjancencyList(); 一、题目 二、代码 #include<iostream> using namespace std; struct Node { int info; char data

weixin_51312090的博客 1542

我用C#实现上位机数据一键导出Excel:从乱码到百万行数据秒级导出的实战技巧

ExcelWorksheet worksheet = package.Workbook.Worksheets.Add("日报表");// 1. 标题(合并单元格)worksheet.Cells["A1"].Value = $"产线日报表 -DateTimeNowToString// 2. 表头和数据(同上)worksheet.Cells["A3"].Value = "时间";// ...省略表头和数据填充// 3. 合计行(公式计算)

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 712

图-邻接表的建立

建立邻接表(分析) 存储各个点的信息: #include<stdio.h> #include<stdlib.h> #include<string.h> #define max 110 typedef struct graphhead{//表头(表的第一列)用来存各个顶点信息 int data; struct node* next; }List[max];...

weixin_43956284的博客 897

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

邻接表创建图

#include<iostream>using namespace std; const int MAX_SIZE = 10; //邻接表 typedef struct edgenode { int adjvex;//邻接点序号 char info;//临接点信息 edgenode*next;//下一个指针 }edgenode; struct vernode { ch

黑白格的博客 613

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

图的邻接表构建

图的邻接表构建 详细描述(点击) public class GraphDemo{ Map<String,Vertex> vertexMap;//使用HashMap储存顶点 class Vertex{ String name;//顶点名称 Edge next;//下一条边(第一个为顶点 后面都是边) public Vertex(String name) { this.name = name; } } class Edge{ String name;//指向的

weixin_45647572的博客 237

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

邻接表的创建

邻接表 特点:           1、想要知道某个顶点的度,就去查找这个顶点的边表中结点的个数                  2、若想判断顶点 Vi 到 Vj是否存在边,只需测试顶点 Vi 的边表中adjvex是否存在 Vj 的下标。           3、若求顶点的所有邻接点,其实就是对此顶点的边表进行遍历,得到adjvex域对应的顶点就是邻接点。 #inclu

怪咖小青年的博客 1万+

邻接表的创建及其使用

/* * 构建邻接表模板 * */ #include #include int head[100100];//表头,head[i]代表起点是i的边的编号 int cnt;//代表边的编号 struct s { int u;//记录边的起点 int v;//记录边的终点 int w;//记录边的权值 int next;//指向上一条边的编号 }edge[100010

lidafoye的博客 673

图的邻接表创建输出

邻接表是数组与链表相结合的存储方式,即由顶点表和边表构成。顶点表:图中的顶点用一个一维数组存储(也可以用单链表存储),对于顶点数组还需存储指向第一个邻接点的指针,一遍查找顶点的边的信息。边表:即每个顶点的v的所有邻接点构成一个线性表,用单链表存储。 顶点表的结点由data和和fristedge两个域表示,data是数据域,存储顶点信息,fristedge是指针域,指向边表的第一个顶点,即顶点的第

keepmovingha的专栏 1万+
上一篇: C语言函数返回数组的性能对比实验:哪种方式最快最安全?
下一篇: 【C语言高手进阶必读】:掌握这5条括号规则,彻底告别宏函数bug
QuickTrans
博客等级 码龄1年 149粉丝 2018原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值