在c中从链表中删除项目
如何在c中从链表中删除项目在c中从链表中删除项目,c,linked-list,C,Linked List,如何在c中从链表中删除项目 typedef struct { int n; struct item *nexI; } item; #define na 1000 int n, j; 我主要有: item * list[na]; n = 5; for(j = 0; j < na; j++) remove_elem(list, n, j); } 但是这段代码给了我一个分段错误,我没注意到为什么,你能猜出我这里做错了什么吗?严格按照你的代码,我敢打赌这是关于
typedef struct
{
int n;
struct item *nexI;
} item;
#define na 1000
int n, j;
我主要有:
item * list[na];
n = 5;
for(j = 0; j < na; j++)
remove_elem(list, n, j);
}
但是这段代码给了我一个分段错误,我没注意到为什么,你能猜出我这里做错了什么吗?严格按照你的代码,我敢打赌这是关于未初始化的指针 首先,在声明指针数组时,需要将所有指针初始化为
NULL
:
item * list[na] = { NULL };
然后,您应该检查所有函数中的NULL
指针:
void remove_elem(item * list[], int n, int pos)
{
if (list[pos] == NULL)
return;
/* ... */
}
当然,当您分配一个新节点放入列表时,您当然也必须将
nexI
指针设置为NULL
,或者像if(aux==NULL)
这样的检查将不起作用。重复一百万次。搜索“从链接列表中删除”。是否尝试在调试器中运行?这将告诉您崩溃发生在哪里。调试器在哪里显示分段错误发生?此时的变量值是什么?一次调试一个项目。您正在获得分段,因为您正在访问一个对访问无效的内存地址,这意味着您可能没有很好地处理边缘情况。也许你的代码中有一个索引问题。试试看。或删除不存在的指针;不应该被删除;现在请不要使用gdb,好的,只需使用printf或其组合,然后查看要删除的内容。您正试图清除整个列表(或列表中的一组项目)。看看它在哪一点失败。第一个被删除后它就失败了吗?还是中间还是最后一个元素?然后你可以缩小边缘的范围。谢谢大家的回复!就在你给我答案的那一刻,我明白了那个失踪的案子。真让人分心。再次感谢,现在一切都很好!:)
void remove_elem(item * list[], int n, int pos)
{
if (list[pos] == NULL)
return;
/* ... */
}