03鏈式儲存結構的線性表——連結串列
阿新 • • 發佈:2022-01-04
# 鏈式儲存結構的線性表——連結串列 ## 連結串列 **基本概念** 1. 結點包括資料域和指標域 2. 連結串列是由n個結點鏈結成 3. 頭指標——連結串列中第一個結點的儲存位置 4. 最後一個結點的指標為空 5. 頭結點——在單鏈表中的第一個結點請附設的一個結點 ![img](https://img-blog.csdnimg.cn/20200615232828431.JPG?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjI0ODg3MQ==,size_16,color_FFFFFF,t_70)![點選並拖拽以移動](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==) **相較於順序表的優點**: 1. 不用定義時規定長度 2. 儲存的元素個數不受限制 3. 插入和刪除時,不用移動其他元素 ## 單鏈表 **基本概念** 1. 連結串列的每一個結點中包含**一個**指標域 ### **單鏈表的讀取資料元素** **獲取第i個結點的資料** - 宣告一個結點指標p指向連結串列第一個結點a_1,初始化j從1開始 - 當j < i 時,遍歷連結串列,讓p的指標向後移動,不斷指向下一個結點,j累加1 - 如果當連結串列末尾p為空,則說明第i個元素不存在;否則查詢成功,返回結點p的資料 **單鏈表的插入資料元素** 在第i個結點之後插入資料元素 - 建立一個空節點,分配記憶體空間,設定元素資料 - 獲取第i個結點,設定新結點的後繼結點為該結點的後繼結點 - 設定第i個結點的後繼點為新結點 提示: 1. 插入操作最後最好有插入成功或失敗的返回值 2. 如果有頭結點,並且記錄了連結串列長度,則最後長度也要加1 3. 有頭結點的單鏈表插入操作才能統一 **單鏈表刪除資料元素** 刪除第i個結點及其資料元素 - 獲取第i個結點,如果該結點不是第一個結點,則獲取第i-1個結點 - 將第i-1個結點的字尾結點設為第i個結點的字尾結點 - 刪除第i個結點,釋放記憶體空間,記錄並返回刪除的資料元素的值 - 最後 整體-1 **刪除單鏈表整張表** 銷燬單鏈表,釋放記憶體空間 - 宣告結點p和q - 將第一個結點賦值給p - 迴圈將下一個結點賦值給q,釋放p,將q賦值給p
void clearList(LinkList L){
LinkList p,q;
p = (L)->next;//p為第一個結點
while(p){
q = p->next;
free(p);
p = q;
}
(*L)->next = NULL;
}
**單鏈表VS順序表** ![img](https://img-blog.csdnimg.cn/20200615232852315.JPG?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjI0ODg3MQ==,size_16,color_FFFFFF,t_70)![點選並拖拽以移動](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)