雙向迴圈鍊錶的c 實現

2021-05-23 06:23:34 字數 2039 閱讀 5922

雙向迴圈鍊錶,即每個節點都擁有一前一後兩個指標且頭尾互鏈的鍊錶。各種鍊錶的簡單區別如下:

單向鍊錶:基本鍊錶;

單向迴圈鍊錶:不同於單向鍊錶以 null 判斷鍊錶的尾部,單向迴圈鍊錶的尾部鏈結到表頭,因此當迭代操作到表頭前即是尾部;

雙向鍊錶:比單向鍊錶多出指向前乙個節點的指標,但實際上使用雙向鍊錶時很少使用不迴圈的;

雙向迴圈鍊錶:相對於單向迴圈鍊錶,雙向迴圈鍊錶可從頭部反向迭代,這在鍊錶長度很大且需要獲取、插入或刪除靠近鍊錶尾部元素的時候十分高效。單向迴圈列表只能從表頭正向迭代,執行的時間大於從反向迭代。

node.h /*

* 節點型別。三個成員分別是:指向前乙個節點的指標,元素本身,指向後乙個節點的指標。

*/class node };

linkedlist.h:

#include

"node.h「

struct linkedlist ;

linkedlist.cpp:

#include

"linkedlist.h"

#include

using std::cout; /*

* 構造方法。

* 生成乙個空的節點介於表頭和表尾之間,初始前後指標都指向自己。

*/ linkedlist::linkedlist()

/** 在鍊錶頭部新增乙個元素。

* 生成乙個新的節點,向前指向空節點,向後指向原來空節點的下乙個節點,即原來的第乙個節點。

* 空節點向後指向此節點,原來的第乙個節點向前指向此節點。

*/void linkedlist::addfirst(int i)

/ ** 在鍊錶最後新增乙個元素。

* 生成乙個新的節點,向前指向原來空節點的前乙個節點,即原來的最後乙個節點,向後指向空節點。

* 原來的最後乙個節點向後指向此節點,空節點向前指向此節點。

*/void linkedlist::addlast(int i)

/** 在指定的索引前插入乙個元素。0 <= 索引 <= 鍊錶長度。

* 如果索引值小於鍊錶長度的一半,向後(正向)迭代獲取索引值位置的節點,反之則向前(反向)。

* 生成乙個新的節點,向前指向原來這個位置的節點的前乙個節點,向後指向原來這個位置的節點。

* 原來這個位置的節點的前乙個節點向後指向此節點,原來這個位置的節點向前指向此節點。

* (在指定的索引刪除乙個元素實現方法類似)

*/void linkedlist::add(int index, int i)

node *entry;

if (index < size / 2)

else

entry->previous->next = new node(i, entry, entry->previous);

entry->previous = entry->previous->next;

++size;}

/** 獲取鍊錶第乙個元素。

* 空節點向後指向的節點即是第乙個元素。

*/int linkedlist::getfirst()

/** 獲取鍊錶最後乙個元素。

* 空節點向前指向的節點即是最後乙個元素。

*/int linkedlist::getlast()

/** 刪除並返回鍊錶第乙個元素。

* 鍊錶第二個節點向前指向空節點,空節點向後指向第二個節點。

*/int linkedlist::removefirst()

/** 刪除並返回鍊錶最後乙個元素。

* 鍊錶倒數第二個節點向後指向空節點,空節點向前指向倒數第二個節點。

*/int linkedlist::removelast()

/** 用來輸出所有元素的迭代方法。

*/void linkedlist::iterate()

for (node *entry = header->next; entry != header; entry = entry->next)

cout << entry->element << " " ;

cout << '/n' ;}

C 實現雙向迴圈鍊錶

雙向迴圈鍊錶 除錯正常,所有功能均測試 節點類 template class listnode listnode type d,listnode n nullptr,listnode p nullptr data d next n prev p void setdata type d 雙向迴圈鍊錶 ...

C實現迴圈鍊錶及雙向鍊錶

在雙向鍊錶中,結點除含有資料域外,還有兩個鏈域,乙個儲存直接後繼結點位址,一般稱之為右鏈域 乙個儲存直接前驅結點位址,一般稱之為左鏈域。鍊錶的c語言實現之迴圈鍊錶及雙向鍊錶 一 迴圈鍊錶 迴圈鍊錶是與單鏈表一樣,是一種鏈式的儲存結構,所不同的是,迴圈鍊錶的最後乙個結點的指標是指向該迴圈鍊錶的第乙個結...

雙向迴圈鍊錶的實現

其實雙向迴圈鍊錶與單鏈表的區別在於每個節點的結構發生了改變,具體的說是,每個節點多了乙個指標域,用於指向上乙個節點。其他的如鍊錶物件就不需要進行改變了。新的節點類 class lnode def init self,elem 0,prev none,next none self.prev prev ...