[问题] 双向链结串行

楼主: 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