首页 > 解决方案 > 如何修复链表分段错误 C

问题描述

我正在尝试在以下代码中解决“分段错误”的问题,我可能认为我没有得到全貌,这就是为什么我不断获得分段错误而不是分段错误,任何有助于深入理解这一点,会鼓励我发展自我分析。

代码应该很简单:给定两个列表,我想从第一个列表中删除第二个中出现的所有元素,我的努力是:

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;
      }
    }       
  }
}

标签: cpointerslinked-listfree

解决方案


您的代码有几个问题:

  • 当第二个列表比另一个短时,您会得到一个段错误,因为您没有aus在第一个 if 语句中检查是否为 NULL。

  • 如果第一个列表中间的元素被删除,稍后您会得到另一个段错误,因为被删除元素的前身仍然指向原始元素,但释放了内存。

  • 我不知道这是否是一个问题,但您的算法似乎只适用于排序列表,请查看这两个列表,例如 [1,2] 和 [2,1]。

为了帮助您使用算法,我们需要知道您喜欢如何处理重复元素以及列表是否已排序。


推荐阅读