本節學習有關雙向鍊錶
的一些基本操作,即如何在雙向鍊錶中新增、刪除、查詢或更改資料元素。
本節知識基於已熟練掌握雙向鍊錶建立過程的基礎上,我們繼續上節所建立的雙向鍊錶來學習本節內容,建立好的雙向鍊錶如圖 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...