我为这个noob问题道歉,但我真的很难回答。我有一个有两个不同链接的链表:Next和sort。我想用Next添加到前面,但按递增顺序添加以排序。然而,每当我尝试添加以排序时,我都会遇到segfault,我不知道如何访问它们,使它们成为两个不同的链表,具有相同的数据,但顺序不同。
这是我的清单:
typedef struct NODE {
value_t value;
key_t key;
struct NODE * next;
struct NODE * sort;
} Node;
这就是我写的方式
Node * add_sorted(Node ** head, int value, key_t key){
Node *new_node = malloc(sizeof(Node));
if (new_node != NULL) {
new_node->sort->value = value;
new_node->sort->key = key;
new_node->sort = *head;
*head = new_node;
}
return new_node;
}
提前感谢你忍受我的无知
您正试图将值分配给地址空间中未初始化的位置。
new_node->sort->value = value;
new_node->sort->key = key;
在本部分中,您没有创建*sort,但它被声明为存在。创建new_node并不意味着存在*排序。因为它是一个指针。在这种情况下,它不指向任何地方,而是指向无效。
我不知道这是否与你的问题有关,但我认为你也需要解决这个问题。
希望能有所帮助。
添加时,new_node->sort = *head;
没有任何意义。因为,属性sort
的先前设置将被擦除。
首先,您要为指针赋值,而不为其分配内存或初始化它。
这应该有效:
if (new_node != NULL) {
new_node->sort = malloc(sizeof(Node));
new_node->sort->value = value;
new_node->sort->key = key;
new_node->sort = *head;
*head = new_node;
}
还要注意,函数参数int value
的类型与分配给它的成员的类型不同。(value_t value
(
我还认为这里的new_node->sort = *head;
你指的是new_node->next = *head;
,因为有了这个赋值数据,你分配给排序字段的数据就会丢失。