Odzilla
11-07-2005, 23:44
Hi,
ich habe eine verkettete Liste, die eine Datenklasse aufnimmt.
Die Glieder der Liste tragen zwei Zeiger: einen auf das vorherige und einen auf das nächste Glied.
cNode * myNext;
cNode * myLast;
Wenn ich jetzt ein Glied der Kette löschen will, setze ich zuerst die Zeiger, die auf dieses Glied zeigen (aus dem vorherigen und dem nächsten Glied) entsprechend.
myNext->myLast=myLast;
myLast->myNext=myNext;
Jetzt wäre das Glied aus der Kette gelöst und ich könnte es zerstören.
Das Problem ist nur, dass wann immer ich myNext oder myLast modifizieren will, ein Segmentation Fault ausgelöst wird. Selbst myNext=NULL; funktioniert nicht.
Das passiert aber nicht nur beim Modifizieren der beiden Zeiger, sondern auch beim Zugriff auf Memberfunktionen des nächsten/vorherigen Glieds. Hierbei funktionieren manche ... andere lösen ebenfalls einen Segmentation Fault aus.
Irgendwie kommt mir das ein wenig komisch vor ^^
Die BasisKlasse für die verkettete Liste:
class cNode
{
public:
cNode() {}
virtual ~cNode() {}
virtual cNode * Insert(cMyData * theData) = 0;
virtual void Show() = 0;
virtual cMyData * Search(cMyData * theData) = 0;
virtual void Run() {}
virtual void Run( cMyParse * test ) {}
virtual void Parse( cMyParse * test ) {}
virtual void Reset() {}
virtual void Del( cMyData * theData ) {}
void SetMyNext ( cNode * next ) {myNext = next;}
void SetMyLast ( cNode * last ) {myLast = last;}
cNode * GetMyNext () { return myNext; }
cNode * GetMyLast () { return myLast; }
cMyData * GetMyData () { return theData; }
void Destroy();
protected:
cNode * myNext;
cNode * myLast;
cMyData * theData;
};
Die Destroy() Funktion:
void cNode::Destroy()
{
myLast->SetMyNext(myNext);
myNext->SetMyLast(myLast);
}
Ich hoffe, das war in etwa verständlich :)
Wahrscheinlich hab ich eh nur wieder irgendwas dämliches vergessen, ärger mich aber schon den halben Tag damit rum ^^
ich habe eine verkettete Liste, die eine Datenklasse aufnimmt.
Die Glieder der Liste tragen zwei Zeiger: einen auf das vorherige und einen auf das nächste Glied.
cNode * myNext;
cNode * myLast;
Wenn ich jetzt ein Glied der Kette löschen will, setze ich zuerst die Zeiger, die auf dieses Glied zeigen (aus dem vorherigen und dem nächsten Glied) entsprechend.
myNext->myLast=myLast;
myLast->myNext=myNext;
Jetzt wäre das Glied aus der Kette gelöst und ich könnte es zerstören.
Das Problem ist nur, dass wann immer ich myNext oder myLast modifizieren will, ein Segmentation Fault ausgelöst wird. Selbst myNext=NULL; funktioniert nicht.
Das passiert aber nicht nur beim Modifizieren der beiden Zeiger, sondern auch beim Zugriff auf Memberfunktionen des nächsten/vorherigen Glieds. Hierbei funktionieren manche ... andere lösen ebenfalls einen Segmentation Fault aus.
Irgendwie kommt mir das ein wenig komisch vor ^^
Die BasisKlasse für die verkettete Liste:
class cNode
{
public:
cNode() {}
virtual ~cNode() {}
virtual cNode * Insert(cMyData * theData) = 0;
virtual void Show() = 0;
virtual cMyData * Search(cMyData * theData) = 0;
virtual void Run() {}
virtual void Run( cMyParse * test ) {}
virtual void Parse( cMyParse * test ) {}
virtual void Reset() {}
virtual void Del( cMyData * theData ) {}
void SetMyNext ( cNode * next ) {myNext = next;}
void SetMyLast ( cNode * last ) {myLast = last;}
cNode * GetMyNext () { return myNext; }
cNode * GetMyLast () { return myLast; }
cMyData * GetMyData () { return theData; }
void Destroy();
protected:
cNode * myNext;
cNode * myLast;
cMyData * theData;
};
Die Destroy() Funktion:
void cNode::Destroy()
{
myLast->SetMyNext(myNext);
myNext->SetMyLast(myLast);
}
Ich hoffe, das war in etwa verständlich :)
Wahrscheinlich hab ich eh nur wieder irgendwas dämliches vergessen, ärger mich aber schon den halben Tag damit rum ^^