2012-02-23 3 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

'if' 외부의 문장 대신에'else'가 있다는 것을 의미합니까? 그것이 의미하는대로'delete'를 호출하는 유일한 방법은'NULL'입니다. – Flexo

+0

답변을 업데이트했습니다. – 2r2w

2

문제는 임시도 null하지 루프 동안 종료하지 않고 이중 삭제의 원인이 결코 않습니다 그래서 당신이 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

구조체 대신 클래스로 구현하십시오. 그 해결책이 아니라 단지 다른 것들을 시도하는 suggetion. –