C++ 单链表不工作(C+;+;)
下面的代码构建正确,但在运行时导致程序崩溃。谁能告诉我有什么问题吗。我怀疑DeleteNode函数有问题C++ 单链表不工作(C+;+;),c++,linked-list,C++,Linked List,下面的代码构建正确,但在运行时导致程序崩溃。谁能告诉我有什么问题吗。我怀疑DeleteNode函数有问题 #include <iostream> #include <cstdlib> using namespace std; class list { private: typedef struct node { int data; node* next; }* nodePtr; //this means that 'n
#include <iostream>
#include <cstdlib>
using namespace std;
class list {
private:
typedef struct node {
int data;
node* next;
}* nodePtr; //this means that 'nodePtr' will mean a pointer to the struct node
nodePtr head;
nodePtr current;
nodePtr temp;
public:
list() { //constuctor
head = NULL;
current = NULL;
temp = NULL;
};
void AddNode(int addData) //to add a particular data value
{
nodePtr n= new node;
n->next = NULL;
n->data = addData;
if (head != NULL) { //if a list is already set up
current = head;
while (current->next != NULL) { //to get to the last node in the list
current = current->next;
}
current->next = n;
}
else { // if list is not created
head = n; //new node is front of the list
}
}
void DeleteNode(int delData) //to delete a particular data value
{
nodePtr delPtr = NULL;
temp = head;
current = head;
while (current != NULL && current->data!=delData) { //pass through whole list && find value
temp = current;
current = current->next;
}
if (current = NULL) { //data value not found in list
cout << delData << " was not in the list." << endl;
delete delPtr; //to free up memory space
}
else {
delPtr = current;
current = current->next;
temp->next = current; //to reconnect list
if (delPtr == head) {
head = head->next;
temp = head;
}
delete delPtr;
cout << "The value " << delData << "was deleted." << endl;
}
}
void PrintList() //to print all the data values
{
current = head;
while (current != NULL) { //to go through the data valued of the list
cout << current->data << endl;
current = current->next;
}
}
};
int main()
{
list Shahzad;
Shahzad.AddNode(2);
Shahzad.AddNode(78);
Shahzad.AddNode(28);
Shahzad.AddNode(2398);
Shahzad.DeleteNode(78);
Shahzad.PrintList();
return 0;
}
#包括
#包括
使用名称空间std;
班级名单{
私人:
类型定义结构节点{
int数据;
节点*下一步;
}*nodePtr;//这意味着'nodePtr'将表示指向结构节点的指针
无受体头;
无受体电流;
nodePtr温度;
公众:
list(){//constructor
head=NULL;
电流=零;
温度=零;
};
void AddNode(int addData)//添加特定数据值
{
nodePtr n=新节点;
n->next=NULL;
n->data=addData;
if(head!=NULL){//如果已经设置了列表
电流=水头;
while(current->next!=NULL){//以到达列表中的最后一个节点
当前=当前->下一步;
}
当前->下一步=n;
}
else{//如果未创建列表
head=n;//新节点位于列表的前面
}
}
void DeleteNode(int delData)//删除特定数据值
{
nodePtr delPtr=NULL;
温度=水头;
电流=水头;
while(current!=NULL&¤t->data!=delData){//遍历整个列表并查找值(&F)
温度=电流;
当前=当前->下一步;
}
如果(current=NULL){//在列表中找不到数据值
下一步;
温度=水头;
}
删除delPtr;
cout在delete函数中,如果找不到节点,则删除delPtr
但是,delPtr从未被实例化或分配,因此您试图删除一些不存在的内容
始终在if语句中包含指针删除以避免此问题。请尝试以下操作:
if (delPtr) delete delPtr;
首先,很少有代码和文件管理备注:考虑将代码分为<代码> .H>代码>文件,其中声明类成员和<代码> .CPP 类成员被实现,这将使您的类易于理解,并且可能的错误更容易找到。
第二,处理包含指针的结构的一般建议是注意适当的资源管理,即指针定义、初始化和删除应谨慎处理。如果您是新手,请考虑使用已提供的智能指针工具,如:“通过指针保留对象的唯一所有权,并在
唯一\u ptr
超出范围时销毁该对象”
第三,使用调试器消除一些小错误,如:
if (current = NULL)
顺便说一句,使用NULL
而不是指针文本nullptr
表示的额外不准确
最后,在完成初始实现后,分别检查每个成员函数,然后再继续进行进一步的类扩展,否则您将面临来自多个源的错误累积的风险,这将使您的工作非常困难
您的第一个问题是以下行:
if (current = NULL)
实际上,此时您正在将null
赋值给current
这实际上应该是:
if (current == NULL)
除了这里的所有建议之外,您还可以使用一些安全的编程实践来尽早捕获bug
例如:你写的
if (current = NULL)
相反,尝试在LHS上写入正在检查的值,在RHS上写入变量,如下所示:
if ( NULL == current)
这里,如果你打错了
if (NULL = current)
编译器会抱怨。您现在有一个编译时错误,而不是运行时错误。这更容易查找和调试。欢迎使用堆栈溢出!听起来您可能需要学习如何使用调试器来逐步完成代码。有了一个好的调试器,您可以逐行执行程序,并查看它与代码的偏差您期待。如果您要进行任何编程,这是一个必不可少的工具。进一步阅读:解决此类问题的正确工具是调试器。在询问堆栈溢出问题之前,您应该逐行检查代码。有关更多帮助,请阅读。至少,您应该[编辑]您的问题包括一个重现您的问题的示例,以及您在调试器中所做的观察。我没有全部阅读,但是if(current=NULL)
这也不太好,只需使用std::forward_list
而不是自己重新滚动。如果这是一项自己完成的任务,你至少可以通过使用std::unique_ptr
来管理内存,而不必担心删除错误。这当然不会导致问题,谁教你的因此?if(delPtr)delete delPtr;
是多余的。delete
与nullptr
透明地工作。