溫馨提示×

c語言雙向鏈表怎么刪除指定節(jié)點

小億
156
2023-12-27 14:20:49
欄目: 編程語言

要刪除雙向鏈表中的某個節(jié)點,需要執(zhí)行以下步驟:

  1. 首先判斷鏈表是否為空,如果為空則無法刪除節(jié)點,直接返回。
  2. 遍歷鏈表,找到要刪除的節(jié)點??梢允褂靡粋€指針指向當前節(jié)點,依次向后遍歷,直到找到要刪除的節(jié)點或者到達鏈表末尾。
  3. 如果找到了要刪除的節(jié)點,分為以下幾種情況處理:
    • 如果要刪除的節(jié)點是鏈表的第一個節(jié)點,即指向該節(jié)點的指針為頭指針,則將頭指針指向該節(jié)點的下一個節(jié)點,并釋放該節(jié)點的內(nèi)存空間。
    • 如果要刪除的節(jié)點是鏈表的最后一個節(jié)點,則將該節(jié)點的前一個節(jié)點的next指針置為NULL,并釋放該節(jié)點的內(nèi)存空間。
    • 如果要刪除的節(jié)點是鏈表中的一個中間節(jié)點,則將該節(jié)點的前一個節(jié)點的next指針指向該節(jié)點的下一個節(jié)點,同時將下一個節(jié)點的prev指針指向該節(jié)點的前一個節(jié)點,并釋放該節(jié)點的內(nèi)存空間。
  4. 如果遍歷整個鏈表都沒有找到要刪除的節(jié)點,則說明該節(jié)點不存在于鏈表中,直接返回。

以下是一個示例代碼實現(xiàn):

#include <stdio.h>
#include <stdlib.h>

// 雙向鏈表節(jié)點結(jié)構(gòu)體
typedef struct Node {
    int data;
    struct Node *prev;  // 指向前一個節(jié)點的指針
    struct Node *next;  // 指向后一個節(jié)點的指針
} Node;

// 刪除節(jié)點函數(shù)
void deleteNode(Node **head, int value) {
    if (*head == NULL) {
        printf("鏈表為空,無法刪除節(jié)點\n");
        return;
    }

    Node *current = *head;
    while (current != NULL) {
        if (current->data == value) {
            if (current == *head) {
                // 要刪除的節(jié)點是頭節(jié)點
                *head = current->next;
                if (*head != NULL) {
                    (*head)->prev = NULL;
                }
                free(current);
            } else if (current->next == NULL) {
                // 要刪除的節(jié)點是尾節(jié)點
                current->prev->next = NULL;
                free(current);
            } else {
                // 要刪除的節(jié)點是中間節(jié)點
                current->prev->next = current->next;
                current->next->prev = current->prev;
                free(current);
            }
            printf("成功刪除節(jié)點\n");
            return;
        }
        current = current->next;
    }

    printf("未找到要刪除的節(jié)點\n");
}

// 打印鏈表函數(shù)
void printList(Node *head) {
    Node *current = head;
    while (current != NULL) {
        printf("%d ", current->data);
        current = current->next;
    }
    printf("\n");
}

int main() {
    Node *head = NULL;  // 鏈表頭指針

    // 創(chuàng)建鏈表
    Node *node1 = (Node *)malloc(sizeof(Node));
    node1->data = 1;
    node1->prev = NULL;
    node1->next = NULL;
    head = node1;

    Node *node2 = (Node *)malloc(sizeof(Node));
    node2->data = 2;
    node2->prev = node1;
    node2->next = NULL;
    node1->next = node2;

    Node *node3 = (Node *)malloc(sizeof(Node));
    node3->data = 3;
    node3->prev = node2;
    node3->next = NULL;
    node2->next = node3;

    // 打印原始鏈表
    printf("原始鏈表:");
    printList(head);

    // 刪除節(jié)點
    deleteNode(&head, 2);

    // 打印刪除節(jié)點后的鏈表
    printf("刪除節(jié)點后的鏈表:");
    printList(head);

    return 0;
}

此示例中,首先創(chuàng)建了一個包含三個節(jié)點的雙向鏈表。然后調(diào)用deleteNode函數(shù)刪除值為2的節(jié)點。最后打印刪除節(jié)點后的鏈表。

0