1. 程式人生 > 其它 >03鏈式儲存結構的線性表——連結串列

03鏈式儲存結構的線性表——連結串列

#  鏈式儲存結構的線性表——連結串列

## 連結串列

**基本概念**

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==)