在计算机科学中,C语言拓扑排序是一种非常重要的图论算法,尤其适用于处理任务调度、依赖关系解析等实际问题。本文将带你从零开始,一步步理解并实现拓扑排序算法,即使你是编程小白,也能轻松上手!
拓扑排序(Topological Sorting)是对一个有向无环图(DAG, Directed Acyclic Graph)中的顶点进行线性排序,使得对于图中的每一条有向边 (u → v),顶点 u 在排序结果中都出现在顶点 v 的前面。
举个生活中的例子:你要做一道菜,必须先洗菜、切菜,再炒菜。这些步骤之间存在先后依赖关系,不能乱序执行。拓扑排序就是帮我们找出这种合法的执行顺序。

常见的实现方式有两种:基于深度优先搜索(DFS)和基于入度(Kahn算法)。本文将重点讲解更直观、更适合初学者的 Kahn 算法。
下面是一个完整的 C 语言实现,使用邻接表表示图,并通过队列实现 Kahn 算法:
#include <stdio.h>#include <stdlib.h>#define MAX_VERTICES 100typedef struct Node { int vertex; struct Node* next;} Node;typedef struct Graph { int numVertices; Node** adjLists; int* inDegree;} Graph;// 创建新节点Node* createNode(int v) { Node* newNode = malloc(sizeof(Node)); newNode->vertex = v; newNode->next = NULL; return newNode;}// 初始化图Graph* createGraph(int vertices) { Graph* graph = malloc(sizeof(Graph)); graph->numVertices = vertices; graph->adjLists = malloc(vertices * sizeof(Node*)); graph->inDegree = calloc(vertices, sizeof(int)); for (int i = 0; i < vertices; i++) graph->adjLists[i] = NULL; return graph;}// 添加边void addEdge(Graph* graph, int src, int dest) { Node* newNode = createNode(dest); newNode->next = graph->adjLists[src]; graph->adjLists[src] = newNode; graph->inDegree[dest]++;}// 拓扑排序函数void topologicalSort(Graph* graph) { int* queue = malloc(graph->numVertices * sizeof(int)); int front = 0, rear = 0; int* topoOrder = malloc(graph->numVertices * sizeof(int)); int index = 0; // 将所有入度为0的顶点入队 for (int i = 0; i < graph->numVertices; i++) { if (graph->inDegree[i] == 0) { queue[rear++] = i; } } while (front < rear) { int current = queue[front++]; topoOrder[index++] = current; Node* temp = graph->adjLists[current]; while (temp) { int neighbor = temp->vertex; graph->inDegree[neighbor]--; if (graph->inDegree[neighbor] == 0) { queue[rear++] = neighbor; } temp = temp->next; } } if (index != graph->numVertices) { printf("图中存在环,无法进行拓扑排序!\n"); } else { printf("拓扑排序结果: "); for (int i = 0; i < index; i++) { printf("%d ", topoOrder[i]); } printf("\n"); } free(queue); free(topoOrder);}// 主函数测试int main() { Graph* graph = createGraph(6); addEdge(graph, 5, 2); addEdge(graph, 5, 0); addEdge(graph, 4, 0); addEdge(graph, 4, 1); addEdge(graph, 2, 3); addEdge(graph, 3, 1); topologicalSort(graph); return 0;}- 我们用邻接表存储图结构,同时维护一个 inDegree 数组记录每个顶点的入度。
- 在 topologicalSort 函数中,使用一个简单数组模拟队列(也可用链式队列)。
- 如果最终输出的顶点数量不等于总顶点数,说明图中存在环,此时有向无环图拓扑排序无法完成。
通过本教程,你已经掌握了 C语言图论算法 中的拓扑排序实现方法。它不仅能帮助你解决实际工程中的依赖问题,也是面试中常见的算法题型。建议你动手敲一遍代码,加深理解。
记住:拓扑排序只适用于有向无环图(DAG),如果图中存在环,则不存在合法的拓扑序列。
希望这篇教程对你有所帮助!如果你喜欢,请分享给更多正在学习 C语言拓扑排序 的朋友。
本文由主机测评网于2025-12-26发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://vpshk.cn/20251212706.html