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