【问题标题】:Deleting Linked LIst in C在 C 中删除链接列表
【发布时间】:2017-02-20 12:26:55
【问题描述】:

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

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

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

附:在这里检查了所有的链表问题,没有任何帮助。

【问题讨论】:

  • delete 是保留关键字。请重命名。
  • 要么这是 C,然后你可以使用一个名为 delete 的变量(虽然我不推荐它),或者它不是,那么你不应该。无论哪种方式,使用 both 语言标签都是错误的。
  • sry 删除了 c++ 标签
  • 这看起来很奇怪。 *remove = head; free(remove); remove=head。你不是释放了head 指向的东西,然后立即再次使用head 吗?
  • 它应该显示到下一个元素。

标签: c linked-list


【解决方案1】:

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

无论如何:

你想返回int还是float?元素数据是浮点类型,你的变量也是“数字”,但你的函数返回 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;

现在,您应该检查一下是否需要调整 *header 指针(并立即进行):

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

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

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

作为留给您的练习:确保空列表不会崩溃;)

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

【讨论】:

  • 我可以提出一个简单的问题 *header = NULL;在 c 中?
  • 当我取出最后一个元素时。
  • 是的。 “*header”是“header”指向的对象,因为它不是const,所以你可以给它赋值。 NULL 是一个值。所以你可以分配NULL。
猜你喜欢
  • 1970-01-01
  • 2022-11-14
  • 1970-01-01
  • 1970-01-01
  • 2018-11-24
  • 1970-01-01
  • 2017-08-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多