我正在使用C ++构建一个双向链表,并且我已经启动并运行了基本的链和节点结构 -
节点有2个指针 - 一个用于左边一个用于右边 - 一个整数用于要保存的数据。包含构造函数和析构函数,格式如下:
Node(const int e, Node* left, Node* right)
The Chain有4个我正在尝试实现的功能: InsertBack , InsertAfter ,删除和 DeleteAll 。前两个按计划工作,但这里是 InsertBack 的代码,因为我认为它与问题相关(如下所示)。我使用一个名为head
的指针(声明为Node* head = NULL;
)来跟踪第一个节点,并每次从它开始扫描链表。这里的if-else逻辑是确定是否正在创建第一个节点。
void Implement::InsertBack(int num)
{
if(head == NULL){
head = new Node(num, NULL, NULL);
}
else{
Node* tmp = this->head;
while(tmp->right != NULL) {
tmp = tmp->right;
}
tmp->right = new Node(num, tmp, NULL);
}
}
我的问题在于删除和 DeleteAll 导致编译的exe文件在删除第一个节点时崩溃(即我m指向head
)。以下是我的删除的实现,它应该删除从头开始扫描的int num
数据的第一个节点(如果int num
不是,则不执行任何操作实测值):
void Implement::Delete(int num)
{
Node* tmp = this->head;
while(tmp != NULL) {
if(tmp->data != num){
tmp = tmp->right;
}
else{
if(tmp->left == NULL){
head = tmp->right;
delete tmp;
break;
}
else if(tmp->right == NULL){
Node* leftnode = tmp->left;
leftnode->right = NULL;
delete tmp;
break;
}
else{
Node* leftnode = tmp->left;
Node* rightnode = tmp->right;
leftnode->right = rightnode;
rightnode->left = leftnode;
delete tmp;
break;
}
}
}
}
我将它设计为扫描整个循环,当数字不相同时移动到下一个节点,并在找到数字时处理3种不同的情况:(1)如果节点是第一个节点/ (2)如果节点是最后一个节点/(3)如果节点是其中的任何其他节点。在每种情况下,tmp
指针始终指向需要删除的节点。
对于 DeleteAll 功能,我只是在找到具有正确编号的节点后,只需更改删除即可继续扫描。到目前为止它在所有输入上失败了;代码如下所示:
void Implement::DeleteAll(int num)
{
Node* tmp = this->head;
while(tmp != NULL) {
if(tmp->data != num){
tmp = tmp->right;
}
else{
if(tmp->left == NULL){
Node* rightnode = tmp->right;
head = tmp->right;
delete tmp;
Node* tmp = rightnode;
}
else if(tmp->right == NULL){
Node* leftnode = tmp->left;
leftnode->right = NULL;
delete tmp;
break;
}
else{
Node* leftnode = tmp->left;
Node* rightnode = tmp->right;
leftnode->right = rightnode;
rightnode->left = leftnode;
delete tmp;
Node* tmp = rightnode;
}
}
}
}
我无法弄清楚导致删除和 DeleteAll 崩溃的问题。任何形式的帮助或想法将不胜感激。非常感谢。