Reverse-doppelt-link-Liste in C++

Habe ich versucht herauszufinden, wie, um in umgekehrter Reihenfolge durch eine doppelt verknüpfte Liste, aber für einige Grund, in meiner Funktion void reverse() while-Schleife läuft einmal durch und dann stürzt aus irgendeinem Grund. Ein paar Fragen vorneweg, ich bin selbst Lehre mich, mit meinen Brüdern zu helfen. Dies ist nicht der gesamte code, aber ich habe eine display() Funktion druckt alle Knoten chronologisch von start_ptr und einen Schalter, aktiviert bestimmte Funktionen wie

    case 1 : add_end(); break;
    case 2 : add_begin(); break;
    case 3 : add_index(); break;
    case 4 : del_end(); break;
    case 5 : del_begin(); break;
    case 6 : reverse(); break;

Dies ist der geist von meinem code:

#include <iostream>
using namespace std;

struct node
{
    char name[20];
    char profession[20];
    int age;
    node *nxt;
    node *prv;
};

node *start_ptr = NULL;

void pswap (node *pa, node *pb)
{
    node temp = *pa;
    *pa = *pb;
    *pb = temp;
    return;
}

void reverse()
{
    if(start_ptr==NULL)
    {
        cout << "Can't do anything" << endl;
    }
    else if(start_ptr->nxt==NULL)
    {
        return;
    }
    else
    {
        node *current = start_ptr;
        node *nextone = start_ptr;
        nextone=nextone->nxt->nxt;
        current=current->nxt;
        start_ptr->prv=start_ptr->nxt;
        start_ptr->nxt=NULL;
        //nextone=nextone->nxt;
        while(nextone->nxt!= NULL)
        {
            pswap(current->nxt, current->prv);
            current=nextone;
            nextone=nextone->nxt;
        }
        start_ptr=nextone;
    }
}
Sie vertauschen die Inhalte der Knoten, anstatt nur die Knoten Zeiger. Sind Sie sicher, dass Sie das tun wollen?
Auf ein zugehöriger Hinweis, man betrachtet die Dinge aus einer anderen Sicht. Anstatt reverse-die Inhalte der doppelt verknüpften Liste selbst, Sie könnten stattdessen auf die Iteration über den Inhalt der Liste in umgekehrter, das sollte unkompliziert sein, da die Liste ist in zweifacher Hinsicht verbunden. Zum Beispiel, implementieren STL-Stil bidirektionale Iteratoren für Ihre Liste. Sie können verwendet werden, mit der std::reverse_iterator<> - adapter (für rbegin() und rend()). Sobald die Methoden implementiert, es werden einfach zu nutzen, die STL-algorithmen, einschließlich std::reverse(). Es ist eine nette übung, IMO.

InformationsquelleAutor Dan | 2010-07-07

Schreibe einen Kommentar