📅  最后修改于: 2023-12-03 14:52:14.436000             🧑  作者: Mango
在 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
动态分配新节点的内存来实现这一副本制作过程。