carlos1976
Grünschnabel
Hallo zusammen und noch ein frohes Neues!
Ich habe ein Problem damit, eine doppelt verkettete Liste umzuorden.
Liste----A-----B-----C----D soll später folgendes Aussehen haben:
Liste----B-----D-----A----C
Das Umsortieren soll nur durch Verschieben der Zeiger erfolgen (aso kein Löschen oder Einfügen nötig).
Jedes Element der Liste besitzt neben den Daten noch einen Next- und prev-Zeiger zum Nachfolger/Vorgänger.
first->__ A-----------B---------C----------D
______Next____Next___Next___Next --> Null
null<-__prev____prev___ prev___prev
first verweist auf das erste Listelement der Sequenz. Next ist Teil des Listenelements und verweist auf den jeweiligen Nachfolger bzw. ist NULL für das letzte Listenelement. Der prev-Zeiger verweist auf das vorhergehende Listenelementbei dem ersten Element der Liste wird prev auf NULL gesetzt.
Wie schaffe ich es mit den beiden Funktionen (s.u.) die Elemente an das Ende/den Anfang zu verschieben?
Ich habe ein Problem damit, eine doppelt verkettete Liste umzuorden.
Liste----A-----B-----C----D soll später folgendes Aussehen haben:
Liste----B-----D-----A----C
Das Umsortieren soll nur durch Verschieben der Zeiger erfolgen (aso kein Löschen oder Einfügen nötig).
Jedes Element der Liste besitzt neben den Daten noch einen Next- und prev-Zeiger zum Nachfolger/Vorgänger.
first->__ A-----------B---------C----------D
______Next____Next___Next___Next --> Null
null<-__prev____prev___ prev___prev
first verweist auf das erste Listelement der Sequenz. Next ist Teil des Listenelements und verweist auf den jeweiligen Nachfolger bzw. ist NULL für das letzte Listenelement. Der prev-Zeiger verweist auf das vorhergehende Listenelementbei dem ersten Element der Liste wird prev auf NULL gesetzt.
Wie schaffe ich es mit den beiden Funktionen (s.u.) die Elemente an das Ende/den Anfang zu verschieben?
Code:
//Element ans Ende schieben
void List::moveToEnd(ListElem* elemMove)
{
if(!isEmpty())
{
if ( elemMove != NULL )
{
//Zwei neue Pointer: Der Vorgänger des zu verschiebenden...
ListElem* elemPrev = elemMove->getPrev();
//...und der Nachfolger
ListElem* elemNext = elemMove->getNext();
//
}
}
}
//Element an den Anfang schieben
void List::moveToFront(ListElem* elemMove)
{
//Wenn die Liste nicht leer ist...
if (!isEmpty())
{
//Kann eigentlich nicht passieren, aber sicher ist sicher...
if ( elemMove != NULL )
{
//Zwei neue Pointer: Der Vorgänger des zu verschiebenden...
ListElem* elemPrev = elemMove->getPrev();
//...und der Nachfolger
ListElem* elemNext = elemMove->getNext();
//
}
}
}