亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

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
涞水县| 永善县| 都匀市| 准格尔旗| 枞阳县| 云安县| 新余市| 海晏县| 霍邱县| 留坝县| 宝山区| 江永县| 金阳县| 丘北县| 灵寿县| 林芝县| 方山县| 永川市| 岳普湖县| 武隆县| 万载县| 漯河市| 新野县| 司法| 界首市| 万宁市| 佛坪县| 枣阳市| 开封县| 繁峙县| 澄迈县| 富源县| 嘉禾县| 马山县| 河曲县| 梧州市| 剑川县| 威海市| 广南县| 建始县| 罗山县|