c - 创建重复链表返回 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
通过正确访问数据来访问数据时。我克隆链接列表的函数的错误在哪里?
解决方案
我认为您没有正确理解事物的工作原理…… malloc 为您的对象分配内存,但不对其进行初始化。list1 = cloneFullList(list); 这将指针分配给一个新的目标,但丢失了分配空间的跟踪,而不对其进行初始化。
此外,您的 cloneList 没有在最后一个元素上设置下一个指针(当 next 为空时),因此它保持未初始化状态。cloneFullList 也一样(你应该删除 if(list->front != NULL),因为 cloneList 已经处理了 NULL 的情况)。
推荐阅读
- node.js - Sequelize,实例化后如何更改值?
- mongodb - $expr 查询运算符似乎不适用于数组点表示法
- ansible - 无法使用 win_copy 将文件复制到 Program Files
- fastify - 在 fastify 插件中使用 fastify 插件
- python - 访问 python numpy.matrix 中的元素
- android - 颤振中具有顶部重力和覆盖线的对话框
- node.js - 在 nodejs 和 nginx 中检测 https 的问题
- python - 如何解析用逗号分隔的浮动数字
- java - Android闪屏跳转java
- delphi - Delphi的TAdoQuery中方法First的目的是什么