/**
 * @file global.h
 * @brief 全局头文件 — 数据结构定义
 *
 * 本文件定义了网络路由拓扑规划系统所需的核心数据结构。
 * 包括：边节点(CNode)、设备节点(HNode)、图结构(ALGraph)、边结构(Edge)。
 *
 * 在整个项目中所有源文件均需包含此文件。
 */

#ifndef GLOBAL_H
#define GLOBAL_H

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

/* 最大设备数 */
#define MAX_DEVICE 40

/* 无穷大值，用于表示两设备之间无直连链路 */
#define INF 32767

/**
 * @struct CNode
 * @brief 邻接表的边节点（链路节点）
 *
 * 每个边节点表示图中的一条链路，包含目标设备下标、链路延迟(权值)和指向下一条链路的指针。
 *
 * 网络场景理解：
 *  - CNode 不存"起点是谁"，起点由"它挂在哪个 HNode 的链表里"决定。
 *    例如：CR(下标0)的链表里的 CNode，起点天然就是 CR。
 *  - index 字段指向目标设备在 devices 数组里的下标。
 *    例如：CR→DR-A(延迟5ms)，这个 CNode 的 index=1（DR-A 的下标）。
 *  - next 指向 NULL 时表示没有更多相邻设备了。
 *  - 无向图的双向存储：每条链路存两次（i→j 和 j→i）。
 */
typedef struct CNode {
    int index;               /* 邻接设备下标（目标设备在 devices 数组中的位置） */
    struct CNode *next;      /* 指向下一条邻接链路（同一起点的下一个邻居，NULL表示链表结束） */
    int delay;               /* 链路延迟（权值，单位：ms） */
} CNode;

/**
 * @struct HNode
 * @brief 邻接表的头节点（网络设备节点）
 *
 * 每个头节点代表网络中的一台设备，包含设备代号、描述、端口数、备注和指向第一条链路的指针。
 */
typedef struct HNode {
    char name[20];           /* 设备代号（如 CR、DR-A、AR-T 等） */
    char desc[100];          /* 设备描述（如"核心路由器，连接互联网出口"） */
    int portCount;           /* 端口数量 */
    char note[50];           /* 备注信息（如"24h运行"、"6:00-22:00运行"） */
    CNode *first;            /* 指向第一条邻接链路的指针 */
} HNode, DeviceList[MAX_DEVICE];

/**
 * @struct ALGraph
 * @brief 邻接表存储的网络拓扑图结构
 *
 * 使用邻接表存储无向图，包含设备数组、设备数量和链路数量。
 */
typedef struct ALGraph {
    DeviceList devices;      /* 邻接表头节点数组（每台设备一个表头） */
    int deviceNum;           /* 图中设备数量 */
    int linkNum;             /* 图中链路数量 */
} ALGraph;

/**
 * @struct Edge
 * @brief 边结构体（用于 Kruskal 算法）
 *
 * 从邻接表中提取出的独立边记录，包含两个端点的下标和权值。
 */
typedef struct {
    int u;                   /* 端点1 在 devices 数组中的下标 */
    int v;                   /* 端点2 在 devices 数组中的下标 */
    int w;                   /* 链路延迟（权值） */
} Edge;

#endif /* GLOBAL_H */
