執行展示
鍊錶是線性表的一種實現形式,它的核心是指標,主要特點是增加與刪除不需要移動大量元素,查詢某一特定元素較慢,邏輯上相鄰的元素物理上不一定相鄰。
鍊錶主要分為單鏈表,雙向鍊錶與迴圈鍊錶。每種鍊錶又可分為帶頭結點的和不帶頭結點的。本篇主要介紹帶頭結點的雙向迴圈鍊錶的基本操作。
雙向迴圈鍊錶的每個結點需要有兩個指標,乙個指向前驅,乙個指向後繼。
//定義**示例
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 前驅指標域。雙向...