gpt4 book ai didi

C++链表不删除头节点

转载 作者:行者123 更新时间:2023-11-30 02:48:46 25 4
gpt4 key购买 nike

我有一个非常简单的节点类来实现链表(它只有数据和下一个指针)。下面的函数应该删除其“数据”= 值的第一个节点。该功能工作正常。但是当我尝试删除第一个元素(列表的头部)时,它没有。那么,问题出在哪里呢?这是代码

class Node{
public:
int data;
Node *next;
....some other functions...

};
void deleteNode(Node *n, int value){
cout<<"after deleting node with data = "<<value<<" : ";
if(n->data == value){
n = n->next; //I guess the problem is somewhere here!
return;
}
while(n){
if(n->next->data == value){
n->next = n->next->next;
return;
}
n = n->next;
}
}

void printTheLinkedList(Node *n){
while(n){
cout<<n->data<<" --> ";
n = n->next;
}
cout<<"NULL"<<endl;
}


int main(){
Node N(0);
for(int i = 1; i < 10; i++)
N.appendNode(i);

printTheLinkedList(&N);
deleteNode(&N, 3);
printTheLinkedList(&N);
deleteNode(&N, 0);
printTheLinkedList(&N);


return 0;
}

这是代码的输出(注意:3被删除,但0没有)

0 --> 1 --> 2 --> 3 --> 4 --> 5 --> 6 --> 7 --> 8 --> 9 --> NULL
0 --> 1 --> 2 --> 4 --> 5 --> 6 --> 7 --> 8 --> 9 --> NULL
0 --> 1 --> 2 --> 4 --> 5 --> 6 --> 7 --> 8 --> 9 --> NULL

最佳答案

首先,您在代码注释中的猜测是正确的。该行与问题有关。

存在三个问题:

  1. 不能删除根节点,因为它作为 main 函数的局部变量分配在堆栈上。

  2. 链接节点需要封装在类似linked_list容器数据结构中。它会在内部(至少)存储指向链表的 head(例如开头)的指针。如果该 head 节点被删除,您只需将下一个指针设置为 head

  3. 您的删除代码目前没有释放动态分配的节点,因此您的应用正在泄漏内存。

由于您使用 C++ 编写代码,因此您可以使用智能指针来处理自动释放。

关于C++链表不删除头节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21819281/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com