C ++双链表(删除第一个节点导致崩溃)

时间:2017-04-05 15:27:35

标签: c++ data-structures linked-list

我正在使用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 崩溃的问题。任何形式的帮助或想法将不胜感激。非常感谢。

0 个答案:

没有答案