我想從鏈表中刪除某個元素(這是一個數字列表)。 當我找到正確的數字時,我檢查前面的元素是否爲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 << " ";
在寫功能。
沒有調用刪除舊命令,它一切正常。
delete old正在聲明一個名爲old的類型爲delete的變量。它不是一個方法調用。如果你想刪除舊的,應該刪除(舊); – Magn3s1um
@ Magn3s1um編號'delete'是C++中的一個操作符。 '刪除舊的;'是正確的。 – Casey
@ Magn3s1um:這並非完全正確。 '刪除舊的'和'刪除(舊的)'是一回事。 –