以下代码未编译(代码是部分/修改代码,原因显而易见)
typedef struct l_list{
int value;
struct l_list *next;
}list; // given
void delete(list **head, int value){ //given
...
free(current); // segmentation fault
...
}
int main() /// given for testcase
{
list listg[2];
// initialized 2 struct and link them with each other using next pointer one after another (think like arrayed linked list)
delete(&listg, 3);
}
error: cannot convert list (*)[2] {aka l_list (*)[2]} to list** {aka l_list**} for argument 1 to void delete(list**, int)
问题1:编译帮助。请指教!
问题2:如果我们必须如上所述实现删除,在函数中如何释放数组列表中的指针? (如何删除分段错误?)
答案 0 :(得分:2)
请注意listg
是数组list
然后,&listg
是指向list
数组的指针。
delete()
期望指向第一个参数中指向list
的指针。因此,您的类型不匹配,从而导致编译错误。这可以通过实际传入指向list
的指针的地址来纠正。
list listg[5] = {
{ 1, &listg[1] },
{ 2, &listg[2] },
{ 3, &listg[3] },
{ 4, &listg[4] },
{ 5, 0 } };
list *listp = listg;
delete(&listp, 3);
不允许您对free()
(或其中一个兄弟姐妹)未返回的指针值调用malloc()
。这意味着您无法在自动或静态内存上调用free()
,也不能在动态分配中调用地址。但是,您可以从列表中删除与3
关联的节点。
通常通过操作节点的next
指针来实现节点移除,该指针位于要从其当前值移除的节点之前,并且移向要移除的节点之后的节点。您将需要代码(可能是某种循环)来标识要删除的节点以及前一个节点来完成此操作。如果您需要删除列表的第一个元素,可以通过将列表的头部更改为列表中的下一个项目来完成。
答案 1 :(得分:0)
此:
list listg[5];
不是由next
指针串联在一起的5个节点的列表。这是一个包含五个列表的数组。 (而“list”对于该结构来说是一个非常具有误导性的名称 - “节点”会更好。)我不知道你期望delete
做什么(因为你没有向我们展示delete()
1}}),但该函数的签名与您给出的不匹配。
我不知道“数组列表”是什么意思。你的意思是一系列的名单?并且“数组列表中的指针”是指指向这种数组元素的指针吗?释放这样一个指针意味着什么?
答案 2 :(得分:0)
修复样本(数组版本)
#include <stdio.h>
#include <stdlib.h>
typedef struct l_list{
int value;
struct l_list *next;
}list;
void delete(list **head, int value){
list *current, *previous = NULL;
for (current = *head; current != NULL; previous = current, current = current->next){
if (current->value == value){
break;
}
}
if (current != NULL){
if (previous == NULL){
*head = current->next;
} else{
previous->next = current->next;
}
}
return;
}
void print(list *head){
while(head){
printf("%d ", head->value);
head = head->next;
}
printf("\n");
}
int main() {
list listg[5];
listg[0].value = 1;
listg[0].next = listg + 1;
listg[1].value = 3;
listg[1].next = NULL;
list *head = &listg[0];
print(head);
delete(&head, 3);
print(head);
return 0;
}