旭說資料結構之鍊錶補充(雙向鍊錶)

2021-07-07 04:10:25 字數 4128 閱讀 3787

上文已經介紹了鍊錶中的單鏈表,這裡我們再敘述一下雙向鍊錶

1.雙向鍊錶

對比單鏈表,雙向鍊錶能夠直接找到節點的前驅,也就能從任意乙個節點到達鍊錶的頭結點和尾節點。如下圖所示:

下面我們還是從使用的角度出發來定義雙向鍊錶的介面。我想使用乙個雙向鍊錶,那我就new乙個來用。然後我就往裡插入元素。之後我又想在某個索引處插入乙個元素。於是我就可以寫出下面的**:

twodirectionslinklist

* twodirectionslinklist =

new twodirectionslinklist();//new乙個雙鏈表物件來用

twodirectionslinklist->insertelementtoend(1);//在尾端插入

twodirectionslinklist->insertelementtoend(3);

twodirectionslinklist->insertelementtoend(4);

twodirectionslinklist->insertelementtoend(5);//此時鍊錶中為1345

twodirectionslinklist->printallelement();

twodirectionslinklist->insertelementtoindex(2,2);//在索引2處插入,此時鍊錶中為12345

twodirectionslinklist->printallelement();

twodirectionslinklist->deleteelementatindex(3);//刪除索引3處的節點,此時鍊錶中為1245

twodirectionslinklist->printallelement();

接下來就是來實現這些介面裡的具體內容。

我們要使用雙向鍊錶,就要定義乙個雙向鍊錶的類,姑且叫做twodirectionslinklist,為了擴充套件性我們使用模板。類twodirectionslinklist中應該有成員變數

twodirectionslinknode* _head;

int _length;

其中twodirectionslinknode* _head;為頭結點,int _length;記錄鍊錶的長度。節點類twodirectionslinknode我們也需要定義,節點類中應該有三個成員變數:

datatype _data;//儲存資料

twodirectionslinknode* _next;//指向後繼節點

twodirectionslinknode* _prior;//指向前驅節點

new乙個雙向鍊錶時,呼叫twodirectionslinklist的建構函式,這樣就有了頭節點了,我們就可以在頭節點的基礎上進行操作了。

twodirectionslinklist()

插入新節點的操作,如下圖所示,首先我們把指標p移動到要插入索引的前乙個索引處,然後讓新節點的_next指標指向p的_next(也就是索引處的節點),然後讓p的_next指向新節點,然後讓新節點的_prior指向p,再讓索引處節點的_prior指向新節點。

bool insertelementtoindex(int index,datatype data)//插入到鍊錶的指定位置處

else

}//長度不為0的情況下,只能在1~_length範圍內插入

if (index <=

0|| index > _length)return

false;

twodirectionslinknode* p = _head;

//把指標p指向指定索引前的那個節點

for (int i =

0;i1 ;i++)

twodirectionslinknode* newnode =

new twodirectionslinknode(data);

if (newnode ==

null)return

false;

newnode->_next = p->_next;

p->_next = newnode;

newnode->_prior = p;

newnode->_next->_prior = newnode;

_length++;

return

true;

}

這樣我們就解決雙向鍊錶的插入與刪除問題,下面是雙向鍊錶的.h檔案,

templateclass twodirectionslinklist;

templateclass twodirectionslinknode

private:

datatype _data;//儲存資料

twodirectionslinknode* _next;//指向後繼節點

twodirectionslinknode* _prior;//指向前驅節點

friend class twodirectionslinklist;

};templateclass twodirectionslinklist

//雙向鍊錶的操作

bool insertelementtoend(datatype data)//插入到鍊錶的尾部,如果成功,返回true

//在尾部插入新節點

twodirectionslinknode* newnode =

new twodirectionslinknode(data);

p->_next = newnode;

newnode->_prior = p;

_length++;

return

true;

}bool insertelementtoindex(int index,datatype data)//插入到鍊錶的指定位置處

else

}//長度不為0的情況下,只能在1~_length範圍內插入

if (index <=

0|| index > _length)return

false;

twodirectionslinknode* p = _head;

//把指標p指向指定索引前的那個節點

for (int i =

0;i1 ;i++)

twodirectionslinknode* newnode =

new twodirectionslinknode(data);

if (newnode ==

null)return

false;

newnode->_next = p->_next;

p->_next = newnode;

newnode->_prior = p;

newnode->_next->_prior = newnode;

_length++;

return

true;

}bool deleteelementatindex(int index)//刪除指定位置的元素,如果成功,返回true

twodirectionslinknode* temp = p->_next;

p->_next = p->_next->_next;

p->_next->_prior = p;

delete temp;

return

true;

}int getlength()//獲取鍊錶的長度

void printallelement()//列印表中的元素

}private:

twodirectionslinknode* _head;

int _length;

};

資料結構 鍊錶 雙向鍊錶

注意typedef的定義結構,以及dinklist的資料型別 typedef struct dnode dnode,dinklist 注意插入第乙個結點時,prior指標的空指向問題 if l next null 若l後繼結點為空 則省略該步驟 l next prior p 基本 頭插法建立雙向鍊錶...

資料結構之雙向鍊錶

簡述 指標域有乙個指標 而言,占用資源更大,但相應的 雙向鍊錶遍歷的時候只需要乙個指標就可以,而且 只有得到其中任何乙個節點就是得到整個鍊錶,單向鍊錶必須得到他的頭節點,才能遍歷整個鍊錶,而且得有兩個指標。實現 bothwaylinklist.h ifndef mymodule h define m...

資料結構之 雙向鍊錶

單鏈表的結點都只有乙個指向下乙個結點的指標。單鏈表的資料元素無法直接訪問其前驅元素。建立鍊錶 銷毀鍊錶 獲取鍊錶長度 清空鍊錶 獲取第pos個元素操作 插入元素到位置pos 刪除位置pos處的元素 dlinklist dlinklist creat 建立乙個鍊錶 void dlinklist des...