1、用邻接表存储有向图; 2、程序模块清晰,输出该图的拓扑排序结果。C语言实现
时间: 2024-12-25 13:36:50 浏览: 0
1. **用邻接表存储有向图**:
邻接表是一种常用的数据结构,用于表示有向图。它通过一个数组或链表来存储每个顶点的所有出边。对于每个顶点,我们维护一个列表,其中包含连接到它的所有相邻顶点。这样,查询任意顶点的出边只需遍历对应顶点的邻接列表即可,提高了查找效率。例如,可以用结构体 `struct Edge` 表示边,用 `vector<Edge> adjList[vertexIndex]` 来存储某个顶点的邻接节点。
```c
typedef struct {
int destination; // 目标节点
} Edge;
// 示例邻接表表示有向图
typedef struct Node {
int vertex;
vector<Edge> edges;
} GraphNode;
vector<GraphNode> graph; // 图的全局变量
```
2. **C语言实现程序模块,输出有向图的拓扑排序结果**:
拓扑排序通常用于确定有向无环图(DAG)中的节点顺序,保证先完成的节点不会依赖于后完成的节点。这里可以使用深度优先搜索(DFS)辅助算法。首先检查图是否为强连通分量,如果不是,则无法进行拓扑排序。下面是简化的C语言代码:
```c
void dfs(GraphNode* node, vector<int>& visited, vector<int>& topologicalOrder) {
visited[node->vertex] = 1;
for (const auto& edge : node->edges) {
if (!visited[edge.destination]) {
dfs(&graph[edge.destination], visited, topologicalOrder);
}
}
topologicalOrder.push_back(node->vertex); // 将当前节点添加到结果列表最后
}
bool isTopSortPossible(vector<GraphNode>& graph) {
// 确保图是强连通的
// 如果不是,此处返回false
// ... (检查强连通性)
vector<int> visited(graph.size(), 0); // 初始化访问标记
stack<GraphNode*> s;
for (auto& node : graph) {
if (visited[node.vertex] == 0) {
dfs(&node, visited, topologicalOrder);
}
}
return topologicalOrder.size() == graph.size();
}
int main() {
// 根据图的实际数据填充和初始化
if (isTopSortPossible(graph)) {
vector<int> topologicalOrder;
for (int i : topologicalOrder) {
printf("%d ", i);
}
printf("\n");
} else {
printf("图中存在循环,无法进行拓扑排序。\n");
}
return 0;
}
```
阅读全文