首页 > 解决方案 > 创建重复链表返回 SIGSEGV

问题描述

所以我试图创建一个包含指向数据的空指针的链接列表的副本定义是:

typedef struct SinglyLinkedListNode {
    void *data;
    struct SinglyLinkedListNode *next;
}SinglyLinkedListNode;

typedef struct SinglyLinkedList {
    int size;
    struct SinglyLinkedListNode *front;
}SinglyLinkedList;

我克隆链表的功能受到了如何克隆带有头/尾实现的链表的启发?唯一的区别是,我的列表没有尾部实现。

这是我的实现

SinglyLinkedListNode *cloneList(SinglyLinkedList *list, SinglyLinkedListNode *head) {
    if(head == NULL)
        return NULL;
    SinglyLinkedListNode *result = (SinglyLinkedListNode *)malloc(sizeof(SinglyLinkedListNode));
    result->data = head->data;
    if(head->next)
        result->next = cloneList(list, head->next);
    return result;
}

SinglyLinkedList *cloneFullList(SinglyLinkedList *list) {
    if(list == NULL)
        return NULL;
    SinglyLinkedList *result = (SinglyLinkedList *)malloc(sizeof(SinglyLinkedList));
    result->size = list->size;
    if(list->front != NULL)
        list->front = cloneList(result, list->front);
    return result;
}

但是当试图访问这样的数据时

SinglyLinkedList *list1 =  (SinglyLinkedList *)malloc(sizeof(SinglyLinkedList));
list1 = cloneFullList(list); //where list is an already existing list which works correctly
SinglyLinkedListNode *curr1 = (SinglyLinkedListNode *)malloc(sizeof(SinglyLinkedListNode));
curr1 = list1->front;

尝试访问会curr1->data返回 SEGMENTATION FAULT。但是当我尝试curr1 = list->front通过正确访问数据来访问数据时。我克隆链接列表的函数的错误在哪里?

标签: calgorithmpointerslinked-listclone

解决方案


我认为您没有正确理解事物的工作原理…… malloc 为您的对象分配内存,但不对其进行初始化。list1 = cloneFullList(list); 这将指针分配给一个新的目标,但丢失了分配空间的跟踪,而不对其进行初始化。

此外,您的 cloneList 没有在最后一个元素上设置下一个指针(当 next 为空时),因此它保持未初始化状态。cloneFullList 也一样(你应该删除 if(list->front != NULL),因为 cloneList 已经处理了 NULL 的情况)。


推荐阅读