在C中删除链接的LIst

时间:2016-10-11 20:25:44

标签: c linked-list

我只是坚持了几个小时的问题,试图找到我的代码中断的地方。我知道如何删除链表但有些东西不起作用。

首先,它是一个非常简单的结构,其dataype为int,2 struct * next和* prev。

struct _list_{ 
    struct _list_ *next;
    struct _list_ *prev;
    float distance;
}

现在我正在制作一个push_front函数,效果很好。我得到了我正在寻找的结果。但是现在我正在制作pop_front函数,而且缺少了一些东西。

该函数应返回距离,然后从链表中删除该列表,但我不能这样做。

这是我写的代码

int pop_front(list** header)
{
  float number = (*header)->data;
  list *head = *header;
  list *remove = head;

  // This should check if the pointer is pointing at the first element
  while (head->prev != NULL) {
    head = head->prev;
  }

  if (head) {
    head = head->next;
    free(remove);
    remove = head;
    remove->prev = NULL;
    //if i remove the code below then i get this error 
    //*** Error in `./double_ended_queue.out': double free or 
    //corruption (fasttop): 0x0000000001d5a050 ***
    //Pop up: 3 pointer: 3 Aborted (core dumped)
    *header = *remove;
    //And with this code i get a Segmentation fault (core dumped
    return number;
  }
  return 0;
}

任何帮助都会很棒,谢谢。

P.S。检查了所有链表问题,没有人帮忙。

1 个答案:

答案 0 :(得分:0)

你们从哪里获得这个功课? API sux。在这里,其他人确实有几乎相同的作业(链接指向我的答案,其中还有很多问题):Pointer Dequeue - pointer training

反正:

你想返回int还是float?元素数据是float类型,你的变量“number”也是,但你的函数返回int。

int pop_front(list** header)
{
  float number = (*header)->data;

所以,在这里你得到你想要删除的元素的值,但是......

  list *head = *header;
  list *remove = head;

  // This should check if the pointer is pointing at the first element
  while (head->prev != NULL) {
    head = head->prev;
  }

...您实际上正在搜索要删除的元素。

显然,你必须反过来这样做:

int pop_front(list** header)
{
    list * head = *header;
    while (head->prev) head = head->prev;

现在,您应该检查,天气需要调整*标题指针(并立即执行):

    if (*header == head) {
        *header = head->next;
    }

现在唯一要做的就是从列表中删除对象,获取它的值并在返回之前释放它的内存。

    head->next->prev = NULL;
    float retval = head->data;
    free(head);
    return retval;
}

随着练习留给你:确保空列表不会崩溃;)

/ edit:这也会因删除最后一个元素而崩溃,所以你还剩下两个练习;)