从未动态分配的链接 list/deleting 值中删除值
removing a value from a linked list/deleting values that were not dynamically allocated
我的教科书有以下用于从链表中删除元素的代码。
void remove(double num)
{
Node *cur, *prev;
if(!head){
return;
}
if(head->data == num)
{
cur = head;
head = head->next;
delete cur;
}
else{
cur = head;
while(cur!=NULL && cur->data != num)
{
prev = cur;
cur= cur->next;
}
if(cur)
{
prev->next = cur->next;
delete cur;
}
}
}
我有几个关于这段代码的问题。首先,如何删除不是动态分配的值?为什么这是必要的?我在任何地方都没有看到新声明。其次,为什么需要这段代码?为什么它需要在 if 语句中?
if(cur)
{
prev->next = cur->next;
delete cur;
}
首先,此代码假定节点是动态分配的。这就是通常构造链表的方式。如果您的代码使用堆栈上的节点,则只需删除 delete
语句。 (并考虑一下如何跟踪正在使用的节点。)
其次,该代码块是必需的,因为它删除了要删除的节点——如果该节点存在的话。如果节点不存在,它位于 if
块中。在纸上画一个简单的示例,然后逐步执行代码,看看如果您尝试删除不在列表中的元素会发生什么。
delete
之前未分配给 new
的值是不正确的。我假设 new
-allocation 由您的教科书暗示。
关于你的第二个问题,在
之后
while(cur!=NULL && cur->data != num){...}
已完成,cur == NULL
或 cur != NULL && cur->data == num
。 if (cur)
实际上是 if (cur != NULL)
,这意味着 cur
包含您要查找的值。
块本身需要通过将前一个元素的 next
指针更改为被删除元素之后的元素来删除找到的元素。
我的教科书有以下用于从链表中删除元素的代码。
void remove(double num)
{
Node *cur, *prev;
if(!head){
return;
}
if(head->data == num)
{
cur = head;
head = head->next;
delete cur;
}
else{
cur = head;
while(cur!=NULL && cur->data != num)
{
prev = cur;
cur= cur->next;
}
if(cur)
{
prev->next = cur->next;
delete cur;
}
}
}
我有几个关于这段代码的问题。首先,如何删除不是动态分配的值?为什么这是必要的?我在任何地方都没有看到新声明。其次,为什么需要这段代码?为什么它需要在 if 语句中?
if(cur)
{
prev->next = cur->next;
delete cur;
}
首先,此代码假定节点是动态分配的。这就是通常构造链表的方式。如果您的代码使用堆栈上的节点,则只需删除 delete
语句。 (并考虑一下如何跟踪正在使用的节点。)
其次,该代码块是必需的,因为它删除了要删除的节点——如果该节点存在的话。如果节点不存在,它位于 if
块中。在纸上画一个简单的示例,然后逐步执行代码,看看如果您尝试删除不在列表中的元素会发生什么。
delete
之前未分配给 new
的值是不正确的。我假设 new
-allocation 由您的教科书暗示。
关于你的第二个问题,在
之后while(cur!=NULL && cur->data != num){...}
已完成,cur == NULL
或 cur != NULL && cur->data == num
。 if (cur)
实际上是 if (cur != NULL)
,这意味着 cur
包含您要查找的值。
块本身需要通过将前一个元素的 next
指针更改为被删除元素之后的元素来删除找到的元素。