Ошибка сегментации при удалении полного связанного списка - PullRequest
0 голосов
/ 30 сентября 2010

Я пытаюсь удалить весь связанный список, но получаю ошибку сегментации и не могу определить, в чем реальная проблема.Когда я попытался отладить с помощью GDB, он может удалить первый узел, но выбросить ошибку сегментации при удалении второго узла.Пожалуйста, предложите мне, в чем может быть причина.

#include <iostream>
using namespace std;
class listNode
{
public:

    listNode *next;
    char data;

    listNode ()
    {
        next = NULL;
        data = '\0';
    }

    listNode (char alphabet)
    {
        next = NULL;
        data = alphabet;
    }

    ~listNode ()
    {
        delete next;

    }
};


class linkedList
{
public:

    listNode *head;
    void insert (listNode * node);
    trieNode *search (char alphabet);

    linkedList ();
    ~linkedList ();
    void printList ();

private:
    void deleteCompleteList ();

};

int
main ()
{
    linkedList testList;
    for (int i = 0; i < 10; i++)
    {
      listNode *temp = new listNode ('a' + i);
      testList.insert (temp);
    }

  testList.printList ();


}


linkedList::linkedList ()
{
  linkedList::head = NULL;
}

linkedList::~linkedList ()
{
  linkedList::deleteCompleteList ();
}

void
linkedList::printList ()
{
  listNode *temp = head;
  while ( temp )
  {
          cout << temp->data << endl;
          temp = temp->next;
  }

}

void
linkedList::insert (listNode *node)
{
    node->next = head;
    head = node;
}

trieNode *
linkedList::search (char alphabet)
{
    listNode *temp = head;
    while (temp)
    {
        if (temp->data == alphabet)
            return temp->down;
        temp = temp->next;
    }

    return NULL;
}

void
linkedList::deleteCompleteList ()
{
    listNode *temp ;
    while ( head )
    {
        temp = head;
        head = head->next;
        delete temp;
    }
}

Ответы [ 2 ]

4 голосов
/ 30 сентября 2010

Потому что в listNode d'tor он удаляет следующий узел. Таким образом, когда идет удаление второго узла в списке, он уже удален.

~listNode ()
{
    delete next;
}

Измените его на ...

~listNode ()
{
}
1 голос
/ 30 сентября 2010

Вы удаляете head->next дважды; один раз в деструкторе listNode и один раз в цикле.

...