Come visualizzare un elenco ordinato doppiamente collegato all'indietro?[Chiuso]
-
12-12-2019 - |
Domanda
Sto lottando con questo.Sono riuscito a visualizzare la maggior parte dell'elenco, ma uno degli 1 non viene visualizzato e non riesco a capire come risolverlo.
Ecco il codice rilevante, credo.
La mia funzione di inserimento:
template <class T>
void DoublyLinkedList<T>::insert(T data)
{
DoublyLinkedList<T> *newNode, *tmp, *oneBefore;
newNode = new DoublyLinkedList(data);
if (mNext == NULL)
mNext = newNode;
else
{
oneBefore = mNext;
tmp = mNext;
while (tmp != NULL && tmp->mData < data)
{
oneBefore = tmp;
tmp = tmp->mNext;
}
if (tmp == mNext)
{
newNode->mNext = mNext;
mNext = newNode;
}
else
{
oneBefore->mNext = newNode;
newNode->mNext = tmp;
newNode->mPrevious = oneBefore;
}
}
}
La mia funzione displayBackwards:
void displayBackward(DoublyLinkedList<int> *ptr)
{
DoublyLinkedList<int> *tmp;
tmp = ptr;
while (tmp != NULL)
{
cout << tmp->getData() << endl;
tmp = tmp->getPrevious();
}
}
E la parte rilevante della mia funzione principale:
DoublyLinkedList<int> *ptr, *head, *tail;
ptr = new DoublyLinkedList<int>;
cout << "Testing Insert\n";
ptr->insert(1);
ptr->insert(2);
ptr->insert(3);
ptr->insert(1);
tail = ptr;
while (tail->getNext() != NULL)
tail = tail->getNext();
cout << "\n\nTesting displayBackward\n";
displayBackward(tail);
Il mio output attualmente è:
Testing displayBackward
3
2
1
Soluzione
Questo codice è il problema (nella funzione di inserimento)
if (tmp == mNext)
{
newNode->mNext = mNext;
mNext = newNode;
}
Hai bisogno
if (tmp == mNext)
{
newNode->mNext = mNext;
mNext->mPrevious = newNode;
mNext = newNode;
}
Il tuo codice originale funzionerà nei casi tranne quando provi a inserire dati inferiori o uguali ai dati nel tuo primo nodo corrente.
Inoltre, presumo che il tuo costruttore inizializzi mNext e mPrevious su NULL.In caso contrario, avrai altri problemi.
Altri suggerimenti
template <class T>
void DoublyLinkedList<T>::insert(T data)
{
DoublyLinkedList<T> *newNode, *tmp, *oneBefore;
newNode = new DoublyLinkedList(data);
if (mNext == NULL)
mNext = newNode;
else
Questo non collega il puntatore indietro del nuovo nodo.
Potrebbero esserci anche altri errori nel tuo codice.
Un modo semplice per codificare un elenco doppiamente collegato è quello di
- distinguere tra elenco E nodo tipo e
- fai in modo che ogni lista abbia sempre un nodo fittizio, chiamato a nodo di intestazione.
In questo modo non avrai n NULL
indicazioni da affrontare.
Semplifica davvero le cose.