2013-08-16 40 views
0

我想從鏈表中刪除某個元素(這是一個數字列表)。 當我找到正確的數字時,我檢查前面的元素是否爲NULL。如果是,它是列表的頭部,我只是移動該指針,如果不是,我重新鏈接元素,以便前一個元素指向要刪除的元素的下一個元素。現在這個程序爲什麼會因爲刪除命令而中斷?

,這工作得很好,除非我uncoment以下命令:

delete old; 

現在,舊是指向需要刪除的元素的指針。 我想刪除元素,而不僅僅是重新鏈接列表。

// zag.h - header file 
#ifndef _zag_h_ 
#define _zag_h_ 

#include <iostream> 
using namespace std; 

struct Elem { 
int n; 
Elem* next; 

Elem(int bbr,Elem* nex = NULL){n = bbr; next = nex;} 
~Elem(){delete next;} 
}; 

class Lista { 
Elem* head; 

public: 

Lista(){ 
    head=NULL; 
} 

~Lista(){ 
} 

void put(int broj){ 
    Elem* temp = new Elem(broj); 

    Elem* n0 = NULL; 
    Elem* n1 = head; 

    while(n1!=NULL && temp->n >= n1->n){ 
     n0 = n1; 
     n1 = n1->next; 
    } 

    if(n0 == NULL){ 
     temp->next=head; 
     head = temp; 
    } 

    else { 
     n0->next = temp; 
     temp->next = n1; 

     //if(n1==NULL)tail=temp; 
    } 
    //cout << head->n << endl; 
} 

void remove(int num){ 
    Elem* n1 = head; 
    Elem* n0 = NULL; 

    while(n1!=NULL && n1->n!= num){ 
     n0 = n1; 
     n1 = n1->next; 
    } 


    if(n0 == NULL){ 
     Elem* old = n1; 
     head = head->next; 
     n1 = n1->next; 
     delete old; 
    } 

    else { 
     Elem* old = n1; 
     n1 = n1->next; 
     n0->next = n1; 
     cout << old->n; 
     delete(old); 
    } 


}//remove 

void write(){ 
    Elem* temp = head; 
    while(temp){ 
     cout << temp->n << " "; 
     temp = temp->next; 
    } 
    cout<<endl; 

} //ispisi 
}; 

#endif 


// main.cpp file 
#include "zaglavlje.h" 
#include <iostream> 
using namespace std; 

void main(){ 
cout << "Welcome " << endl; 

Lista* l = new Lista(); 

l->put(4); 
l->put(2); 
l->put(8); 
l->put(7); 
l->put(6); 
l->put(9); 
l->put(11); 
l->put(15); 
l->put(17); 
l->put(2); 
l->put(1); 

l->write(); 

l->remove(11); 
//l->remove(2); 
//l->remove(2); 
//l->remove(11); 
//l->remove(15); 


cout << "ispisujemo elemente liste nakon brisanja" << endl; 
l->ispisi(); 
} 

所以,我插入列表中的某些元素,寫列表中的元素(這一切似乎做工精細),然後我調用一個函數來刪除一個元素。在此之後,當我嘗試寫清單(檢查元素是否真的刪除)我得到以下錯誤:

An unhandled win32 exception occurred in test.exe 

和調試點線

cout << temp->n << " "; 

在寫功能。

沒有調用刪除舊命令,它一切正常。

+0

delete old正在聲明一個名爲old的類型爲delete的變量。它不是一個方法調用。如果你想刪除舊的,應該刪除(舊); – Magn3s1um

+4

@ Magn3s1um編號'delete'是C++中的一個操作符。 '刪除舊的;'是正確的。 – Casey

+0

@ Magn3s1um:這並非完全正確。 '刪除舊的'和'刪除(舊的)'是一回事。 –

回答

0

當你的列表是空的,您試圖訪問反正「第一」元素:

if (n0 == NULL && n1 == NULL) 
{ 
    // empty list, do nothing 
} 
else if (n0 == NULL && n1 != NULL) 
{ 
    Elem* old = n1; 
    head = head->next; 
    n1 = n1->next; 
    delete old; 
} 
else 
{ 
    Elem* old = n1; 
    n1 = n1->next; 
    n0->next = n1; 
    delete old; 
} 

當您刪除在當前的代碼中刪除的,您把內存分配,讓你贏了」當您訪問不正確時,會導致訪問衝突。當您將它們添加回來時,您正在訪問列表爲空時不再分配的內存。

這也將是一個問題,當你第一次運行的程序是head未初始化。

+0

我向列表中添加元素(請參閱我更新的問題以完整代碼),然後嘗試刪除某個元素。我收到一個填充列表的錯誤。 – idjuradj

+0

您正在刪除Elem析構函數和'list :: remove'中的'next'。也就是說,當你刪除項目N時,你設置N-1指向N + 1,然後刪除N,並且在析構函數中刪除N也刪除N + 1。 –

+0

該死!我不知道我錯過了elem析構函數中的下一個刪除操作。 – idjuradj

相關問題