Очистка односвязного списка - PullRequest
1 голос
/ 23 февраля 2012

Я не могу понять, где моя проблема, но я не могу очистить этот односвязный список. Я перепробовал все, что мог придумать. Я тестирую его со списком с одним элементом (на самом деле это хеш-таблица связанных списков), но я не могу заставить работать мою функцию "erase ()" (она очистит весь список и удалит каждый узел). Если вы можете взглянуть на это и указать мне правильное направление.

Структура узла

struct Node
{
    string m_str;
    Node *m_pNext;
    Node(void) {m_pNext = NULL;}
};
    Node *m_pHead;

Функция стирания

Void LLString::erase (void){
if (!m_pHead)
{
    return;
}

Node *temp = m_pHead;

while (temp)
{
    temp = m_pHead;      // The error allways shoes up around her
    if (temp->m_pNext)   // It has moved around a little as I have tried
    {                    // different things.  It is an unhanded exception
        m_pHead = temp->m_pNext;
    }
    temp->m_pNext = NULL;
    delete temp;
    }
}

Моя функция добавления

void LLString::add (string str)
{
Node *nNode = new Node;
nNode -> m_str = str;
nNode ->m_pNext = m_pHead;
m_pHead = nNode;
}

И единственная другая функция, которую я сейчас использую с программой, - эта функция отправляет все в файл. (используется непосредственно перед функцией стирания)

void LLString::toFile (void)
{
ofstream fout;
fout.open ("stringData.txt",ios::app);

Node* temp = m_pHead;
while (temp)
{
    fout << temp->m_str << endl;
    temp = temp->m_pNext;
}
fout.close();
}

Опять же, если у вас есть идея, почему это удаление не работает, укажите мне.

Спасибо

Ответы [ 3 ]

2 голосов
/ 24 февраля 2012

простая рекурсивная функция:

void erase(Node *n)
{
  if (n)
  {
    erase(n->m_pNext);
    delete(n);
  }
}
2 голосов
/ 23 февраля 2012

проблема в том, что вы никогда не позволите m_pHead null, поэтому ваш temp также не будет иметь значение null, а цикл никогда не завершится и не приведет к двойному удалению.

Я изменил ваш код, который, кажется, работает нормально.

    void erase (){
    if (!m_pHead)
    {
        return;
    }

    Node *temp = m_pHead;
    while (temp)
    {
        m_pHead = temp->m_pNext;
        delete temp;
        temp = m_pHead;
    }
}
0 голосов
/ 23 февраля 2012
 Node *m_pHead = NULL;

Функция стирания:

Void LLString::erase (void)
{
if (m_pHead==NULL)
{
    return;
}

Node *temp = m_pHead;

while (temp->m_pnext!=NULL)
{
   m_pHead = temp->m_pNext;
   delete temp;
   temp = m_pHead;
}
delete temp;
m_pHead = NULL;
}
...