在鄰接表儲存結構中,為了便於檢查每個頂點的入度,可在頂點表中增加乙個入度域(id),這樣的鄰接表如下圖所示,這樣只需對由n個元素構成的頂點表進行檢查就能找出入度為0的頂點。為了避免對每個入度為0的頂點重複訪問,可用乙個鏈棧來儲存所有入度為0的頂點。在進行拓撲排序前,只要對頂點表進行一次掃瞄,便可將所有入度為0的頂點都入棧,以後每次從棧頂取出入度為0的頂點,並將其輸出。
原始圖為:
其對應的鄰接表為:
在鄰接表儲存結構中實現拓撲排序演算法的步驟為:
(1) 掃瞄頂點表,將入度為0的頂點入棧。
(2) 當棧非空時執行以下操作:
1.將棧頂頂點vi的序號彈出,並輸出之;(3) 若輸出的頂點數小於n,則輸出「有迴路」,否則拓撲排序正常結束。2.檢查vi的出邊表,將每條出邊表鄰接點域所對應的頂點的入度域值減1,若該頂點入度為0,則將其入棧;
在具體實現時,鏈棧無須占用額外空間,只需利用頂點表中入度域值為0的入度域來存放鏈棧的指標(即指向下乙個存放鏈棧指標的單元的下標),並用乙個棧頂指標top指向該鏈棧的頂部即可。由此給出以下的具體演算法:
#include#include#define n 7//頂點個數
//鄰接表的結構體
typedef struct node
edgenode;
typedef struct
vexnode;
//進行拓撲排序
void toposort_adjtable(vexnode ga[n])
p=p->next;
} }if(madjvex=2;
ga[0].link=s;
s=(edgenode *)malloc(sizeof(edgenode));
s->adjvex=3;
ga[0].link->next=s;
s->next=null;
s=(edgenode *)malloc(sizeof(edgenode));
s->adjvex=6;
ga[1].link=s;
s=(edgenode *)malloc(sizeof(edgenode));
s->adjvex=7;
ga[1].link->next=s;
s->next=null;
s=(edgenode *)malloc(sizeof(edgenode));
s->adjvex=7;
ga[2].link=s;
s->next=null;
s=(edgenode *)malloc(sizeof(edgenode));
s->adjvex=3;
ga[3].link=s;
s=(edgenode *)malloc(sizeof(edgenode));
s->adjvex=5;
ga[3].link->next=s;
s->next=null;
s=(edgenode *)malloc(sizeof(edgenode));
s->adjvex=7;
ga[4].link=s;
s->next=null;
ga[5].link=null;
ga[6].link=null;
//初始化邊表結束
toposort_adjtable(ga);//進行拓撲排序
printf("\n");
}
解釋說明
原文:
使用鄰接表進行拓撲排序的演算法說明
講拓撲排序的概念,先來回顧乙個大家熟悉的東西 技能樹 圖 因為這個特好理解,玩過暗黑或其他rpg遊戲的都應該見過類似的技能樹,一句話,就是學習高階技能前需要先學習之前的低階技能。乙個技能樹其實是乙個簡單的圖,你可以把它再變化一下就是一張圖,即讓一些高階技能間也發生聯絡,使得學習一種高階技能可以通過多...
拓撲排序 C語言 鄰接表
資料結構 typedef struct side 邊 side,slink typedef struct vertex 頂點 vertex,adjlist 20 typedef struct graph 圖 graph,glink 建立 void creategraph glink g printf...
基於鄰接表的拓撲排序實現
由於 比較簡單,就直接貼出來了 1 include 2 include 3 include 4 include 5 using namespace std 67 8enum graphtype9 1516 結點顏色代表遍歷情況 17enum colortype18 2324 template25 c...