📜  C程序使用递归创建单个链接列表的副本(1)

📅  最后修改于: 2023-12-03 15:30:15.556000             🧑  作者: Mango

C程序使用递归创建单个链接列表的副本

在C语言中,通过使用递归函数可以创建单个链接列表的副本。链表是一种动态数据结构,它允许在运行时动态地添加或删除数据。递归是一种在函数中调用自身的技术,在链表中创建副本时非常有用。

链表基础知识

链表是一系列的节点,每个节点都包含一个值和一个指向下一个节点的指针。下面是一个简单的链表结构体:

struct Node {
    int value;
    struct Node *next;
};

节点(node)通常包括一个值和一个指向下一个节点的指针(next),如下图所示:

链表基础知识

使用递归创建单个链接列表的副本

以下是使用递归函数创建单个链接列表副本的函数实现:

struct Node *copyList(struct Node *head) {
    if (head == NULL) { // 基本情况:链表为空
        return NULL;
    } else { // 递归情况:链表非空
        struct Node *newNode = malloc(sizeof(struct Node)); // 创建新的节点
        newNode->value = head->value; // 复制值
        newNode->next = copyList(head->next); // 递归创建副本
        return newNode;
    }
}

函数中的两个情况是基本情况和递归情况。基本情况是当链表为空时,直接返回空指针(null pointer)。递归情况是当链表非空时,创建一个新的节点(newNode),复制当前节点的值,递归创建下一个节点的副本,并将其赋值给新节点的next指针。

使用示例

以下是使用示例,创建一个链接列表并复制它的副本:

int main() {
    struct Node *head = NULL;
    struct Node *newNode = malloc(sizeof(struct Node));
    newNode->value = 1;
    newNode->next = NULL;
    head = newNode;

    struct Node *node1 = malloc(sizeof(struct Node));
    node1->value = 2;
    node1->next = NULL;
    newNode->next = node1;

    struct Node *node2 = malloc(sizeof(struct Node));
    node2->value = 3;
    node2->next = NULL;
    node1->next = node2;

    printf("Original list:\n");
    printList(head);

    struct Node *copy = copyList(head);

    printf("Copied list:\n");
    printList(copy);

    return 0;
}

输出结果为:

Original list:
1 -> 2 -> 3 -> NULL
Copied list:
1 -> 2 -> 3 -> NULL
结论

通过递归函数,我们可以创建一个单个链接列表的副本。这个副本可以对原链表进行操作,而不会影响原链表的内容。递归函数是这种操作链表的好方法,因为它可以递归地处理每个节点,并且不需要在每个节点处使用循环控制结构来复制它的副本。