在stl中list的底層的資料結構是鍊錶,但是在很多c++開源專案中並沒有使用stl中的list。原因是因為list中的node不是內嵌到資料結構當中的,這樣就和鍊錶的作用相違背。
鍊錶的最大作用是他是乙個區域性化的結構,乙個結構體只需要持有鍊錶中的其中乙個節點,就可以對這個節點本身進行插入,刪除等操作,新增的結構體也同樣只持有新增的節點,便可以進行鍊錶的操作,而不需要持有整個鍊錶。
然而std::list無法實現這個功能。這也是因為需要遵循stl中iterator的慣例,迭代器與資料是解耦的,但鍊錶的list和資料是繫結的,所以與iterator的設計相違背,所以迭代器會遇到失效的問題,無法內嵌結構體中。
下面貼乙個最近看的predixy中list鍊錶的實現,通過繼承來內嵌鍊錶,我覺得實現的很優雅,也使用了c++中的很多特性,當然也可以去看linux核心中list的實現,原理都是類似的。
//listnode為乙個鍊錶節點,每個結構體持有乙個
//每個結構體繼承listnode,t為結構體本身,p為結構體指標(可以指定智慧型指標),size為節點next指標陣列長度
template
<
classt,
class
p= t*
,int size =
1>
class
listnode}~
listnode()
}void
reset
(int idx =0)
void
concat
(t* obj,
int idx =0)
p next
(int idx =0)
const
private
: p mnext[size];}
;//list為鍊錶整體的結構,可以執行插入隊首隊尾等操作
template
<
classn,
int idx =
0>
class
list
~list()
} p next
(t* obj)
void
push_back
(t* obj)
else
++msize;
}void
push_front
(t* obj)
else
++msize;
} p pop_front()
n->
reset
(idx);}
return obj;
} p front()
const
p back()
const
intsize()
const
bool
empty()
const
private
:static node*
node
(t* obj)
private
:int msize;
p mhead;
p mtail;
};
c 鍊錶的實現
author jacky ma date 23th,may,07 主要實現 1 鍊錶的建立,2 逆置 3 排序 4 有序鍊錶的歸併 5 兩鍊錶連線 6 迴圈鍊錶的判定 include include using namespace std 鍊錶節點結構 struct linknode 建立單鏈表 l...
鍊錶的C 實現
陣列中插入乙個元素或者刪除乙個元素時,必須移動陣列中的元素,從而使動態列表的順序儲存低效。鍊錶可以解決這一問題,它由資料和乙個指向下乙個節點的指標組成。基本的操作有構造 判空 插入 刪除和遍歷。程式如下 include using namespace std template class list ...
c的鍊錶實現
複習了單向鍊錶 雙向鍊錶,中注釋不多,但基本從函式名字就可以知道函式的作用。雙向鍊錶中的前後節點中的思路是按照linux核心中思路寫的。gcc 7.4.0 include include typedef struct node lnode,llist,node void insert llist l...