指定されたノードを削除するC言語の双方向リストの方法は何ですか?

双方向リストからノードを削除するには、次の手順を実行する必要があります。

  1. まず、リストが空かどうかを判断し、空の場合はノードを削除することができず、直ちに戻ります。
  2. リンクリストを巡回し、削除するノードを見つけます。現在のノードを指すポインターを使用し、順番に後ろに進んでいき、削除するノードを見つけるかリンクリストの末尾に到達するまで続けます。
  3. もし削除対象のノードがリストの最初のノードである場合、つまりそのノードを指すポインタがヘッドポインタである場合は、ヘッドポインタを削除対象の次のノードを指すように変更し、そのノードのメモリ領域を解放します。
  4. もし削除するノードがリストの最後のノードである場合、そのノードの前のノードのnextポインタをNULLにし、そのノードのメモリ空間を解放します。
  5. もし削除するノードがリストの中間のノードである場合、そのノードの前のノードのnextポインタを次のノードに向け、同時に次のノードのprevポインタを削除するノードの前のノードに向け、そしてそのノードのメモリ空間を解放します。
  6. リスト全体を走査しても削除すべきノードが見つからない場合、そのノードはリストに存在しないということになるので、直ちに返す。

以下はコードの実装の例です。

#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;
}

この例では、最初に3つのノードを持つ双方向リストが作成されます。次に、deleteNode関数を呼び出して値が2のノードを削除します。最後に、削除されたノードの後にリストを印刷します。

bannerAds