C 資料結構 拓撲排序

2021-09-02 14:28:35 字數 2045 閱讀 3624

#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網應該首先判定網中是否存在環 檢測的辦法就是對有向圖進行拓撲排序,拓撲排序是指照有向圖給出的次序關係,將圖中頂點排成乙個線性序列,對於...