W
mathon schrieb:
... ich habe auch versucht zu debuggen,aber ich komme einfach nicht auf den fehler drauf...?
Hallo Matti,
DIE Fehler wäre richtig.
Bitte benutze ganz dringend Initialisierungslisten in Deinen Konstruktoren, dann vergisst man nicht so leicht die Member mit Default-Werten zu belegen. Wie auch hier schon erwähnt.
sequence::sequence()
: head_ptr( 0 )
, tail_ptr( 0 )
, cursor( 0 )
, precursor( 0 )
, many_nodes( 0 )
{
}
sequence::sequence( const sequence& source )
: head_ptr( 0 )
, tail_ptr( 0 )
, cursor( 0 )
, precursor( 0 )
, many_nodes( 0 )
{
//node *tail_ptr; achte darauf keine lokalen Variblen mit gleichen Namen wie Member anzulegen!
list_copy(source.head_ptr, head_ptr, tail_ptr);
many_nodes = source.many_nodes;
start(); // 'cursor' auf begin setzen
}
Du hast vergessen den 'cursor' zu initialisieren, deshalb geht insert immer schief, wenn vorher kein start() aufgerufen wurde.
Bei der insert-Methode sind drei Fälle zu unterscheiden.
1.) der Cursor zeigt auf 'end' (auch bei Liste ist leer)
2.) der Cursor zeigt auf den Anfang, dann ist precursor == 0
3.) der Cursor zeigt irgendwo hin und precursor hat einen gültigen Wert
am Ende der Methode sollte der Cursor auf das zuletzt eingefügte Element zeigen. So ist es jedenfalls im C++-Standard. Das bedeutet auch, dass precursor in insert in keinem Fall verändert wird.
Bei der attach-Methode sind es nur zwei Fälle
1.) Die Liste ist leer
2.) sie ist nicht leer
Hier wird der Cursor und auch precursor gar nicht verändert, es wird lediglich ein Element am Ende angehängt.
Bei attach und insert kannst Du Dir die Schleife mit dem precursor sparen. Er sollte nach Aufruf jeder Funktion immer einen korrekten Wert haben.
Im Zuweisungsopertor hast Du vergessen, den Cursor umzusetzen. Am besten Du rufst dort start() auf.
Gruß
Werner