C 鍊錶的高階實現

2021-10-19 05:15:19 字數 1581 閱讀 8529

在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...