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