2012-02-23 17 views
1

問題がどこにあるのかわかりませんが、この単独リンクリストをクリアできません。私は私が考えることができるすべてについて試みました。私は1つの要素(実際にはリンクされたリストのハッシュテーブル)でリストをテストしていますが、私の "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; 
    } 
} 

マイadd関数

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(); 
} 

を(右消去機能の前に使用)。

おかげ

答えて

2

簡単な再帰関数:私はもともと私のコードとして持っていたものだが、それは次のエラーを与える

void erase(Node *n) 
{ 
    if (n) 
    { 
    erase(n->m_pNext); 
    delete(n); 
    } 
} 
+0

'if'以外の文の代わりに' else'を持っているのですか?それが唯一の立場にあるので、 'delete'を' NULL'と呼ぶと思います。 – Flexo

+0

回答を更新しました – 2r2w

2

問題は、あなたの一時もnull取得していないとwhileループを終了しないと二重欠失を引き起こす決してないですので、あなたがm_pHeadヌルをさせないことです。

コードを修正しましたが、正常に動作しているようです。

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

    Node *temp = m_pHead; 
    while (temp) 
    { 
     m_pHead = temp->m_pNext; 
     delete temp; 
     temp = m_pHead; 
    } 
} 
+0

---未処理hw5_hash.exeの0x010f9531の例外:0xC0000005:0xfdfdfe1dの場所を読み取っているアクセス違反。 --- コンパイルを開始しますが、行で停止します - m_pHead = temp-> m_pNext; - あなたはその原因を知っていますか? –

0
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; 
} 
+0

まだ同じエラーがあります(temp-> m_pNext!= NULL) - temp-> m_pNextをチェックすることはできません。私はなぜそれを理解することはできません。 –

+0

私は、コードには何かエラーがあるとは思わない、それはコード以外のものでなければならない。どのコンパイラを使用していますか? –

+0

structの代わりにクラスとして実装してみてください。その解決策ではなく、ちょっとしたことを試してみてください。 –