C编程:如何弹出链表上的最后一个元素



我是一名初学者,一周前我被介绍到链表,但我仍在努力理解这一点。

目前正在尝试编写一个函数,该函数将帮助我从链表中删除最后一个元素。我希望能解释一下我在这里做错了什么。谢谢你的建议。

我不允许触摸或修改当前结构

这是我的结构:

typedef struct node {
    ElemType val;
    struct node *next;
} NODE;
struct list_struct {
    NODE *front;
    NODE *back;
};

这是我目前的代码:

如果列表为空,则不执行任何操作并返回任意值否则,列表中的最后一个元素将被删除返回值。

ElemType lst_pop_back(LIST *l) {

    NODE * p = l->front;
    NODE * trail = l->front;

    if( p == NULL) return 0;
    if( lst_len(l) == 1){
        free(p);
        l->front = NULL;
        l->back = NULL;
    }
    else{
        p=p->next;
        while( p != NULL){
            if( p->next == NULL) free(p);
            trail = trail->next;
            p=p->next;
        }
        trail= trail->next;
        trail->next= NULL;
    }
    return 0;
}

我在MAC上使用Xcode,得到的错误是:线程1:EXC_ACCESS(代码=1,地址=0x8)

XCode错误EXC_BAD_ACCESS(code=1, address=0x8)表示有人试图访问不可访问的内存。XCode的边界检查据说很好,所以让我们相信它们。OP没有告诉我们确切的行号,但人们可以猜测,这有点令人难过。我同意Katerina B.的观点,并认为这是罪魁祸首。

详细信息:

ElemType lst_pop_back(LIST * l)
{
  // p and trail point to the first node
  NODE *p = l->front;
  NODE *trail = l->front;
  if (p == NULL)
    return 0;
  if (lst_len(l) == 1) {
    free(p);
    l->front = NULL;
    l->back = NULL;
  } else {
    p = p->next;
    // Now: trail->next points to the old p
    // and p to p->next, that is: trail points
    // to the node before p
    // while trail is not the last node
    while (p != NULL) {
      // if p is the last node
      if (p->next == NULL){
        // release memory of p, p points to nowhere from now on
        free(p);
      }
      // Following comments assume that p got free()'d at this point
      // because trail points to the node before p
      // trail->next points to the node p pointed to
      // before but p got just free()'d
      trail = trail->next;
      // p got free()'d so p->next is not defined
      p = p->next;
    }
    // assuming p got free()'d than trail->next is one step
    // further into unknown, pardon, undefined territory
    trail = trail->next;
    trail->next = NULL;
  }
  return 0;
}

我认为,当您试图访问已解除分配的东西时,会发生错误。你在这里这样做:

if( p->next == NULL) free(p);
trail = trail->next;
p=p->next;

由于列表结构包含一个返回指针,我建议使用它来帮助您。也许让p在列表中移动,直到p->next指向与列表的后指针相同的东西,然后使p->next为null。

此外,函数应该从列表中弹出还是删除?您的问题是删除,但函数名为lst_pop_back。如果您正在弹出,您也需要返回最后一个值。

相关内容

  • 没有找到相关文章

最新更新