#include <stdio.h>
#include <stdlib.h>
#define Max_Vertex_Num 100
#define STACK_SIZE 30
typedef struct ArcNode{
int adjvex; //此题用不到
struct ArcNode *nextarc;//下一个节点
int weight;//权重-此题用不到
}ArcNode;
/*表头节点*/
typedef struct VNode{
int vertex;//表头数组的数据
ArcNode *firstarc;//表头数组的表头节点域
}VNode;
typedef VNode Adjlist[Max_Vertex_Num];//VNode构成的表头节点数组
/*整个邻接表*/
typedef struct{
Adjlist adjlist;//每个定点后面的链表,记录关联点
int vexnum,arcnum;//顶点数和边数
}ALGraph;
/*栈*/
typedef struct{
int *base;
int *top; //栈顶指针
int size;
}seqStack;
int InitStack(seqStack *s){
s->base = (int *)malloc(STACK_SIZE* sizeof(seqStack));//动态分配30个单位的stack
//省略是否空间满
s->top = s->base;//栈顶和栈尾相同,栈里面没有元素
s->size = STACK_SIZE;
return 1;
}
int Push(seqStack *s,int x){
*s->top = x;
s->top++;
return 1;
}
int Pop(seqStack *s,int *x){
if(s->top == s->base)return 0;
else{
s->top--;
*x = *s->top;
return 1;
}
}
int GetTop(seqStack *s, int *x){
if(s->top==s->base)
return 0;
else{
*x=*(s->top-1);
return 1;
}
}
int IsEmpty(seqStack *s){
if(s->top==s->base){
return 1;
}else{
return 0;
}
}
void FindIndegree(ALGraph *G,int indegree[])
{
int i;
ArcNode *p;
for(i = 0;i<G->vexnum ;i++)
{
indegree[i]=0;
}
for(i = 0;i<G->vexnum ;i++)
{
p = G->adjlist[i].firstarc;
while(p){
indegree[p->adjvex]++;
p=p->nextarc;
}/*while*/
}/*for*/
}/*end*/
void TopLogicalSort(ALGraph *G){
int i,k;
int count;
ArcNode *p;
int indegree[G->vexnum];
FindIndegree(G,indegree);
seqStack s;
InitStack(&s);
for(i = 0;i<G->vexnum;i++)
{
//入度为0的顶点入栈
if(indegree[i]==0){
Push(&s,i);
}
}
count =0;
while(!IsEmpty(&s)){
Pop(&s,&i);
printf("%d ",G->adjlist[i].vertex);
++count;
for(p=G->adjlist[i].firstarc;p;p=p->nextarc)
{
k=p->adjvex;
if((--indegree[k]==0)){
Push(&s,k);
}/*if*/
}/*for*/
}/*while*/
/*回路异常*/
if(count<G->vexnum){
exit(0);
}
}
int LocateVex(ALGraph *G,int u){
int i;
for(i = 0; i<G->vexnum;++i)
{
if(G->adjlist[i].vertex == u)
{
return i;
}
}
return -1;
}
void CreateALGraph(ALGraph *G,int gType)
{
ArcNode *p;
int i,j,k;
int v1,v2;
scanf("%d,%d",&G->vexnum,&G->arcnum); //输入顶点数和边数
if(gType==0)
{
for(k=0;k<G->vexnum;k++)
{
G->adjlist[k].vertex = k;
G->adjlist[k].firstarc = NULL;
}
k = 0;
while(k<G->arcnum){
scanf("%d,%d",&v1,&v2);
k++;
i = LocateVex(G,v1);
j = LocateVex(G,v2);
/*给第i的表头添加数据是j的节点*/
p=(ArcNode*)malloc(sizeof(ArcNode));
p->adjvex = j;
p->nextarc = G->adjlist[i].firstarc;
G->adjlist[i].firstarc = p;
/*给第j的表头添加数据是i的节点*/
p=(ArcNode*)malloc(sizeof(ArcNode));
p->adjvex = i;
p->nextarc = G->adjlist[j].firstarc;
G->adjlist[j].firstarc = p;
}
}else{
for(k=0;k<G->vexnum;k++)
{
G->adjlist[k].vertex = k;
G->adjlist[k].firstarc = NULL;
}
k = 0;
while(k<G->arcnum){
scanf("%d,%d",&v1,&v2);
k++;
i = LocateVex(G,v1);
j = LocateVex(G,v2);
/*给第i的表头添加数据是j的节点——有向图,不需要给j添加i数据的节点了*/
p=(ArcNode*)malloc(sizeof(ArcNode));
p->adjvex = j;
p->nextarc = G->adjlist[i].firstarc;
G->adjlist[i].firstarc = p;
}
}
}
int main()
{
ALGraph G;
CreateALGraph(&G,1);
TopLogicalSort(&G);
return 0;
}
图的拓扑排序(邻接表)
猜你喜欢
转载自blog.csdn.net/Xenoverse/article/details/84315138
今日推荐
周排行