這篇文章是關於利用c++模板的方式實現的雙向鍊錶以及雙向鍊錶的基本操作,在之前的博文c語言實現雙向鍊錶中,已經給大家分析了雙向鍊錶的結構,並以圖標的方式給大家解釋了雙向鍊錶的基本操作。本篇文章利用c++實現了雙向鍊錶的基本操作,其中包括:
雙向鍊錶的基本操作c++語言實現雙向鍊錶
實現的功能
頭部插入結點建立鍊錶
尾部插入結點建立鍊錶
實現指定位置插入結點
查詢給定數值是否存在
刪除指定位置的結點
修改指定位置的結點
雙向鍊錶的長度
列印雙向鍊錶
因為雙向鍊錶的結點由三部分構成,用於指向當前節點的直接前驅節點的指標域,用於儲存資料元素的資料域 ,以及用於指向當前節點的直接後繼節點的指標域。
因此,首先我們需要封裝乙個結點類,定義了結點的三個要素,並利用建構函式實現初始化,另外,考慮到在雙向鍊錶中要用到結點類,所以將雙向鍊錶類定義為結點的友元類。
class
doublelinkedlistnode
//結點的有參建構函式,初始化指標域和資料域
doublelinkedlistnode
(t _data,doublelinkedlistnode
*_prior =
null
,doublelinkedlistnode
*_next =
null)~
doublelinkedlistnode()
};
實現了雙向鍊錶頭部插入結點, 尾部插入結點,指定位置插入結點建立鍊錶, 查詢給定數值的指定位置,刪除指定位置的結點,修改指定位置的結點,雙向鍊錶的長度,列印雙向鍊錶,接下來逐一進行講解實現:
頭部插入結點建立鍊錶
帶頭結點實現的雙向鍊錶,實現頭部插入結點可分為兩種情況,一種是只有乙個頭結點的時候,只需要使head和newnode的兩個指標關聯上即可,另外的兩個指標依舊是null狀態。另一種情況便是有結點的情況,這個時候跟在中間結點插入相似,需要調整四個指標,首先是讓newnode與後繼結點關聯,最後讓newnode與head結點關聯。
因此,頭部插入結點實現如下:
template
<
class
t>
bool doublelinkedlist
::insertnodebyhead
(t item)
//分兩種情況,head的next是否為null,然後處理四個指標
if(head-
>next ==
null
)else
}
尾部插入結點建立鍊錶
在尾部插入結點,當然第一步需要找到最後乙個結點,然後在其後進行插入,雙向鍊錶因為兩端的指標都是指向null的,所以在尾部插入也只需要調整兩個指標就ok.
template
<
class
t>
bool doublelinkedlist
::insertnodebytail
(t item)
//首先找到最後乙個結點
doublelinkedlistnode
* lastnode = head;
while
(lastnode-
>next !=
null
)//找到調整指標
lastnode-
>next = newnode;
newnode-
>prior = lastnode;
return
true
;}
實現指定位置插入結點
在指定位置插入只需要兩步走,首先也是找到指定的位置,然後就是插入新結點的指標的調整,中間插入是最複雜的,都逃不過調整四個指標,但是首先依舊是讓新結點和後繼結點建立上相關性,最後讓新結點與前繼結點建立關係,實現新結點的插入。
bool doublelinkedlist
::insertnode
(t item,
int n)
doublelinkedlistnode
* pmove = head;
//建立乙個新的指標,設定為游標指標
//首先找到插入位置
for(
int i=
1;i//建立乙個新的結點
doublelinkedlistnode
* newnode =
new doublelinkedlistnode
(item);if
(newnode ==
null
)//插入新的結點
newnode-
>next = pmove-
>next;
if(pmove-
>next !=
null
) newnode-
>prior = pmove;
pmove-
>next = newnode;
return
true
;}
查詢給定數值是否存在
查詢給定元素,也就是乙個遍歷鍊錶的過程,從頭結點的下乙個結點開始遍歷,畢竟第乙個頭結點是沒有儲存資料項的。
template
<
class
t>
bool doublelinkedlist
::finddata
(t item)
while
(pmove)
//遍歷鍊錶
pmove = pmove-
>next;
}return
false
;}
刪除指定位置的結點
刪除指定的結點,第一步查詢到刪除的結點,需要定義乙個刪除指標臨時指向將要刪除的結點,最後指標處理刪除之後別忘了釋放該結點空間。
template
<
class
t>
bool doublelinkedlist
::deletedata
(int n)
doublelinkedlistnode
* pmove = head;
//設定游標指標
doublelinkedlistnode
* pdelete;
//查詢刪除結點的位置
for(
int i =
1; i <= n; i++
)//刪除結點
pdelete = pmove;
pmove-
>prior-
>next = pdelete-
>next;
pmove-
>next-
>prior = pdelete-
>prior;
delete pdelete;
//釋放空間
return
true
;}
修改指定位置的結點
修改指定位置的結點資料,當然還是得找到指定位置,然後對其進行修改,修改之後將原來的資料以引用的形式返回,具體的用法在測試函式中寫到了的,不會的可以作為參考。
template
<
class
t>
bool doublelinkedlist
::changelistelements
(int n,t item,t &x)
doublelinkedlistnode
*pmove = head-
>next;
//設定游標指標
for(
int i=
1;i)//找到指定位置1
x = pmove-
>data;
pmove-
>data = item;
return
true
;}
雙向鍊錶的長度
計算雙向鍊錶的長度的函式,在雙向鍊錶的私有成員封裝了乙個變數length,以此來記錄雙向鍊錶的長度,遍歷雙向鍊錶,逐一進行計算結點數就是雙向鍊錶的長度。
template
<
class
t>
int doublelinkedlist
::getlength()
return length;
}
列印雙向鍊錶
列印雙向鍊錶,從第二個結點開始遍歷鍊錶,因為第乙個為頭結點是不含資料的,列印的過程也就是乙個遍歷的過程。
template
<
class
t>
void doublelinkedlist
::printlinkedlist()
cout<}
雙向鍊錶C語言實現
ifndef stdlist h define stdlist h typedef struct tagstdnode stdnode,lpstdnode typedef struct tagstdlist stdlist,lpstdlist 鍊錶資料結構 struct tagstdnode 鍊錶節...
c語言實現雙向鍊錶
單向鍊錶有一定的缺陷,其中乙個就是只能一條路走到黑,只能前進不能後退,但雙向鍊錶就解決了這一問題 include include typedef struct node node,linklist void create list tail linklist l 頭插法建立 void create ...
C語言實現雙向鍊錶
1.定義兩個結構體,乙個表示鍊錶的乙個單元,另乙個表示鍊錶的頭結點 2.鍊錶的初始化 必須讓頭結點的next和prev指向自己 清除 不刪除頭結點 銷毀 刪除頭結點 3.增操作 每次增加需要開闢乙個單元,所以直接建立乙個函式用來建立單元 頭插 尾插 pos結點之前插 4.刪操作 分為三種 刪除pos...