📌  相关文章
📜  使用递归创建单链表副本的 C 程序(1)

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

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

单链表是一种常用的数据结构,但有时我们需要创建一个单链表的副本。递归是一种常用的算法来解决此问题。本文将介绍如何使用递归创建单链表副本的 C 程序。

链表结构定义

为了使用递归创建单链表副本,我们需要先定义链表结构。

typedef struct Node {
    int val;
    struct Node* next;
} Node;

这里我们定义了一个 Node 结构体,包含两个成员变量 —— 值 val 和指向下一个节点的指针 next。其中 val 可以根据实际情况定义为任意类型。

递归函数定义

接下来我们将定义一个递归函数 copy_list,该函数将返回输入链表的副本。

Node* copy_list(Node* head) {
    if (head == NULL) {
        return NULL;
    }
    Node* new_node = malloc(sizeof(struct Node));
    new_node->val = head->val;
    new_node->next = copy_list(head->next);
    return new_node;
}

函数的基本思路为:如果链表为空,则返回 NULL。否则先创建一个新节点,复制原节点的值,并将新节点的 next 指针指向递归调用 copy_list 函数返回的新链表头。

需要注意的是,在创建新节点时应使用 malloc 函数申请内存,调用结束后应使用 free 函数释放内存。

使用示例

使用示例:

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

int main() {
    // 创建原始链表
    Node* head = malloc(sizeof(struct Node));
    head->val = 1;
    head->next = malloc(sizeof(struct Node));
    head->next->val = 2;
    head->next->next = malloc(sizeof(struct Node));
    head->next->next->val = 3;
    head->next->next->next = NULL;

    // 创建链表副本
    Node* copy_head = copy_list(head);

    // 输出链表副本
    Node* p = copy_head;
    while (p != NULL) {
        printf("%d\n", p->val);
        p = p->next;
    }

    // 释放内存
    free(head->next->next);
    free(head->next);
    free(head);
    free(copy_head->next->next);
    free(copy_head->next);
    free(copy_head);

    return 0;
}

运行结果:

1
2
3
总结

本文介绍了如何使用递归创建单链表副本的 C 程序,讲解了链表结构的定义、递归函数的定义以及使用示例。在实际应用中,我们可以利用此方法来保证链表数据的安全性,避免副本数据被修改导致原数据被污染。