2012-02-23 90 views
1

我無法弄清楚我的問題在哪裏,但我無法清除這個單獨鏈接的列表。我嘗試過所有我能想到的事情。我測試它與一個元素的列表(實際上是一個鏈表的哈希表),但我不能讓我的「擦除()」功能工作(它會清理整個列表並刪除每個節點)。如果你可以看看這個,並指向正確的方向。清除單個鏈接列表

節點結構

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

與此同時,如果你有任何想法,爲什麼刪除不工作,請指出來給我。

感謝

回答

2

簡單的遞歸函數:

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

你的意思是在那裏有'else'而不是'if'之外的語句嗎?就目前來看,你會稱'delete'爲'NULL'。 – Flexo 2012-02-24 21:06:01

+0

我已經更新了答案 – 2r2w 2012-02-25 07:20:56

2

問題是,你永遠不會讓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; - 你知道會導致什麼嗎? – 2012-02-23 05:10:57

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

在 - while(temp-> m_pNext!= NULL)時仍然出現同樣的錯誤 - 它不會讓我檢查temp-> m_pNext。我不明白爲什麼。 – 2012-02-23 07:47:49

+0

我不認爲代碼中有任何錯誤,它必須是代碼以外的東西。你在用什麼編譯器? – 2012-02-23 07:51:36

+0

嘗試實現它作爲類而不是結構。它不是一個解決方案,而是嘗試不同事情的一個暗示。 – 2012-02-23 07:52:38