c++ - deleteNode 函数似乎破坏了连接列表
问题描述
我正在尝试构建一个模拟服务中心的客户列表类。我的 deleteNode 函数只会正确删除列表的头部而不会破坏链接。
我尝试过绘制链表图表并手动跟踪程序,但在纸上,这对我来说似乎是正确的。问题似乎在 else 语句中的某个地方,但我无法确定在哪里。
#include <string>
using namespace std;
class CustomerList
{
private:
// structure to represent customer as a node
struct CustomerNode
{
unsigned int sequence_number{};
string name{}, service_required{};
int month{}, day{}, year{}, hour{}, minute{};
struct CustomerNode* next_node{ nullptr };
};
// Pointers to first and last node in the linked list
CustomerNode* head;
CustomerNode* last_node;
public:
CustomerList();
// Class member functions
void insertNode(string, string, int, int, int, int, int);
void deleteNode(string);
void serveCustomer();
void listAll();
~CustomerList();
};
void CustomerList::deleteNode(string name)
{
CustomerNode* node_ptr;
CustomerNode* previous_node;
if (!head)
{
cout << "The list is empty." << endl;
return;
}
if (head->name == name)
{
node_ptr = head->next_node;
delete head;
head = node_ptr;
}
else
{
node_ptr = head;
while (node_ptr != nullptr && node_ptr->name != name)
{
previous_node = node_ptr;
node_ptr = node_ptr->next_node;
}
if (node_ptr)
{
previous_node = node_ptr->next_node;
delete node_ptr;
}
}
}
如果我有多个节点并删除一个节点,则只应删除该节点。结构中的 next_node 指针应该指向被删除节点之后的节点。相反,当我在链表中显示节点时,头部之后的任何节点似乎都指向垃圾数据。
解决方案
@Richard Chambers 的答案是正确的。您需要设置“previous_node”的“next_node”而不是“previous_node”。
if (node_ptr)
{
previous_node->next_node = node_ptr->next_node;
delete node_ptr;
}
推荐阅读
- angular5 - 如何在角度 4/5/6 中跟踪用户活动
- ios - auth0 登录问题“我们很抱歉,尝试登录时出现问题。” 错误 403 无效状态
- npm - 如何在 joi 验证中应用 .OR
- java - 无状态 AjaxFallbackButton?
- javascript - JavaScript - 获取元素的所有父元素
- maven - 在 pom 文件中打包的实用程序是什么?可以采取包装的价值观是什么,它们的含义是什么?
- c# - C# 将程序集类转换为类型
- android - Android GcmListenerService 在 OPPO 设备的应用程序后台不起作用
- java - RxJava2 中的 Dematerialize 只返回 Object 类型 Observable
- javascript - 在 export const 中访问 Vue 实例