📜  如何在 C 编程语言中制作链表的副本(1)

📅  最后修改于: 2023-12-03 14:52:14.436000             🧑  作者: Mango

在 C 编程语言中制作链表的副本

在 C 编程语言中,链表是一种常用的数据结构。它由一个节点序列组成,每个节点指向下一个节点。制作链表的副本意味着创建一个具有相同节点值的新链表。本文将介绍如何在 C 中制作链表的副本。

算法思路

制作链表的副本需要遍历原链表,并为每个节点创建一个新的副本节点。对于每个节点,我们需要复制其值,并将其连接到新链表的最后。这可以通过使用 malloc 动态分配新节点的方式来实现。

实现代码

以下是在 C 编程语言中制作链表副本的代码示例。首先,我们定义链表节点的结构体,并实现一个函数来创建新的节点:

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

// 定义链表节点结构体
typedef struct Node {
    int data;
    struct Node* next;
} Node;

// 创建新节点
Node* createNode(int data) {
    Node* newNode = (Node*)malloc(sizeof(Node));
    newNode->data = data;
    newNode->next = NULL;
    return newNode;
}

接下来,我们实现一个函数,该函数将遍历原链表,并复制每个节点创建新节点添加到副本链表的末尾:

// 制作链表的副本
Node* copyLinkedList(Node* head) {
    Node* current = head;  // 当前节点

    // 如果原链表为空,直接返回空链表
    if (current == NULL) {
        return NULL;
    }

    Node* newHead = createNode(current->data);  // 复制头节点
    Node* newCurrent = newHead;  // 副本链表的当前节点

    // 遍历原链表,复制每个节点
    while (current->next != NULL) {
        current = current->next;

        Node* newNode = createNode(current->data);  // 复制当前节点
        newCurrent->next = newNode;  // 将新节点连接到副本链表的最后
        newCurrent = newCurrent->next;  // 更新副本链表的当前节点
    }

    return newHead;
}

最后,我们可以使用以下代码测试链表副本的制作:

int main() {
    // 创建原链表
    Node* head = createNode(1);
    Node* second = createNode(2);
    Node* third = createNode(3);

    head->next = second;
    second->next = third;

    // 制作链表的副本
    Node* newHead = copyLinkedList(head);

    // 打印原链表
    printf("Original Linked List: ");
    Node* current = head;
    while (current != NULL) {
        printf("%d -> ", current->data);
        current = current->next;
    }
    printf("NULL\n");

    // 打印副本链表
    printf("Copied Linked List: ");
    current = newHead;
    while (current != NULL) {
        printf("%d -> ", current->data);
        current = current->next;
    }
    printf("NULL\n");

    return 0;
}

以上代码将输出以下结果:

Original Linked List: 1 -> 2 -> 3 -> NULL
Copied Linked List: 1 -> 2 -> 3 -> NULL

这证明我们成功地制作了链表的副本。

结论

通过遍历原链表,并为每个节点创建新节点,我们可以制作链表的副本。这对于处理链表数据结构的复制和修改非常有用。在 C 编程语言中,我们可以使用 malloc 动态分配新节点的内存来实现这一副本制作过程。