上文已經介紹了鍊錶中的單鏈表,這裡我們再敘述一下雙向鍊錶
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...