基礎資料結構之陣列與鍊錶(五)

2021-07-09 22:50:12 字數 2842 閱讀 6309

本篇主要介紹一種重要的鍊錶——「雙向鍊錶」(doubly linked lists)。

雙向鍊錶,顧名思義,它既可以從head開始正向遍歷鍊錶,也可以從tail開始反向遍歷鍊錶。雙向鍊錶的節點包含兩個指標,乙個指向下乙個節點(successor,同單鏈表),另乙個指向前乙個節點(predecessor),因此,也可以將它看作是兩個迭代方向不同的疊在一起的單鏈表。如下圖a。

以上是幾種雙向鍊錶的結構圖,包括空鍊錶的狀態。

其中,圖a是最簡單的一種雙向鍊錶,它包含兩個指標,head指向第乙個元素,tail指向最後乙個元素,完全可以看作是兩個走向不同的單鏈表的疊加。

圖b引入了sentinel節點(不是指標)。它是一種程式設計技巧,前面在介紹單鏈表的時候已經展示了sentinel節點的作用,無需特殊處理head。

圖c是乙個可雙向迴圈的迴圈鍊錶。

圖d是帶sentinel節點的迴圈鍊錶。

下面選取圖a的結構實現乙個雙向鍊錶。

#ifndef doubly_linked_list_h

#define doubly_linked_list_h

#include namespace foundationaldatastructure

; template class doublylinkedlist

t const & first() const;

t const & last() const;

void prepend(t const &);

void extract(t const &);

void purge();

void insertafter(nodeconst *, t const &);

void insertbefore(nodeconst *, t const &);

private:

node* head;

node* tail;

};//implementation/

template node::node(t const & _datum, node * _prev, node * _next)

: datum(_datum)

, prev(_prev)

, next(_next)

{}template t const & node::datum() const

template nodeconst * node::prev() const

template nodeconst * node::next() const

template doublylinkedlist::doublylinkedlist()

: head(null)

, tail(null)

{}template void doublylinkedlist::purge()

tail = null;

}template doublylinkedlist::~doublylinkedlist()

template nodeconst * doublylinkedlist::head() const

template nodeconst * doublylinkedlist::tail() const

template bool doublylinkedlist::isempty() const

template doublylinkedlist::operator bool() const

template t const & doublylinkedlist::first() const

template t const & doublylinkedlist::last() const

template void doublylinkedlist::prepend(t const & item)

template void doublylinkedlist::extract(t const & item) // pass by reference or value ?

else

delete temp;

temp = null;

continue; // break; for the first one

}ptr = ptr->next;}}

template doublylinkedlist::doublylinkedlist(doublylinkedlist const & linkedlist)

: head(null)

, tail(null)

template doublylinkedlist& doublylinkedlist::operator=(doublylinkedlist const & linkedlist)

return *this;

}template void doublylinkedlist::insertafter(nodeconst * arg, t const & item)

template void doublylinkedlist::insertbefore(nodeconst * arg, t const & item)

} // namespace foundationaldatastructure

#endif // doubly_linked_list_h

注:

1,本文的節點與鍊錶採用的是友元類的實現方式,也可以使用巢狀類的實現方式。

2,函式「operator bool() const;    // operator bool() const 」的宣告和定義格式,以及類模版字首的新增方式。

資料結構基礎之陣列和鍊錶

陣列 陣列 array 是有限個相同型別的變數所組成的有序集合。陣列中每個變數被稱為元素。陣列是最簡單 最常用的資料結構。陣列的另乙個特點,在記憶體中順序儲存。陣列中每乙個元素,都儲存在小小的記憶體單元中,並且元素之間緊密排列,既不能打亂元素的儲存順序,也不能跳過某個儲存單元進行儲存。陣列操作 增 ...

資料結構 陣列與鍊錶

陣列的特點 1.在記憶體中,陣列是一塊連續的區域 2.陣列需要預留空間,在使用前需要提前申請所佔記憶體的大小,不知道需要多大的空間,可能會浪費記憶體空間,即陣列空間利用率低 3.在陣列起始位置處,插入資料和刪除資料效率低。插入資料時,待插入位置的的元素和它後面的所有元素都需要向後搬移 刪除資料時,待...

資料結構基礎 之 迴圈鍊錶

迴圈鍊錶是一種首尾相接的鍊錶。1 單迴圈鍊錶 在單鏈表中,將終端結點的指標域null改為指向表頭結點或開始結點即可。2 多重鏈的迴圈鍊錶 將表中結點鏈在多個環上。帶頭結點的單迴圈鍊錶 非空表 空表判斷空鍊錶的條件是head head next 僅設尾指標的單迴圈鍊錶 用尾指標rear表示的單迴圈鍊錶...