#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//該結構體用來表示從某個頂點可以到達的其他頂點
struct ENode
{
int secPoint;//頂點號
ENode *next;//指向下一個頂點的指標
};
//該結構體表示每一個頂點的資訊
struct PNode
{
char value;//頂點的值
int inDegree;
int outDegree;
ENode *next;//指向頂點可以到達的其他第一個頂點的指標
};
//圖的結構體,該圖最多有100個頂點
struct Map
{
PNode point[100];//數組的下標就是這個頂點的頂點號
int numPoint,numEdge;
};
//建圖的函數
struct Map *CreateMap()
{
struct Map *mp = (struct Map*)malloc(sizeof(struct Map));
int i,j;
int firP,secP;
int numP,numE;
char infoP;
memset(mp,0,sizeof(struct Map));
printf("請輸入頂點數和邊數,格式為‘頂點數,邊數’:\n");
scanf("%d,%d",&numP,&numE);
mp->numPoint = numP;
mp->numEdge = numE;
printf("請輸入各個頂點的資訊,沒有分隔字元的連續輸入:\n");
fflush(stdin);
for(i=0;i<mp->numPoint;i++)
{
scanf("%c",&infoP);
mp->point[i].value = infoP;
}
printf("請輸入邊,格式為‘頂點-頂點’\n");
fflush(stdin);
for(j=0;j<mp->numEdge;j++)
{
scanf("%d-%d",&firP,&secP);
struct ENode *newNode = (struct ENode *)malloc(sizeof(struct ENode));
mp->point[firP].outDegree++;
mp->point[secP].inDegree++;
newNode->secPoint = secP;
newNode->next = mp->point[firP].next;
mp->point[firP].next = newNode;
}
return mp;
}
//拓撲排序
void TopSort(struct Map *mp)
{
int iPoint,iNoInPoint;
int noInPoint[20];
int curPoint;
struct ENode *pNode;
//將初始狀態入度為0的節點放入數組
for(iPoint=0,iNoInPoint=0;iPoint<mp->numPoint;iPoint++)
{
if(mp->point[iPoint].inDegree==0)
{
noInPoint[iNoInPoint]=iPoint;
iNoInPoint++;
}
}
iNoInPoint--;
//如果數組不為空白就輸出數組中最後一個元素,然後做相應操作
printf("\n拓補排序序列:\n");
while(iNoInPoint>=0)
{
curPoint = noInPoint[iNoInPoint];
printf("%d",curPoint);
iNoInPoint--;
//迴圈遍曆輸出節點所能到達的每一個節點,並將這些節點的入度減一
for(pNode=mp->point[curPoint].next;pNode!=NULL;pNode=pNode->next)
{
mp->point[pNode->secPoint].inDegree--;
//如果某個節點入度減少為0,則加入到數組中
if(mp->point[pNode->secPoint].inDegree==0)
{
iNoInPoint++;
noInPoint[iNoInPoint] = pNode->secPoint;
}
}
}
printf("\n");
}
int main()
{
struct Map *mp = CreateMap();
TopSort(mp);
return 1;
}