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
È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top