输入变量:char*data:存储了N个关系式的字符串
int In[]:存储了顶点的入度信息
int first[]:指向以该顶点为弧尾的第一条边
EdgeLib edge[]:存储了边信息的边表集
输出变量:表示图的边表集数组
返回值:int :顶点数量
*/
int CreateGraph_2(char *data, int In[], intfirst[], EdgeLib edge[])//创建一个图
{
inti, j;
intcount = 0;//记录顶点数量
for(i=0; i
{
first[i]= -1;
book[i]= 0;
In[i]= 0;
}
for(j=i=0; data[i]!='\0'; i+=2,j++)//每次读取两个变量
{
edge[j].u= data[i] - 'a'; //字母转换为数字,'a'对应0,'b'对应1,以此类推
edge[j].v= data[i+1] - 'a';
book[edge[j].u]= book[edge[j].v] = 1;
edge[j].next= first[edge[j].u];
first[edge[j].u]= j;
In[edge[j].v]++;
}
for(i=0; i
{
if(book[i] != 0)
count++;
}
returncount;
}
/*
函数名称:TopoLogicalSort
函数功能:拓扑排序,采用广度优先搜索获取拓扑序列
输入变量:char*topo:用来存储拓扑序列的字符串
EdgeLib edge[]:存储了边信息的边表集
int In[]:存储了顶点的入度信息
int first[]:指向以该顶点为弧尾的第一条边
int n:顶点个数
输出变量:用来存储拓扑序列的字符串
返回值:int :拓扑排序成功返回真,若存在环则返回假
*/
int TopoLogicalSort(char *topo, EdgeLibedge[], int In[], int first[], int n)
{
inti, u, front, rear;
front= rear = 0;
for(i=0; i
{
if(book[i] != 0 && In[i] == 0)
{
topo[rear++]= i + 'a';
}
}
while(front < rear)//采用广度优先搜索获取拓扑序列
{
u= topo[front++] - 'a';
for(i=first[u]; i!=-1; i=edge[i].next)
{
if(--In[edge[i].v] == 0)
topo[rear++]= edge[i].v + 'a';
}
}
topo[rear]= '\0';
return(rear == n);//如果count小于顶点数,说明存在环
}
这里只给出了相关函数,完整的测试代码请到巧若拙的博客(http://blog.csdn.net/qiaoruozhuo)查看。