使用链接列表进行排队

时间:2014-12-04 13:48:01

标签: c linked-list

有人可以解释下面的删除功能吗?它应该从队列中删除一个元素,并在我开始混淆的行上留下评论。我知道我们需要删除最后一个元素,但我没看到他们如何将第二个元素设置为NULL。

typedef struct node {
  int data;
  struct node *link;
} NODE;

NODE *front, *rear; // global declarations
front = rear = NULL;

int Delete() {
  int info;
  NODE *todelete;

  if (front == NULL) {
    printf(" Underflow!!!");
    return -1;
  } else {
    todelelete = front;
    //info = front->data; // I don't get it from here

    if (front == rear)
      rear = NULL;
    front = front->link;
    todelete->link = NULL;
    free(todelte);
    //return(info);
  }
}

2 个答案:

答案 0 :(得分:1)

该行

info=front->data;

存储列表头部的数据只是为了稍后返回;它是要出列的数据。然后,处理todelete是列表中唯一节点的特殊情况。接下来,front指针移动到队列的原始第二个节点。最后,todelete被释放。严格来说,行

todelete->link=NULL

不是必需的,但它澄清了在删除元素之前完全取消元素的过程。

答案 1 :(得分:0)

如果您只是将“链接”重命名为“下一步”,则会变得更加清晰。 基本上你保留一个关于你要删除的元素的书签,然后连接跳过该元素的队列元素,然后删除你加入书签的元素。那是因为否则你会得到内存泄漏。 例如,如果您有一个包含以下内容的列表:

[1]->[2]->[3]->[4]

并且你要删除元素[2],你要做的是在[2]上保留一个书签,让我们说x:[2],然后你这样做,以便[1]中的“下一个”是[3] ],给你

[1]->[3]->[4]

然后你删除x:[2]。