執行步驟:由aov網構造拓撲序列的拓撲排序演算法主要是迴圈執行以下兩步,直到不存在入度為0的頂點為止。
(1) 選擇乙個入度為0的頂點並輸出之;
(2) 從網中刪除此頂點及所有
出邊。迴圈結束後,若輸出的頂點數小於網中的頂點數,則輸出「有迴路」資訊,否則輸出的頂點序列就是一種拓撲序列。
#ifndef _queue_h
#define _queue_h
/*定義檔案queue.h*/
struct queue;
typedef struct queue *position;
typedef struct queue
*queue;
void makeempty(queue q)
void createqueue()
int isempty(queue q)
/*入隊函式*/
void enqueue(int n,queue q)
/*出隊*/
int dequeue(queue q)
#endif
#include #include #include "queue.h"
typedef struct array/*結構體array->ele儲存根據拓撲排序排列好的定點*/
*array;
typedef struct arr/*儲存每個定點入度的資訊*/
*arr;
typedef struct graph/*儲存邊的資訊*/
*graph;
void initialize(graph *g,arr *s)
for(w=1;w<=5;w++)
(*s)->a[w]=0;
for(j=1;j<=5;j++)
for(i=1;i<=5;i++) }
void topsort(graph g,arr s,array *a)
while(isempty(q)!=1)}}
int main()
程式可以變換的地方:
1.這個程式中的佇列也可以改為棧來描述,會簡單一些。
2.我用來儲存邊的資訊用的臨接矩陣,也可以使用臨接鍊錶。
3.儲存的資訊量可以改變,我把資訊都定位為5,大家編輯的時候可以把我的數字都換為maxnum,然後typedef maxnum 你需要的數字
程式設計值得注意的幾點:
1.要了解入度的定義:入度是
圖論演算法中重要的概念之一。它通常指
有向圖中某點作為圖中邊的終點的次數之和。
2.當下乙個函式需要使用上乙個函式的引數的值的時候,函式的形參一定要使用雙指標,如果你說我是單指標。。。圖樣圖森破,我在結構體定義的時候就已經是指標了。不懂雙指標的同學可以看一下這篇文章寫的很清楚。
最後給大家發一下我的成果吧!
拓撲排序(C語言實現)
拓撲排序可以將乙個有向無環圖轉換為乙個線性序列。它也是判定乙個有向圖是否是無環的方法之一。如何進行拓撲排序,方法如下 1 從有向圖中選取乙個 沒有前驅 入度為 0 的 頂點,並輸出之 2 從有向圖中刪去此頂點以及所有以它為尾的 弧 弧頭頂點的入度減 1 重複上述兩步,直至圖空,或者圖不空但找不到 無...
C 語言實現 拓撲排序
1 拓撲排序的概念 對乙個1.在有向圖中選乙個沒有前驅的頂點並且輸出 2.從圖中刪除該頂點和所有以它為尾的弧 白話就是 刪除所有和它有關的邊 3.重複上述兩步,直至所有頂點輸出,或者當前圖中不存在無前驅的頂點為止,後者代表我們的有向圖是有環的,因此,也可以通過拓撲排序來判斷乙個圖是否有環。3 拓撲排...
基礎拓撲排序 C語言實現
演算法步驟 1 根據鄰接矩陣統計每個頂點的入度,統計結果存在mark中 2 在mark中尋找為0的頂點i,找到後將mark i 並且更新與該點相關的頂點的mark陣列 3 重複步驟 2 直到所有點的mark均為 1。例項以及 全域性變數,圖的鄰接矩陣以及記錄陣列mark int a 6 6 int ...