C语言-这个拓扑排序课表程序怎么用

下载了一个c语言的拓扑排序的程序,但是我不知道运行的程序该怎样输入代码,求帮忙看看这个代码怎么用
原代码我放在微博了https://weibo.com/6011928429/N9gRKdeAb

这个程序一看就是用的 Turbo C 写的,Turbo C 是dos的,可以用dosbox 去运行

写注释是个好习惯

img

加了点注释,希望你能看懂

#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <malloc.h>
#define stack_size 100

// 定义一个弧结点的结构体,包含邻接点的编号和指向下一个弧结点的指针
typedef struct ArcNode {
    int  adjvex;
    struct ArcNode *nextarc;
} ArcNode;

// 定义一个顶点的结构体,包含课程名称、入度和指向第一个弧结点的指针
typedef struct VNode {
    char name[20];

    int id;
    ArcNode *link;
} VNode,adjlist[100];

// 定义一个邻接表的结构体,包含顶点数组、课程数和边数
typedef struct {
    adjlist vertices;
    int c,d;
} AlGraph;

// 定义一个栈的结构体,包含栈顶指针、栈底指针和栈的大小
typedef struct {
    int *top;
    int*base;
    int stacksize;
} Sqstack;

// 初始化栈,分配内存空间,设置栈顶和栈底指针,设置栈的大小
void InitStack(Sqstack *s) {
    s->base=(int *)malloc(stack_size*sizeof(int));
    if(!s->base) exit(-1);
    s->top=s->base;
    s->stacksize=stack_size;
}
// 入栈操作,将元素x压入栈中,如果栈满则报错
void Push(Sqstack *s,int x) {
    if(s->top - s->base >= s->stacksize) exit(-1);
    *s->top++=x;
}
// 出栈操作,将栈顶元素弹出,并赋值给x,如果栈空则报错
void Pop(Sqstack *s,int * x) {
    if(s->top==s->base) exit(-1);
    *x=*(--s->top);
}
// 判断栈是否为空,如果为空返回1,否则返回0
int Stackempty(Sqstack *s) {
    if(s->top==s->base) return 1;
    else return 0;
}

// 创建邻接表,输入课程数和边数,输入每个课程的名称和每条边的起点和终点,创建顶点数组和弧结点链表,并计算每个顶点的入度
void CreatGraph(AlGraph*G) {
    int i,j,k;
    int id;
    ArcNode *firstarc;
    ArcNode *p;
    printf("please input course number:");
    scanf("%d",&G->c);

    for(i=0; i<=G->c;) {
        G->vertices[i].link=NULL;
        i++;
        if(i<=G->c) {
            printf("the %d lessen:",i);
            scanf("%s",&G->vertices[i].name);
        }
    }
    printf("\nplease input EdgeNodes number:");
    scanf("%d",&G->c);

    for(i=1; i<=G->c; i++) {
        printf("\nplease input Vi&Vj:= ");
        scanf("%d,%d",&j,&k);
        if(j<0||j>G->c||k<0||k>G->c) {
            printf("\nplease retype");
            scanf("%d,%d",&j,&k);
        }
        p=(ArcNode *)malloc(sizeof(ArcNode));
        if(!p) exit(-1);
        p->adjvex=k;
        p->nextarc=NULL;
        if(G->vertices[j].link==NULL) G->vertices[j].link=p;
        else {
            p->nextarc=G->vertices[j].link;
            G->vertices[j].link=p;
        }
        G->vertices[k].id++;
    }
}
// 拓扑排序,使用栈来存储入度为0的顶点,依次弹出并输出顶点,并删除以该顶点为起点的边,并将新产生的入度为0的顶点压入栈中,直到栈空或者无法继续为止。如果输出的顶点数小于课程数,说明图中有环,否则输出成功
int TopuSort(AlGraph *G) {
    int i,j, k;
    int num = 0, d=1,  m=0 ;
    ArcNode *p;
    Sqstack s;
    InitStack(&s);
    printf("\nthe 1 team course:\n\n");
    for (i = 0; i <= G->c; i++)
        if (!(G->vertices[i].id)) {
            printf("%s   ",G->vertices[i].name);
            Push(&s,i);
            num++;
            m++;
        }
    printf("\n");
    i=1;
    d=2;
    while(!Stackempty(&s)) {
        Pop(&s,&j);
        m=num;
        while(i<d&&num<G->c) {
            i++;
            printf("the %d team course:\n\n",i);
        }
        for (p=G->vertices[j].link; p; p=p->nextarc) {
            k=p->adjvex;
            G->vertices[k].id--;
            if(G->vertices[k].id==0) {
                printf("%s   ",G->vertices[k].name);
                num++;
                Push(&s,k);
            }
        }
        printf("\n");
        if(m!=num)  d++;
        if(num==m+1) d--;
    }
    if(num<G->c) printf("\nThe Graph has a cycle!!!\n");
    else return 1;
}

main() {
    int i;
    AlGraph G;
    CreatGraph(&G);
    TopuSort(&G);
    getch();
}    


不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
// 定义节点结构体
typedef struct ArcNode

// 定义顶点结构体
typedef struct VNode 

// 定义图结构体
typedef struct 

// 定义栈结构体
typedef struct

// 初始化栈结构体
void InitStack(Sqstack* s) 

// 推入元素到栈顶
void Push(Sqstack* s, int x)

// 弹出栈顶元素
void Pop(Sqstack* s, int* x)

// 判断栈是否为空
int Stackempty(Sqstack* s) 

// 创建图结构体
void CreatGraph(AlGraph* G) 

// 拓扑排序算法
int TopuSort(AlGraph* G)

你程序都有了,运行之后会提示你输入什么数据的。你不知道输入什么数据,说明你对这个拓扑结构不了解。
printf("please input course number:");这里是要输入课程的数量
printf("\nplease input EdgeNodes number:");这里是要输入边缘节点的数量。
具体的输入示例,可以参考:https://blog.csdn.net/qq_41867448/article/details/84995558

用C语言编程实现拓扑排序,拓扑排序(一)之 C语言详解
可以参考下,

运行代码后,根据提示输出数据

基于new bing部分指引作答:
拓扑排序是一种对有向无环图(DAG)进行排序的算法。它根据图中各个节点之间的依赖关系确定节点的顺序。下面是一个示例的C语言代码,实现了拓扑排序算法:

#include <stdio.h>

#define MAX_SIZE 100

int adjMatrix[MAX_SIZE][MAX_SIZE];
int visited[MAX_SIZE];
int stack[MAX_SIZE];
int top = -1;

void dfs(int vertex, int size) {
    int i;
    visited[vertex] = 1;

    for (i = 0; i < size; i++) {
        if (adjMatrix[vertex][i] && !visited[i]) {
            dfs(i, size);
        }
    }

    stack[++top] = vertex;
}

void topologicalSort(int size) {
    int i;

    for (i = 0; i < size; i++) {
        visited[i] = 0;
    }

    for (i = 0; i < size; i++) {
        if (!visited[i]) {
            dfs(i, size);
        }
    }

    printf("Topological Sort: ");
    while (top >= 0) {
        printf("%d ", stack[top--]);
    }
}

int main() {
    int i, j, size;

    printf("Enter the number of vertices: ");
    scanf("%d", &size);

    printf("Enter the adjacency matrix:\n");
    for (i = 0; i < size; i++) {
        for (j = 0; j < size; j++) {
            scanf("%d", &adjMatrix[i][j]);
        }
    }

    topologicalSort(size);

    return 0;
}

在这个示例程序中,我们首先输入有向图的邻接矩阵表示。矩阵中的元素adjMatrix[i][j]表示从顶点i到顶点j是否存在一条有向边。

程序运行时,首先会要求输入顶点的数量,然后要求输入邻接矩阵。例如,如果我们想对以下图进行拓扑排序:

0 --> 1 --> 4
|           ^
V           |
2 --> 3 -----

输入的示例邻接矩阵为:

0 1 1 0 0
0 0 0 1 1
0 0 0 0 0
0 0 0 0 1
0 0 0 0 0

输入邻接矩阵的方式是逐行逐列输入矩阵元素,以空格分隔。输入完邻接矩阵后,程序将执行拓扑排序算法,并输出结果。