C++ deleteNode函数显示为断开连接列表
我正在尝试构建一个模拟服务中心的customer list类。我的deleteNode函数只会正确删除列表的标题,而不会中断链接 我试过画链表的图表,并用手追踪程序,但在纸上,我觉得它是正确的。问题似乎在else语句中的某个地方,但我无法指出具体位置C++ deleteNode函数显示为断开连接列表,c++,linked-list,C++,Linked List,我正在尝试构建一个模拟服务中心的customer list类。我的deleteNode函数只会正确删除列表的标题,而不会中断链接 我试过画链表的图表,并用手追踪程序,但在纸上,我觉得它是正确的。问题似乎在else语句中的某个地方,但我无法指出具体位置 #include <string> using namespace std; class CustomerList { private: // structure to represent customer as a nod
#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();
};
#包括
使用名称空间std;
类客户列表
{
私人:
//将客户表示为节点的结构
结构自定义节点
{
无符号整数序列{};
字符串名称{},需要服务{};
int月{}、日{}、年{}、时{}、分{};
结构CustomerNode*下一个节点{nullptr};
};
//指向链接列表中第一个和最后一个节点的指针
CustomerNode*头;
CustomerNode*最后一个节点;
公众:
客户列表();
//类成员函数
void insertNode(string,string,int,int,int,int,int);
无效删除节点(字符串);
void serveCustomer();
void listAll();
~CustomerList();
};
void CustomerList::deleteNode(字符串名称)
{
CustomerNode*node\u ptr;
CustomerNode*上一个_节点;
如果(!头)
{
cout下一个节点;
删除标题;
head=节点ptr;
}
其他的
{
节点_ptr=头部;
while(node_ptr!=nullptr&&node_ptr->name!=name)
{
上一个_节点=节点_ptr;
node_ptr=node_ptr->next_node;
}
if(节点ptr)
{
上一个\u节点=节点\u ptr->下一个\u节点;
删除节点ptr;
}
}
}
如果我有多个节点,并删除一个节点,则只应删除该节点。结构中的下一个_节点指针应指向删除节点后的节点。相反,当我在链表中显示节点时,头部后面的任何节点都指向垃圾数据。Richard Chambers的答案是正确的。您需要设置“上一个节点”的“下一个节点”而不是“上一个节点”。
if(节点ptr)
{
上一个\u节点->下一个\u节点=节点\u ptr->下一个\u节点;
删除节点ptr;
}
理查德·钱伯斯的答案是正确的。您需要设置“上一个节点”的“下一个节点”而不是“上一个节点”。if(节点ptr)
{
上一个\u节点->下一个\u节点=节点\u ptr->下一个\u节点;
删除节点ptr;
} < /代码> 由于问题是垃圾数据显示在节点被删除的地方,请考虑处理固定节点指针以删除正在删除的节点的代码。是否previous\u node=node\u ptr->next\u node代码>做你需要它做的事?看着我previous\u node=node\u ptr->next\u node代码>应该是previous\u node->next\u node=node\u ptr->next\u node代码>我所知道的调试链表的最好方法是画图。画一张单子。然后,严格按照编码说明,画出移除的每个步骤。当你发现自己在画一些愚蠢的东西时,恭喜你!你发现了这个bug,你可能已经很清楚你需要做什么了。据我所知,在纸上,previous\u node=node\u ptr->next\u node做了我需要它做的事情。把它画出来,我没有发现它的工作方式有任何问题。但是,当我运行程序时,它显然会在删除的节点处中断,除非该节点是头节点。如果我有6个节点并删除第4个节点,则与节点5和6的连接将断开,并显示垃圾邮件数据。此外,我已经尝试过Pyviou-NoTo-> NeXPothNo.NoDEYPPT-> NExtBy节点,但是这会中断程序,并且根本不会运行。因为问题是,在删除节点时显示了垃圾数据,请考虑处理固定节点指针以删除正在删除的节点的代码。是否previous\u node=node\u ptr->next\u node代码>做你需要它做的事?看着我previous\u node=node\u ptr->next\u node代码>应该是previous\u node->next\u node=node\u ptr->next\u node代码>我所知道的调试链表的最好方法是画图。画一张单子。然后,严格按照编码说明,画出移除的每个步骤。当你发现自己在画一些愚蠢的东西时,恭喜你!你发现了这个bug,你可能已经很清楚你需要做什么了。据我所知,在纸上,previous\u node=node\u ptr->next\u node做了我需要它做的事情。把它画出来,我没有发现它的工作方式有任何问题。但是,当我运行程序时,它显然会在删除的节点处中断,除非该节点是头节点。如果我有6个节点并删除第4个节点,则与节点5和6的连接将断开,并显示垃圾邮件数据。此外,我还尝试了previous_node->next_node=node_ptr->next_node,但这会中断程序,根本不会运行。进行更改会导致生成错误。程序将不会启动。我收到一条警告,上面写着“C6001使用未初始化的内存‘previous_node’”。这是编译错误还是警告?如果是警告,您可以忽略它。您可能需要将编译器配置为忽略警告。这只是一个警告。但是,一旦进行了更改,程序将不会运行。如果我按ctrl+F5,将弹出一个框,显示“存在生成错误。是否继续并运行上次成功的生成?”这是在microsoft visual Studio社区中运行的。我不确定这是否会产生影响。你确定没有任何其他错误会阻止成功生成吗?进行更改会导致生成错误。程序将不会启动。我收到一条警告,上面写着“C6001使用未初始化的内存‘previous_node’”。这是编译错误还是警告?如果是警告,您可以忽略它。您可能需要将编译器配置为忽略警告。这只是一个警告。但是,一旦进行了更改,程序将不会运行。如果我按ctrl+F5,会弹出一个框,上面写着“有构建e
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;
}
}
}