資料結構C 描述 帶頭結點的雙向迴圈鍊錶

2021-10-25 04:35:55 字數 1959 閱讀 8498

執行展示

鍊錶是線性表的一種實現形式,它的核心是指標,主要特點是增加與刪除不需要移動大量元素,查詢某一特定元素較慢,邏輯上相鄰的元素物理上不一定相鄰。

鍊錶主要分為單鏈表,雙向鍊錶與迴圈鍊錶。每種鍊錶又可分為帶頭結點的和不帶頭結點的。本篇主要介紹帶頭結點的雙向迴圈鍊錶的基本操作。

雙向迴圈鍊錶的每個結點需要有兩個指標,乙個指向前驅,乙個指向後繼。

//定義**示例

class

node

};

建立雙向迴圈鍊錶時需要注意保證每個結點的兩個指標都被賦值,且首元素的前驅指標指向尾元素,尾元素的後繼指標指向首元素。

//建立**示例

void

fill

(node *

&a)}

插入操作時需要首先判斷鍊錶是否為空,插入位置是否超出鍊錶,同時需要注意指標操作的順序,要「先連線再剪線」。

//插入**示例

bool

insert

(node* a)

if(place > length)

return

false

;//判斷是否超出長度

node* p;

p =new node;

p->data =0;

//插入值為0

for(

int i =

0; i < place -

1; i++

) a = a-

>next;

//找到插入位置

p->next = a-

>next;

p->prior = a;

a->next-

>prior = p;

a->next = p;

return

true

;}

刪除操作與插入操作類似,但是最後需要delete掉對應結點以釋放記憶體。

//刪除**示例

bool

delete

(node* a)

if(place > length)

return

false

;//判斷是否超出長度

for(

int i =

0; i < place; i++

) a = a-

>next;

a->next-

>prior = a-

>prior;

//指標操作

a->prior-

>next = a-

>next;

delete a;

//釋放記憶體

return

true

;}

轉置操作定義兩個指標,乙個指向頭,乙個指向尾,兩指標同時向中間移動並交換資料,兩指標「相遇」時停止移動,此處需注意「相遇」的判斷。

//轉置**示例

bool

inverse

(node*

& a)

return

true

;}

輸出函式需注意中止條件的判斷,避免重複迴圈輸出。

//輸出**示例

bool

output

(node* list)

cout <<

"\n"

;}

依次實現建立,插入,刪除,轉置操作,並在每次操作完成後輸出鍊錶。最後釋放記憶體。

資料結構 帶頭結點的雙向鍊錶操作 C實現

typedef struct dulnode dulnode,dulinklist 鍊錶初始化 void initdulinklist dulinklist plist plist prior plist next null 為了實現以下插入,刪除等一系列操作,先封裝以下功能 int getleng...

資料結構 雙向迴圈帶頭結點鍊錶

前面我們寫過了不帶頭結點的單鏈表,由於沒有頭結點,在對單鏈表進行頭插 刪的時候需要傳入二級指標 在需要進行尾插 刪的時候,需要先根據頭指標找到頭結點,然後從頭往後遍歷找到最後乙個結點再進行相應操作。而我們今天要寫的雙向迴圈帶頭結點鍊錶,相對於不帶頭結點的單鏈表做增刪時,將會方便許多。typedef ...

複習之資料結構 帶頭結點的雙向鍊錶

我們會發現,單鏈表由於只有next域,所以,如果想要訪問某個元素的前驅結點,那麼只能從頭開始遍歷到該元素的前乙個元素。效率非常的低下。於是,為了方便的訪問前驅 後繼,雙向鍊錶應運而生。如上圖所示,就是乙個簡單的雙向煉表示意圖。雙向鍊錶共含有三個元素 1 存放資料 2 後繼指標域 3 前驅指標域。雙向...