91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

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
台北县| 醴陵市| 临清市| 永春县| 本溪| 栾城县| 西乌珠穆沁旗| 元阳县| 惠州市| 石家庄市| 通州区| 平远县| 斗六市| 武鸣县| 本溪市| 长子县| 利辛县| 祁连县| 汝城县| 纳雍县| 林口县| 沂南县| 揭西县| 泗洪县| 婺源县| 高州市| 黄石市| 五指山市| 巴彦淖尔市| 芦山县| 剑阁县| 南部县| 绩溪县| 教育| 郯城县| 乌鲁木齐市| 鄂托克前旗| 阿坝县| 观塘区| 内黄县| 酉阳|