我正在尝试构建一个模拟服务中心的客户列表类。我的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指针应指向被删除节点之后的节点。相反,当我在链接列表中显示节点时,头部出现后的任何节点都指向垃圾数据。
答案 0 :(得分:0)
@Richard Chambers的回答是正确的。您需要设置“ previous_node”的“ next_node”而不是“ previous_node”。
if (node_ptr)
{
previous_node->next_node = node_ptr->next_node;
delete node_ptr;
}