在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); } 但是这段代码给了我一个分段错误,我没注意到为什么,你能猜出我这里做错了什么吗?严格按照你的代码,我敢打赌这是关于

如何在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);
}


但是这段代码给了我一个分段错误,我没注意到为什么,你能猜出我这里做错了什么吗?

严格按照你的代码,我敢打赌这是关于未初始化的指针

首先,在声明指针数组时,需要将所有指针初始化为
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;

    /* ... */
}