2 12雙向鍊錶基本操作(C語言實現)

2021-09-05 13:08:07 字數 3388 閱讀 8061

本節學習有關雙向鍊錶

的一些基本操作,即如何在雙向鍊錶中新增、刪除、查詢或更改資料元素。

本節知識基於已熟練掌握雙向鍊錶建立過程的基礎上,我們繼續上節所建立的雙向鍊錶來學習本節內容,建立好的雙向鍊錶如圖 1 所示:

圖 1 雙向煉表示意圖

根據資料新增到雙向鍊錶中的位置不同,可細分為以下 3 種情況:

新增至表頭

將新資料元素新增到表頭,只需要將該元素與表頭元素建立雙層邏輯關係即可。

換句話說,假設新元素節點為 temp,表頭節點為 head,則需要做以下 2 步操作即可:

temp->next=head; head->prior=temp;

將 head 移至 temp,重新指向新的表頭;

例如,將新元素 7 新增至雙鏈表的表頭,則實現過程如圖 2 所示:

圖 2 新增元素至雙向鍊錶的表頭

新增至表的中間位置

同單鏈表新增資料類似,雙向鍊錶中間位置新增資料需要經過以下 2 個步驟,如圖 3 所示:

新節點先與其直接後繼節點建立雙層邏輯關係;

新節點的直接前驅節點與之建立雙層邏輯關係;

圖 3 雙向鍊錶中間位置新增資料元素

新增至表尾

與新增到表頭是乙個道理,實現過程如下(如圖 4 所示):

找到雙鏈表中最後乙個節點;

讓新節點與最後乙個節點進行雙層邏輯關係;

圖 4 雙向鍊錶尾部新增資料元素

line * insertline(line * head,int data,int add)else

//判斷條件為真,說明插入位置為鍊錶尾

if (body->next==null) else

}return head;

}雙鏈表刪除結點時,只需遍歷鍊錶找到要刪除的結點,然後將該節點從表中摘除即可。

例如,從圖 1 基礎上刪除元素 2 的操作過程如圖 5 所示:

圖 5 雙鏈表刪除元素操作示意圖

雙向鍊錶刪除節點的 c 語言實現**如下:

//刪除結點的函式,data為要刪除結點的資料域的值

line * delline(line * head,int data)

temp=temp->next;

}printf("鍊錶中無該資料元素");

return head;

}通常,雙向鍊錶同單鏈表一樣,都僅有乙個頭指標。因此,雙鏈表查詢指定元素的實現同單鏈表類似,都是從表頭依次遍歷表中元素。

c 語言實現**為:

//head為原雙鏈表,elem表示被查詢元素

int selectelem(line * head,int elem)

i++;

t=t->next;

}//程式執行至此處,表示查詢失敗

return -1;

}更改雙鏈表中指定結點資料域的操作是在查詢的基礎上完成的。實現過程是:通過遍歷找到儲存有該資料元素的結點,直接更改其資料域即可。

實現此操作的 c 語言實現**如下:

//更新函式,其中,add 表示更改結點在雙鏈表中的位置,newelem 為新資料的值

line *amendelem(line * p,int add,int newelem)

temp->data=newelem;

return p;

}這裡給出雙鏈表中對資料進行 "增刪查改" 操作的完整實現**:

#include 

#include

typedef struct lineline;

//雙鏈表的建立

line* initline(line * head);

//雙鏈表插入元素,add表示插入位置

line * insertline(line * head,int data,int add);

//雙鏈表刪除指定元素

line * delline(line * head,int data);

//雙鏈表中查詢指定元素

int selectelem(line * head,int elem);

//雙鏈表中更改指定位置節點中儲存的資料,add表示更改位置

line *amendelem(line * p,int add,int newelem);

//輸出雙鏈表的實現函式

void display(line * head);

int main()

line* initline(line * head)

return head;

}line * insertline(line * head,int data,int add)else

//判斷條件為真,說明插入位置為鍊錶尾

if (body->next==null) else

}return head;

}line * delline(line * head,int data)

temp=temp->next;

}printf("鍊錶中無該資料元素");

return head;

}//head為原雙鏈表,elem表示被查詢元素

int selectelem(line * head,int elem)

i++;

t=t->next;

}//程式執行至此處,表示查詢失敗

return -1;

}//更新函式,其中,add 表示更改結點在雙鏈表中的位置,newelem 為新資料的值

line *amendelem(line * p,int add,int newelem)

temp->data=newelem;

return p;

}//輸出鍊錶的功能函式

void display(line * head)else

temp=temp->next;}}

程式執行結果為:

1->2->3->4->5

1->2->7->3->4->5

1->7->3->4->5

元素 3 的位置是:3

1->7->6->4->5

1 5 雙向鍊錶

實現 public class doublelinkedlistdemo 鍊錶操作類 class doublelinkedlist 新增節點 同單向,但有點區別,加上前乙個指標 public void add heronode2 heronode2 temp.next heronode2 heron...

20 雙向鍊錶

1 define crt secure no warnings 23 include4 include5 include67 define ok 1 8 define error 0 9 define true 1 10 define false 0 1112 typedef int elemtyp...

06 雙向鍊錶

修改 原理與單鏈表相同 刪除public class doublelinkedlist 新增結點到雙向鍊錶 追加 public void add heronode2 node 按編號順序將結點到鍊錶 如果有這個排名,則新增失敗,並給出提示 public void insertbyorder hero...