C语言 使用链表排队



有人可以解释下面的删除功能吗?它应该从队列中删除一个元素,我在我开始感到困惑的行上留下了评论。我知道我们需要删除最后一个元素,但我不明白他们如何将倒数第二个元素设置为 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);
  }
}

info=front->data;

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

todelete->link=NULL

不是必需的,但它阐明了在删除元素之前完全取消排队的过程。

如果您简单地将"链接"重命名为"下一步",它会变得更加清晰。基本上,您在要删除的元素上保留一个书签,然后连接队列中的元素跳过该元素,然后删除已添加书签的元素。那是因为否则你会得到内存泄漏。例如,如果您有一个列表具有:

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

你想删除元素 [2],你要做的是在 [2] 上保留一个书签,比如说 x:[2],然后你让它使 [1] 中的"下一个"是 [3],这给你

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

然后删除 x:[2]。

相关内容

  • 没有找到相关文章

最新更新