gpt4 book ai didi

c++ - 如何删除链表中的特定节点?

转载 作者:行者123 更新时间:2023-12-05 05:33:07 24 4
gpt4 key购买 nike

我有下一个链表代码:

#include <iostream>
#include <string>
using namespace std;
#define null 0

class Node
{
public:
string name;
int age;
Node *next;
Node(string name, int age)
{
this->age = age;
this->name = name;
this->next = null;
}
};

class LinkedList
{
private:
Node *head;
public:
LinkedList()
{
this->head = null;
}

void insert(string name, int age)
{
Node *nodenew = new Node(name, age);
nodenew->next = null;
if (this->head == null)
{
this->head = nodenew;
}
else
{
Node *temp = this->head;
while (temp->next != null)
{
temp = temp->next;
}
temp->next = nodenew;
}
}

void print()
{
if (this->head == null)
{
cout << "Empty";
}

Node *temp = this->head;

while (temp != null)
{
cout << temp->name << ", " << temp->age <<endl;
temp = temp->next;
}
}

void deletePerson(string name){
Node *temp = this->head;
Node* prev = null;

if (temp!=null && temp->name == name)
{
this->head = temp->next;
delete temp;
return;
}else
{
while (temp != null && temp->name == name)
{
prev = temp;
temp = temp->next;
}
if (temp == null)
{
return;
}
prev->next = temp->next;
delete temp;
}
}


};

int main(int argc, char const *argv[])
{
LinkedList list;
list.insert("David", 45);
list.insert("John", 23);
list.insert("Katty", 78);
list.insert("Stephanie", 25);
list.deletePerson("Katty");
list.print();
return 0;
}

我正在尝试使用下一个方法删除给定名称的节点:

void deletePerson(string name){
Node *temp = this->head;
Node* prev = null;

if (temp!=null && temp->name == name)
{
this->head = temp->next;
delete temp;
return;
}else
{
while (temp != null && temp->name == name)
{
prev = temp;
temp = temp->next;
}
if (temp == null)
{
return;
}
prev->next = temp->next;
delete temp;
}
}

但是当我编译我的代码时,它没有在控制台中显示任何内容,它只显示下一个代码错误:

code=3221225477

我尝试调试我的代码,但 vscode 只是将我切换到其他类,在 prev->next = temp->next; 部分它只显示一条小消息:

Exception has occurred. X
Segmentation fault

我的预期输出是:

David, 45
John, 23
Stephanie, 25

希望你能帮我解决这个问题,谢谢。

最佳答案

你的问题很简单,就在那一行:

while (temp != null && temp->name == name)

应该是:

while (temp != null && temp->name != name)

作为循环的条件,您将一直循环,直到您没有到达终点 (temp != null) 或在此迭代中找不到名称 (temp->名字 != 名字).

此外,这一行有一个小警告:

prev->next = temp->next;

想象一下,如果您没有找到该节点,那么 temp 将为空,并且 temp->next; 行将在您尝试时抛出错误取消引用空指针。

我知道您在编写代码时处理了这种情况:

if (temp == null)
{
return;
}

但是出于安全原因或者万一你的编译器提示它是我的,你应该检查 prevtemp 是否都是空指针,所以它应该是:

if(null !=  prev && null != temp)
prev->next = temp->next;

编辑后,这是输出:

David, 45
John, 23
Stephanie, 25

关于c++ - 如何删除链表中的特定节点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73914499/

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