数据结构 拓扑排序问题运行报错
#include"stdio.h"
#include<stdlib.h>
//#include "malloc.h"
#define MAXLEN 40 //有向图顶点最大数目
#define VEXTYPE int //有向图顶点类型
typedef struct gnode //每条弧对应一个结点
{int adjvex;
struct gnode *next;
}EDGENODE;
typedef struct
{int id; //顶点的入度
VEXTYPE vertex; //顶点的信息
EDGENODE *link; //每个顶点对应一单链表
}VEXNODE;
typedef struct
{VEXNODE adjlist[MAXLEN];//邻接链表
int vexnum,arcnum;//有向图的顶点数目、弧数目
int kind;//有向图的kind=1
}ADJGRAPH;
ADJGRAPH creat_adjgrapg()
{
EDGENODE p;
int i,s,d;
ADJGRAPH adjg;
adjg.kind=1;
printf("请输入顶点数和边数:");
scanf("%d,%d", &s, &d);
adjg.vexnum = s;
adjg.arcnum = d;
for(i = 0; i < adjg.vexnum;i++)//邻接链表顶点初始化
{printf("第%d个顶点信息:",i+1);
getchar();
scanf("%d", &adjg.adjlist[i].vertex);
adjg.adjlist[i].link = NULL;
adjg.adjlist[i].id = 0; }
for(i = 0; i < adjg.arcnum; i++)//每条弧的信息初始化
{printf("第 %d 条边的起始顶点编号和终止顶点编号:", i + 1);
scanf("%d,%d",&s,&d);
while(s < 1 || s > adjg.vexnum || d<1 || d> adjg.vexnum)
{printf("编号超出范围,重新输入:");
scanf("%d,%d", &s, &d);}
s --;
d --;
p=(EDGENODE)malloc(sizeof(EDGENODE));//每条弧对应生成一个结点
p->adjvex = d;
p->next = adjg.adjlist[s].link;//结点插入对应的链表中
adjg.adjlist[s].link = p;
adjg.adjlist[d].id++;//弧对应的终端顶点入度加1
}
return adjg;
}
void topsort(ADJGRAPH ag)
//拓扑排序过程
{
int i, j, k, m, n, top;
EDGENODE *p;
n = ag.vexnum;
top = -1;
for(i = 0; i < n; i++)//将入度为0的顶点压入一个链线,top指向栈顶结点
if(ag.adjlist[i].id==0)//这是一个利用id为0的域链接起来的寄生线
{ag.adjlist[i].id = top;
top = i; }
m = 0;
while(top != -1)//当栈不空时,进行拓扑排序
{j = top;
top = ag.adjlist[top].id;
printf("%3d", ag.adjlist[j].vertex); //输出栈顶元素并删除栈顶元素
m++;
p = ag.adjlist[j].link;
while(p != NULL)
{k = p->adjvex;
ag.adjlist[k].id--; //删除相关的弧
if(ag.adjlist[k].id == 0)//出现新的入度为0的顶点,将其入栈
{ag.adjlist[k].id = top;
top = k;}
p = p->next; }
}
if(m < n)
printf("\n网中有环!\n");//拓扑排序过程中输出的顶点数<有向图中的顶点数
}
main()
{
ADJGRAPH ag = creat_adjgraph();
topsort(ag);
}
最开始出错行书写为
{
ADJGRAPH ag;
ag = creat_adjgraph();
topsort(ag);
}
但报错,我就修改为
{
ADJGRAPH ag= creat_adjgraph();
topsort(ag);
}
但依然报错