#include
#include
#define maxvex 6
//起始頂點數預設為6,可在此直接修改
#define maxedge 8
//起始邊的數預設為8,可在此直接修改
using namespace std;
//該**是鄰接表拓撲排序原理
//步驟1:在有向圖中選乙個沒有前驅(即入度為0)的頂點(用棧來儲存)且輸出其資訊
//步驟2:從圖中刪除該頂點(出棧)和所有以他為尾的弧(相鄰頂點的入度-1)
//步驟3:重複上述兩步,直至全部頂點均已輸出或當前圖中已不存在無前驅的頂點為止
//注意點1:下標0的位置都不用,所以要多開闢乙個空間
//注意點2:頭結點資訊既可以是字元a,b,c,d,也可以是字元'1','2'...
//注意點3:在建立鄰接表時,使用頭插法將邊結點接在頭結點之後
typedef
struct sqstack
sqstack;
//棧typedef
struct edgenode
edgenode;
//邊結點
typedef
struct
vextexnode,adjlist;
//頭結點(即鄰接表)
typedef
struct
algraph;
/*****************初始化靜態棧******************/
void
initstack
(sqstack & s)
s.top=0;
}/******************壓棧*************************/
//進棧是從下標1開始存放,0位置不存放資料
void
push
(sqstack &s ,
int e)
else
}/******************出棧*************************/
void
pop(sqstack &s ,
int&e)
/******************判斷是否空棧*****************/
intemptystack
(sqstack &s)
/******************初始化鄰接表*******************/
void
initadjlist
(algraph &g)
}//通過兩個結點來確認邊,並得到這兩個結點的在陣列的下標位置
/*********************確定鄰接表陣列下標的位置*********************/
void
locata
(algraph &g,
char
&vex1,
char
&vex2,
int&m,
int&n)
}/******************建立鄰接表*******************/
void
setadjlist
(algraph &g)
//初始化頂點的入度
for(
int i=
1;i<=maxvex;i++)}
/******************顯示鄰接表*******************/
void
showadjlist
(algraph &g)
}/*********************拓撲排序**************************/
void
topological
(algraph &g)
cout<<
"拓撲排序如下:"
(emptystack
(s)!=0)
//表示棧非空}}
intmain()
資料結構 拓撲排序
設g v,e 是乙個具有n個頂點的有向圖,v中的頂點序列v0,v1,v2,vn 1如果滿足下列條件 若從vi到vj有一條路徑,則在頂點序列中頂點vi必定在vj之前,這樣的序列稱為拓撲序列。對乙個有向圖構造拓撲序列的過程稱為拓撲排序 topological sort 顯然,每乙個可以構造出不止乙個拓撲...
資料結構 拓撲排序
aov網路用有向圖的頂點表示活動,頂點之間的有向邊表示活動間的先後關係,這種有向圖稱為頂點表示活動網路,簡稱aov網路。當限制各個活動只能序列進行時,可以將aov網路中所有頂點排列成乙個線性序列,且vi必須在vj之前,我們就稱這個線性序列為拓撲序列,把對aov網構造拓撲序列的操作稱為拓撲排序。拓撲排...
資料結構 拓撲排序
拓撲排序是圖中重要的操作之一,在實際中應用很廣泛.再aov網中,不應該出現有向環路,因為有環意味著某項活動以自己作為先決條件,這樣就進入了死迴圈.因此,對給定的aov網應該首先判定網中是否存在環 檢測的辦法就是對有向圖進行拓撲排序,拓撲排序是指照有向圖給出的次序關係,將圖中頂點排成乙個線性序列,對於...