试编写 利用DFS实现有向无环图的拓扑排序的算法
#include <iostream>
#define maxsize 10
typedef struct node{
int data;
struct node *next;
}node ,*pnode;
pnode buynode(int x)
{
pnode tmp=(pnode) malloc(sizeof (node));
tmp->data=x;
tmp->next= nullptr;
return tmp;
}
pnode * graph(int point)//结点数量
{
pnode * g=(pnode*) malloc(sizeof (pnode)*point);
for(int i=0;i<point;i++)
g[i]= buynode(i);
return g;
}
void insert(pnode* g,int p1,int p2)//无向图
{
pnode tmp=g[p1];
while(tmp->next&&tmp->next->data<p2) tmp=tmp->next;
pnode ne=tmp->next;
tmp->next= buynode(p2);
tmp->next->next=ne;
// tmp=g[p2];
// while(tmp->next&&tmp->next->data<p1) tmp=tmp->next;
// ne=tmp->next;
// tmp->next= buynode(p1);
// tmp->next->next=ne;
}
void figure1(pnode* g)
{
insert(g,0,1);
insert(g,0,2);
insert(g,1,3);
insert(g,1,4);
insert(g,2,4);
insert(g,2,3);
insert(g,5,2);
// insert(g,1,2);
}
void print(pnode *g,int point)
{
for(int i=0;i<point;i++)
{
pnode tmp=g[i];
while(tmp) {
printf("%3d",tmp->data);
tmp=tmp->next;
}
puts("");
}
}
void dfs(pnode * g,int point,int* &visited,int &time,int* &finishtime)
{
visited[point]=1;
// printf("%3d",point);
pnode tmp=g[point];
//先访问子节点,将子节点全部放问完了再访问根节点
while(tmp->next)
{
if(!visited[tmp->next->data]) dfs(g,tmp->next->data,visited,time,finishtime);
tmp=tmp->next;
}
time=time+1;
finishtime[point]=time;
}
void dfstraverse(pnode* g ,int num)
{
int * visited=(int *) malloc(sizeof (int)*maxsize);
int *finishtime=(int*) malloc(sizeof (int)*num);
for(int i=0;i<maxsize;i++) visited[i]=0;
for(int i=0;i<num;i++) finishtime[i]=0;
int time=0;
for(int i=0;i<num;i++)
{
if(!visited[i]) dfs(g,i,visited,time,finishtime);
}
// puts("");
// for(int i=0;i<num;i++) printf("%3d",finishtime[i]);
puts("");
for(int i=0;i<num;i++){
for(int j=0;j<num;j++){
if(finishtime[j]==num-i){
printf("%2d->",j);
}
}
}
}
int main() {
pnode* g1=graph(6);
figure1(g1);
print(g1,6);
dfstraverse(g1,6);
return 0;
}
测试的图如下