一種經典的鄰接表的實現和遍歷方式

2021-08-05 18:53:56 字數 919 閱讀 2364

鄰接表不和鄰接矩陣只和點有若干聯絡,它和點與邊都有密切的聯絡。

鄰接表的實現需要四個東西,乙個是記錄邊資訊的陣列、乙個是表頭、乙個是當前操作邊的序號、乙個是add函式。(當然也少不了初始化函式了)

具體如下。

int which=1;

int head[maxv];

struct edge

}e[maxv];

void add(int s, int d,int w)

void initforgraph()

which表示當前操作的是哪一條邊(是邊的序號)(有些人喜歡用size、用n,其實都是習慣問題了。which到最後輸入結束的時候也是邊的數量)

head是表頭,head表示以2為起點的邊的表。

e陣列是記錄邊資訊的,但是由於鄰接表的特殊性,我們只需要記錄他的終點、權值和下一條邊的序號,而不是像克魯斯卡爾演算法中經典地儲存起點、終點、權值這樣子。

在插入邊表的時候是前叉式,所以**看上去好像是有點繞。

不了解前叉式建表的話建議先去看看鍊錶的插入的幾種方式。

這裡注意下head一定要初始化為-1的。

不了解鄰接表的話,也比較難看懂**,建議學一下資料結構的圖的相關知識。

當然這種實現方式不是使用教科書上的指標的實現方式,而是用陣列模擬的。他們使用起來是一樣的效果。

下面是遍歷方式。

其實使用鄰接表的圖的遍歷方式很像是bfs,由乙個點發散的遍歷他相鄰的點(邊)。

遍歷方式是基於我上面給出的鄰接表的實現方式的。

int main()

for(int i=1;i<=n;i++)

printf("\n");

}}

下面的第一重迴圈是對所有的點進行迴圈,第二重迴圈是對以這個點為起點的所有的邊的迴圈。

Fibonacci數列的一種經典遞迴實現

剛才.net課程期末考試,正好最後一題考的是遞迴實現fibonacci數列.順便就把 打出來發在這裡.雖然沒什麼技術含量 wink 主要特性就是使用buffer將先前已經計算過的fibonacci數列的值儲存下來,減少遞迴時的重複計算開銷.c 沒直接的lazy evaluation,這種採取buff...

經典的一種觀察者模式實現

為你的類class target設計乙個觀察者基類class observer,同時設計乙個觀察者容器 typedef std listobserver list 再為observer設計一系列的虛函式,表示事件處理函式,在某一事件發生時,對容器內的所有觀察者呼叫一次該處理函式。如果在lua裡就會更...

有序鍊錶的合併的一種實現

概述 合併有序鍊錶的一種實現 在leetcode刷題的時候,碰到有序鍊錶的合併問題,第21題是兩個鍊錶的合併,第23提是k個鍊錶的合併,第23題利用第21題的解法,將兩個鍊錶合成乙個,再把合成的鍊錶作為新煉表和下乙個鍊錶合併即可。合併鍊錶有很多方法 a.將所有節點拆開,放到陣列裡進行排序,再放回鍊錶...