C 語言實現雙向鍊錶

2021-10-02 12:32:42 字數 4502 閱讀 9264

這篇文章是關於利用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...