01. 單鏈表簡介
在數據結構中,單鏈表的實現可以分為 帶頭結點 和 不帶頭結點 兩種方式,這里我們討論第二種方式。
- 頭結點:鏈表第一個節點不存實際數據,僅作為輔助節點指向首元節點(第一個數據節點)。
- 頭指針:永遠指向頭結點(非空鏈表頭結點始終存在)。
單鏈表核心數據結構及操作聲明:
typedef struct Node {int data; // 節點數據域struct Node* next;// 節點指針域
} Node;
// 初始化帶頭結點的空鏈表
Node* InitList();
// 頭插法建立鏈表
void HeadInsert(Node* list, int data);
// 尾插法建立鏈表
void TailInsert(Node* list, int data);
// 刪除指定數據節點
void Delete(Node* list, int data);
// 遍歷打印鏈表
void PrintList(Node* list);
//創建單鏈表
Node* list = InitList();
HeadInsert(list,1);//如頭插
TailInsert(list,2);//如尾插
02.鏈表初始化
創建一個頭結點,內部的data
標明有多少個節點的計數,頭結點的指針域置為空。
Node* InitList() {Node* list = (Node*)malloc(sizeof(Node));list->data = 0;list->next = NULL;return list;
}
03.頭插法與尾插法
頭插法簡單,只需要在頭結點后面插入即可,尾插法較為復雜,需要保存頭結點指針,當list->next
的節點不為空的時候,會繼續往下面執行while
循環,跳出循環的時候標明已經指向最后一個結點,隨后即可插入。
void headInsert(Node* list, int data) {Node* node = (Node*)malloc(sizeof(Node));node->data = data;node->next = list->next;list->next = node;list->data++;
}
void tailInsert(Node* list, int data) {Node* head = list;//此處會改變頭結點,所以臨時保存一下Node* node = (Node*)malloc(sizeof(Node));node->data = data;node -> next = NULL;list = list->next;//將指針移動到頭結點,頭結點也移動了!!!while (list->next) {//當list的下一個節點不為空的時候,會繼續往下面執行list = list->next;//list繼續往下面執行}list->next = node;head->data++;
}
04.鏈表的刪除
鏈表的刪除需要pre
和current
兩個指針配合,通過比對其中的data
里面的數據進行判斷,不符合時,兩個指針都向后移,知道匹配到對應數據時停下刪除該結點。
void Delete(Node* list, int data) {Node* pre = list;Node* current = list->next;while (current){if (current->data = data) {pre->next = current->next;free(current);break;/無重復退出}pre = current;current = current->next;}list->data--;
}
05.鏈表的輸出
依次循環輸出即可。
void printlist(Node* list) {list = list->next;//指向頭結點while (list){//list不為空就繼續執行printf("%d ", list->data);list = list->next;//list往下走}printf("\n");
}
圖片后續有時間會補上!!
;
list = list->next;//list往下走
}
printf(“\n”);
}
---### 圖片后續有時間會補上!!