中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

c語言雙向鏈表怎么刪除指定節點

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

要刪除雙向鏈表中的某個節點,需要執行以下步驟:

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

以下是一個示例代碼實現:

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

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

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

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

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

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

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

    // 創建鏈表
    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);

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

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

    return 0;
}

此示例中,首先創建了一個包含三個節點的雙向鏈表。然后調用deleteNode函數刪除值為2的節點。最后打印刪除節點后的鏈表。

0
资中县| 侯马市| 清河县| 淮滨县| 封开县| 吉水县| 新竹县| 孝感市| 乌海市| 聂荣县| 牡丹江市| 桃园市| 磐安县| 汉阴县| 固镇县| 洪湖市| 裕民县| 磴口县| 阿拉善盟| 什邡市| 雷波县| 荥经县| 泾川县| 汉中市| 山东| 河东区| 民勤县| 镇原县| 田林县| 六盘水市| 嘉黎县| 兴山县| 庆安县| 南宫市| 南华县| 章丘市| 长海县| 镇远县| 梨树县| 策勒县| 天台县|