请用C语言实现一个带入度域的图(邻接表表示),并以此实现拓扑排序算法
时间: 2024-01-27 20:03:32 浏览: 66
好的,以下是实现代码:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_VERTEX_NUM 100 // 最大顶点数
// 边表节点
typedef struct ArcNode {
int adjvex; // 邻接点
int indegree; // 入度
struct ArcNode *nextarc; // 指向下一条边的指针
} ArcNode;
// 顶点表节点
typedef struct {
int data; // 顶点数据
ArcNode *firstarc; // 指向第一条边的指针
} VNode;
// 邻接表
typedef struct {
VNode vertices[MAX_VERTEX_NUM]; // 顶点表
int vexnum, arcnum; // 顶点数和边数
} Graph;
// 初始化图
void InitGraph(Graph *G) {
int i;
G->vexnum = G->arcnum = 0;
for (i = 0; i < MAX_VERTEX_NUM; i++) {
G->vertices[i].data = 0;
G->vertices[i].firstarc = NULL;
}
}
// 添加顶点
void AddVertex(Graph *G, int v) {
G->vertices[G->vexnum].data = v;
G->vexnum++;
}
// 添加边
void AddArc(Graph *G, int v, int w) {
ArcNode *p, *q;
q = (ArcNode *)malloc(sizeof(ArcNode));
q->adjvex = w;
q->indegree = 0;
q->nextarc = NULL;
if (G->vertices[v].firstarc == NULL) {
G->vertices[v].firstarc = q;
} else {
p = G->vertices[v].firstarc;
while (p->nextarc != NULL) {
p = p->nextarc;
}
p->nextarc = q;
}
G->arcnum++;
}
// 计算各个顶点的入度
void CalcInDegree(Graph *G, int *inDegree) {
int i;
for (i = 0; i < G->vexnum; i++) {
ArcNode *p = G->vertices[i].firstarc;
while (p != NULL) {
inDegree[p->adjvex]++;
p = p->nextarc;
}
}
}
// 拓扑排序算法
void TopoSort(Graph *G) {
int inDegree[MAX_VERTEX_NUM] = {0}; // 记录各个顶点的入度
CalcInDegree(G, inDegree); // 计算各个顶点的入度
int i, j, k;
for (i = 0; i < G->vexnum; i++) {
for (j = 0; j < G->vexnum; j++) {
if (inDegree[j] == 0) { // 找到一个入度为0的顶点
printf("%d ", G->vertices[j].data); // 输出该顶点
inDegree[j] = -1; // 将该顶点的入度标记为-1
ArcNode *p = G->vertices[j].firstarc;
while (p != NULL) { // 将与该顶点相邻的顶点的入度减1
k = p->adjvex;
if (inDegree[k] > 0) {
inDegree[k]--;
}
p = p->nextarc;
}
break;
}
}
}
}
// 测试
int main() {
Graph G;
InitGraph(&G);
AddVertex(&G, 0);
AddVertex(&G, 1);
AddVertex(&G, 2);
AddVertex(&G, 3);
AddVertex(&G, 4);
AddArc(&G, 0, 1);
AddArc(&G, 0, 3);
AddArc(&G, 1, 3);
AddArc(&G, 1, 2);
AddArc(&G, 3, 4);
AddArc(&G, 4, 2);
TopoSort(&G);
return 0;
}
```
实现的是一个带有入度域的图,邻接表表示,并且实现了拓扑排序算法。
阅读全文