[問題] 雙向鏈結串列

作者: wei115 (ㄎㄎ)   2018-04-02 00:11:50
編譯器(Ex: GCC, clang, VC++...)+目標環境(跟開發平台不同的話需列出)
GCC
額外使用到的函數庫(Library Used): (Ex: OpenGL, ...)

問題(Question):
在linux中,他的雙向鏈結串列因為要可以儲存不同的資料型態,所以他的鏈結串列和資
料是分開來的,要使用時在將資料加到鏈結串列上
 
例如這樣
struct list_head {
struct list_head *next, *prev;
};
 
要使用時再這樣
struct num {
int number; //data
struct list_head list;
};
 
但是這樣要如何實作?
像是如果我想要新增一個節點
 
但list的資料型態是list_head,意思是我只能新增一個list_head的節點,而這個結點無
法儲存資料
 
如果我新增一個num型態的節點,但是我的list並不能指向一個num型態的節點
而我新增了一個num型態的節點,我用list_head的指標去指向這個num型態的節點,我原
本預期應該是錯誤的(可能直接編譯錯誤或是在執行階段當掉),但居然成功運作了
但我完全不知道為何會這樣
餵入的資料(Input):

程式碼(Code):(請善用置底文網頁, 記得排版,禁止使用圖檔)
https://ideone.com/dQZkIq
作者: LPH66 (-6.2598534e+18f)   2018-04-02 00:31:00
你是在看侵入式鍊結串列 (intrusive linked list) 嗎?
作者: wei115 (ㄎㄎ)   2018-04-02 00:33:00
沒有欸,我是看jserv的影片才知道這東西的
作者: stupid0319 (徵女友)   2018-04-02 00:43:00
list指向num結構,num結構中有list資訊
作者: Bencrie   2018-04-02 01:03:00
就噴警告而已吧。說你 assign 不相容型別的指標
作者: wei115 (ㄎㄎ)   2018-04-02 01:05:00
我知道不相容,但是為什麼不相容卻可以讀出正確的資料?
作者: ss1h2a3tw (微微甜)   2018-04-02 02:55:00
因為指到struct的指標在存取member的時候是用指標內容+member offset, 所以你用什麼型態的指標它就會用那個定義內的member的offset存取,還有list_head不是這樣用的
作者: stupid0319 (徵女友)   2018-04-02 12:36:00
有些有做好的link list Api可以直接套用就像是原PO的num結構使用上差不多del ins等等方法直接就有function可以套用
作者: wei115 (ㄎㄎ)   2018-04-02 12:41:00
不能這樣說拉,這樣要怎麼學習拉XD
作者: cphe (魔鬼藏在垃圾筒裡)   2018-04-02 13:11:00
在你指向下一個node時已經有隱含做casting了,而且在malloc時你要的memory夠大,所以能讀到你要的element另外如上面所說,linux kernel的確有很多神奇的用法…
作者: MOONRAKER (㊣牛鶴鰻毛人)   2018-04-02 14:53:00
學習不一定要從做開始 也可以從用開始
作者: tjjh89017 (伊達政宗)   2018-04-02 16:15:00
去網路上找中央資工許富皓老師的Linux kernel課程有錄影可以看,之前jserv也有要學生看許老師影片寫筆記
作者: wei115 (ㄎㄎ)   2018-04-02 16:33:00
好的,謝謝你
作者: Ryspon (Ry)   2018-04-03 04:44:00
Google list.h 會有許多不錯的資料~
作者: LPH66 (-6.2598534e+18f)   2018-04-03 06:46:00
其實我原本是想先推我這篇講 container_of 的→#1N99YX7u不過因為看起來你這裡有上面提到的指標轉型問題所以才暫緩才會改來問說你是不是在看 ilist 的 C 實作因為這種用法加上 container_of 確實可以拿來實作 ilist

Links booklink

Contact Us: admin [ a t ] ucptt.com