基于 C 语言数据结构的校园网通信路径规划工具
本项目模拟一个校园网环境(8 台设备、10 条链路),用 C 语言实现了一个网络路由拓扑规划系统。 用户可以创建网络拓扑、查看路由表、检测环路、查询最优路径、计算光纤布线方案等。
核心思想:把网络设备看作图的顶点,把网线看作图的边,用邻接表存储拓扑结构,用图算法解决路径规划问题。
| 层级 | 设备 | 说明 |
|---|---|---|
| 🔴 核心层 | CR | 核心路由器,校园网总枢纽,连接互联网出口 |
| 🟠 汇聚层 | DR-A | 教学区汇聚路由器,承载教学网络流量 |
| DR-B | 生活区汇聚路由器,承载宿舍区网络流量 | |
| 🟢 接入层 | AR-T | 教学楼接入路由器,连接各教室有线网络 |
| AR-L | 实验楼接入路由器,连接各实验室网络 | |
| AR-D | 宿舍区接入路由器,连接各宿舍网络 | |
| 🔵 服务器 | SV | 数据中心服务器集群,托管各类校园服务 |
| 🛡️ 安全 | FW | 防火墙,安全策略控制与入侵检测 |
FW
│ 2
CR
╱ │ ╲
5 │ 8
╱ │ ╲
DR-A──12──DR-B
╱ ╲ ╱ ╲
4 3 3 25
╱ ╲ ╱ ╲
AR-L AR-T AR-D
╲ ╱
3 2
╲ ╱
SV
数字单位:毫秒(ms),数字越小表示传输越快
选型理由:8 台设备如果用邻接矩阵需要 64 格,大部分是 ∞(无直连),浪费空间。 邻接表只存储实际存在的连接,空间效率高,遍历邻居时只需顺着链表走。
| 结构体 | 作用 | 关键字段 |
|---|---|---|
CNode |
边节点 | index 邻居下标 · delay 延迟 · next 指向下一邻居 |
HNode |
设备节点 | name[20] 设备名 · desc[100] 描述 · first 首邻居指针 |
ALGraph |
图结构 | devices[] 设备数组 · deviceNum · linkNum |
🔗 CNode 的 next 指针就像寻宝游戏——每张纸条写着"下一个线索在哪儿",顺着指针就能找到全部邻居。
建图时使用头插法(新节点插在链表头部),时间复杂度 O(1)。
输入 8 台设备信息 + 10 条链路关系,用头插法存入邻接表,O(1) 插入。
头插法 · 邻接表将邻接表转为二维表格,∞ 表示无直连。用 parray 指针数组动态分配存储。
深度优先遍历所有设备。"一条路走到黑,走不通回头。" 递归返回后需重置全局指针。
DFS · 递归 · 指针重置"剥洋葱"——剥掉入度为 0 的顶点。如果还有剩余说明有环,数据包会绕晕出不去。
Kahn · 入度数组 · 队列输入任意两台设备名,输出最短路径及总延迟。经典 k-i-j 三重循环,k 在外层是关键。
Floyd · 动态规划 · O(n³)展示所有设备之间的最短延迟,列成 8×8 大表。Floyd 全源信息一次算完。
全源最短路径用最少总网线连通所有设备。Prim(加点法)+ Kruskal(加边法)两种算法对照验证。
Prim · Kruskal · 并查集输入设备代号,显示描述、端口数、备注、所有邻居及延迟。数据均来自结构体。
结构体查询用 fprintf 写入文本文件,利用 i < pNode->index 避免无向边重复写入。
用 fscanf 读取文件恢复网络地图。加载前自动释放旧内存(freeGraph)。
| 算法 | 一句话 | 复杂度 | 在项目中的应用 |
|---|---|---|---|
| DFS | 一条路走到黑,走不通回头 | O(n+e) | 全网巡检路线——不重复、不遗漏走遍所有设备 |
| Kahn | 剥洋葱,剥不完就是有环 | O(n+e) | 路由环路检测——防止数据包在网络中死循环 |
| Floyd | 每个设备当中转站试试,看会不会更快 | O(n³) | 最优路径查询 + 全网路由表(k 放外层是关键) |
| Prim | 从一台开始,每次加离已建网络最近的点 | O(n²) | 光纤布线方案——盖房子,每次加最近一间 |
| Kruskal | 网线按长短排序,从最短的接,会成环就跳过 | O(e log e) | 光纤布线方案——拼积木,从最好拼的开始 |
💡 为什么绕路更快? 直连虽然"看起来近",但 AR-D ↔ SV 的实际链路延迟高达 25ms。绕路经 DR-B → DR-A → AR-T 虽然多走 3 跳,但每跳延迟都很低(3+12+3+2 = 20ms),整体反而更快。
🔑 这就是算法的价值——不给直觉做决定,让数据说话。
| CR | DR-A | DR-B | AR-T | AR-L | AR-D | SV | FW | |
|---|---|---|---|---|---|---|---|---|
| CR | 0 | 5 | 8 | 8 | 9 | 11 | 10 | 2 |
| DR-A | 5 | 0 | 12 | 3 | 4 | 15 | 7 | 7 |
| DR-B | 8 | 12 | 0 | 15 | 16 | 3 | 18 | 10 |
| AR-T | 8 | 3 | 15 | 0 | 7 | 18 | 2 | 10 |
| AR-L | 9 | 4 | 16 | 7 | 0 | 19 | 3 | 11 |
| AR-D | 11 | 15 | 3 | 18 | 19 | 0 | 20 | 13 |
| SV | 10 | 7 | 18 | 2 | 3 | 20 | 0 | 12 |
| FW | 2 | 7 | 10 | 10 | 11 | 13 | 12 | 0 |
定义设备、链路、图的数据结构
链表操作、动态内存分配、函数传参
邻接表存储,新节点插在头部 O(1)
DFS 遍历、Floyd 路径递归打印
邻接矩阵、Floyd 最短路径矩阵
fprintf / fscanf 保存与加载拓扑
创建图节点、释放图内存
防止头文件重复包含
全局变量跨文件共享(parray, path)
3 层输入防护:格式 → 范围 → 业务依赖
🎬 演示视频
系统功能运行演示
📌 视频较大时请耐心等待加载,建议在 Wi-Fi 下观看