下载了一个c语言的拓扑排序的程序,但是我不知道运行的程序该怎样输入代码,求帮忙看看这个代码怎么用
原代码我放在微博了https://weibo.com/6011928429/N9gRKdeAb
这个程序一看就是用的 Turbo C 写的,Turbo C 是dos的,可以用dosbox 去运行
写注释是个好习惯
加了点注释,希望你能看懂
#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();
}
不知道你这个问题是否已经解决, 如果还没有解决的话:#include <stdio.h>
int main()
{
printf("输入一行字符:\n");
char ch;
int i,count=0,word=0;
while((ch=getchar())!='\n')
if(ch==' ')
word=0;
else if(word==0)
{
word=1;
count++;
}
printf("总共有 %d 个单词\n",count);
return 0;
}
// 定义节点结构体
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
输入邻接矩阵的方式是逐行逐列输入矩阵元素,以空格分隔。输入完邻接矩阵后,程序将执行拓扑排序算法,并输出结果。