链接列表程序在销毁节点时崩溃

时间:2016-10-31 02:57:52

标签: c++ linked-list

我有一个简单的destructor方法可以销毁每个节点,但我遇到了一些问题。每当我尝试从链表中删除一个项目时,该元素都会被删除,但之后所有以下元素也会被删除。如果我尝试打印或添加更多元素,我的程序会崩溃。崩溃后,我的文本编辑器会突出显示我的PrintNode方法。

这是我的destructor方法:

Node::~Node() {
  delete next;
}

我正在使用此方法从列表中删除元素:

Node*Node::DeleteNode(Node *head, string a) {
    if (head == NULL) return head;
    head->next = DeleteNode(head->next, a);
    if (head->get()==a) {
       Node* temp = head->next;
       next = NULL;
       delete head;
       return temp;
     }
    else {
       return head;
    }
}

然后我做了一个简单的打印:

void Node::PrintNode() {
    cout << name << endl;
    if (next) { 
      next->PrintNode();
    }
 }

为什么我的析构函数会导致我的程序崩溃?

2 个答案:

答案 0 :(得分:0)

您只需删除节点,而不是指向它的链接。试试这个。

  <select>
    {% for product in products %}
      <option value="{{ product.id }}">{{ product.name}}</option>
      <div class="error">{{ form.product.id.errors }}</div>
    {% endfor %}
  </select>

  <select name="product">
    {% for product in products %}
      <option value="{{ product.id }}">{{ product.name}}</option>
      <div class="error">{{ form.product.id.errors }}</div>
    {% endfor %}
  </select>

删除      删除下一步;

从析构函数中,它应该保持为空,编译器会在你使用时自动调用它 删除并删除该节点,但您还应删除指向该节点的链接,以便写入

delete head;
 head=NULL;
行后

head=NULL;

答案 1 :(得分:0)

首先,即使搜索字符串位于第一个节点,它也总是会有n个递归调用,n个赋值。

Node*Node::DeleteNode(Node *head, string a) {
    if (head == NULL) return head;
    head->next = DeleteNode(head->next, a); // n calls, n assignments
    if (head->get()==a) {
       Node* temp = head->next;
       next = NULL;  
       delete head;
       return temp;
     }
    else {
       return head;
    }
}

可能存在问题:

Node::~Node() {
  if(next) {
    delete next;
  }
}