图拓扑排序问题

xiaoling_315 2009-05-21 08:25:42
#include "stdlib.h"
#include "stdio.h"
#include "malloc.h"
#define MAXSIZE 20
#define NULL 0
#define ERROR 0
#define OK 1
#define STACK_INIT_SIZE 100
#define OVERFLOW -1
#define STACKINCREMENT 20
#define MAX_VERTEX_NUM 20

typedef struct ArcNode
{
int adjvex;
struct ArcNode *nextarc;

}ArcNode;
typedef struct VNode
{
int data ;
struct ArcNode * firstarc;
int indegree;
}VNode ,AdjList[MAX_VERTEX_NUM ];
typedef struct
{
AdjList vertice;
int vexnum,arcnum;

}Graph;
typedef struct
{
int *base;
int *top;
int stacksize;

}SqStack;
int indegree[MAX_VERTEX_NUM];


int initstack(SqStack *s)
{
s->base=(int *)malloc(STACK_INIT_SIZE*sizeof(int));
if(!s->base)exit(OVERFLOW);
s->top=s->base;
s->stacksize=STACK_INIT_SIZE;
return OK;
}
int Push(SqStack *s,int e)
{if(s->top-s->base>=s->stacksize)
{s->base=(int *)realloc(s->base,(s->stacksize+STACKINCREMENT)*sizeof(int));
if(!s->base)exit(OVERFLOW);
s->top=s->base+s->stacksize;
s->stacksize+=STACKINCREMENT;
}
*s->top++=e;
return OK;}
int Pop(SqStack *s,int *e)
{
if(s->base==s->top)return ERROR;
*e=*--s->top;
return OK;
}
int GetTop(SqStack s,int *e)
{if(s.base==s.top)return ERROR;
*e=*(s.top--);
return OK;
}
int StackEmpty(SqStack *s )
{if(s->base==s->top)return OK;
else
return ERROR;
}


void CreateGraph(Graph *g)
{
ArcNode *q;

int i,k,x,y;
printf("input graph vexnum and arcnum:");
scanf("%d,%d",&(g->vexnum),&(g->arcnum));
getchar();
for(i=0;i <g->vexnum;i++)
{
printf("Please input the name of Node:");
scanf("%d",&(g->vertice[i].data));
getchar();
g->vertice[i].firstarc=NULL;

/*printf("data is:%c",g->vertice[i].data);*/
}
/*getch(); */
for(k=0;k <g->arcnum;k++)
{
printf("Please input beginNode and EndNode :");
scanf("%d %d",&x,&y);
getchar();

q=(ArcNode *)malloc(sizeof(ArcNode));
q->adjvex=y;
q->nextarc=g->vertice[x].firstarc;/*qianchafa*/
g->vertice[x].firstarc=q;

}
/*getch();*/
}

void FindInDegree(Graph G)
{ int i,id;
ArcNode *p;
for(i=0;i <G.vexnum;i++)
{
indegree[i]=0;
for( id=0;id <G.vexnum;id++)
{
p=G.vertice[id].firstarc;
while(p)
{
if(p->adjvex==(i+1))
indegree[i]++;
p=p->nextarc;
}
}
}
}



int TopSort(Graph g)
{
int i,k,count;
ArcNode *p;
SqStack s;
initstack(&s);
FindInDegree(g);
for(i=0;i <g.vexnum;++i)
{
if(indegree[i]==0)
Push(&s,i);
}
count=0;
while(!StackEmpty(&s))
{
Pop(&s,&i);
printf("%d,%d",&i,&(g.vertice[i].data));
++count;
for(p=g.vertice[i].firstarc;p;p=p->nextarc)
{
k=p->adjvex;

if(!(--indegree[k]))
Push(&s,k);
}
}
if(count <g.vexnum)
return ERROR;
else
return OK;
}

main()
{
Graph g;
clrscr();
CreateGraph(&g);
printf("\n");
TopSort(g);

}

为什么运行的时候出来的是随机数
不是全序序列?能不能帮看一下,谢啦哦
...全文
143 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
绿色夹克衫 2009-05-21
  • 打赏
  • 举报
回复
确实不太容易看,算法版主要是交流算法思想,这类代码找错的问题,往往得不到很好的回答!
有时候发到C版,可能效果更好!如果LZ是对拓扑排序的思想有什么不理解的,大家可以一同交流!
sunnyplain 2009-05-21
  • 打赏
  • 举报
回复
哥们,你以为这里的人都是计算机啊,搞这么一大堆代码出来,给钱都不一定有人愿意看

33,010

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧