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