删除C语言中的链表



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

首先,它是一个非常简单的结构体,数据类型为int和2结构体*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;
}

任何帮助将是伟大的,谢谢你。

注:检查了这里所有的链表问题,没有一个帮助。

你们的作业都是从哪来的?API sux。在这里,其他人确实有几乎相同的作业(链接指向我的答案,还有很多问题):指针Dequeue -指针训练

无论如何:

你想返回int还是float?元素data是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:这也会因为删除最后一个元素而崩溃,所以您还剩下两个练习;)

相关内容

  • 没有找到相关文章

最新更新