c - 如何修复链表段错误 C

标签 c pointers linked-list free

我正在尝试解决以下代码中的“段错误”问题, 我可能认为我没有得到全貌,这就是为什么我不断获得段错误而不是段错误, 任何有助于深入理解这一点的帮助都会鼓励我进行 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/

相关文章:

c++ - 当我通过删除临时节点来释放内存时,我遇到了读取访问冲突。但只有当我返回虚假陈述时

C:结构语法链表

c - 一些指针运算

c - 在 Scala 中映射 C 结构

c - 诡异的 。 C 中的表示法?这叫什么,有人可以解释一下吗?

C:奇怪的条件 printf 行为

c++ - 指针说明

c++ - 测试LinkedLists时VS2010编译错误

c - 在不初始化的情况下使用 memset 或 strtok

c++ - 如何在 Windows 64 位上安装 cmake