我正在尝试解决以下代码中的“段错误”问题, 我可能认为我没有得到全貌,这就是为什么我不断获得段错误而不是段错误, 任何有助于深入理解这一点的帮助都会鼓励我进行 self 分析。
代码应该很简单:给定两个列表,我想从第一个列表中删除第二个列表中出现的所有元素, 我的努力是:
typedef struct EL {
int info;
struct EL *next;
} ElementoLista;
typedef ElementoLista *ListaDiElementi;
void filterLists(ListaDiElementi *lista1,ListaDiElementi *lista2) {
ListaDiElementi aux = *lista1,aus = *lista2,corr;
while(aux != NULL) {
if(aux->info == aus->info) { // Erase from the first
corr = aux;
aux = aux->next;
free(corr);
}
else {
if(aus != NULL) //Increase the second
aus = aus->next;
else {
aus = *lista2; //Restart
aux = aux->next;
}
}
}
}
最佳答案
您的代码存在几个问题:
当第二个列表比另一个列表短时,您会遇到段错误,因为您没有检查第一个 if 语句中的
aus
是否为 NULL。如果第一个列表中间的元素被删除,您稍后会遇到另一个段错误,因为被删除元素的前一个元素仍然指向原始但已释放的内存。
<我不知道这是否是一个问题,但您的算法似乎只适用于排序列表,看看这两个列表,例如 [1,2] 和 [2,1]。
为了帮助您使用算法,我们需要知道您希望如何处理重复元素以及列表是否已排序。
关于c - 如何修复链表段错误 C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54377661/