在C語言中,鏈表的刪除操作通常需要執行以下步驟:
首先,創建一個指針用于指向要刪除的節點,通常稱為"current"或者"temp"。
如果鏈表為空(即頭指針為NULL),則無法進行刪除操作,可以直接返回。
如果要刪除的節點是頭節點,即要刪除的節點就是鏈表的第一個節點,需要對頭指針進行更新,將其指向第二個節點(如果存在)。
如果要刪除的節點不是頭節點,需要先找到要刪除節點的前一個節點,通常稱為"prev"。
更新"prev"節點的指針,將其指向要刪除節點的下一個節點。
釋放要刪除節點的內存空間,以防止內存泄漏。
最后,將"current"或者"temp"指針置為NULL,以避免懸空指針。
以下是一個示例代碼,展示了如何在C語言中刪除鏈表節點:
#include <stdio.h>
#include <stdlib.h>
// 定義鏈表節點結構體
typedef struct Node {
int data;
struct Node* next;
} Node;
// 刪除鏈表節點
void deleteNode(Node** head, int key) {
// 創建指針用于指向要刪除的節點
Node* current = *head;
Node* prev = NULL;
// 如果鏈表為空,直接返回
if (current == NULL) {
printf("鏈表為空,無法刪除節點。\n");
return;
}
// 如果要刪除的節點是頭節點
if (current != NULL && current->data == key) {
*head = current->next;
free(current);
printf("節點 %d 被成功刪除。\n", key);
return;
}
// 在鏈表中查找要刪除節點的位置
while (current != NULL && current->data != key) {
prev = current;
current = current->next;
}
// 如果找到了要刪除的節點
if (current != NULL) {
prev->next = current->next;
free(current);
printf("節點 %d 被成功刪除。\n", key);
}
// 如果沒有找到要刪除的節點
else {
printf("找不到要刪除的節點。\n");
}
}
// 創建一個新節點
Node* createNode(int data) {
Node* newNode = (Node*)malloc(sizeof(Node));
if (newNode == NULL) {
printf("內存分配失敗。\n");
exit(1);
}
newNode->data = data;
newNode->next = NULL;
return newNode;
}
// 在鏈表末尾插入一個節點
void insert(Node** head, int data) {
Node* newNode = createNode(data);
if (*head == NULL) {
*head = newNode;
return;
}
Node* current = *head;
while (current->next != NULL) {
current = current->next;
}
current->next = newNode;
}
// 打印鏈表
void printList(Node* head) {
if (head == NULL) {
printf("鏈表為空。\n");
return;
}
Node* current = head;
printf("鏈表的元素為:");
while (current != NULL) {
printf("%d ", current->data);
current = current->next;
}
printf("\n");
}
int main() {
Node* head = NULL;
// 在鏈表末尾插入節點
insert(&head, 1);
insert(&head, 2);
insert(&head, 3);
insert(&head, 4);
insert(&head, 5);
// 打印鏈表
printf("原始鏈表:\n");
printList(head);
// 刪除鏈表節點
deleteNode(&head, 3);
deleteNode(&head, 6);
// 打印鏈表
printf("刪除節點后的鏈表:\n");
printList(head);
return 0;
}
輸出結果為:
原始鏈表:
鏈表的元素為:1 2 3 4 5
節點 3 被成功刪除。
找不到要刪除的節點。
刪除節點后的鏈表:
鏈表的元