doppelt verkette Liste



  • Hallo Leute,
    ich hab da eine Frage. Das Programm geht super aber ich will bei der doppelt verketten Liste die Elemente nicht am Anfang der Liste hinzufügen sondern am Ende (AssignListe) und bekomme das aber nicht hin.

    Könnte mir wer helfen?

    #include <iostream>
    #include <conio.h>
    #include <math.h>

    using namespace std;

    struct Liste
    {
    int Element;
    Liste *next;
    Liste *prev;
    };

    void AssignListe(Liste*,Liste*, int&); //nCount muss verändert werden können
    void DisplayListe(Liste*);
    void DeleteElement(Liste*, Liste*, int&); //nCount muss verändert werden können
    void DeleteListe(Liste*, Liste*);
    void bubble(Liste *head, int&); //nCount muss verändert werden können
    int search(Liste *, int );

    void main ()
    { // Liste Erstellen
    int suche = 0;
    int erg = 0;

    Liste *head,*z;

    head = new Liste;
    z = new Liste;
    head->next = z;
    head->prev = 0;
    z->next = z;
    z->prev = head;

    int auswahl = 0;
    char auswahl2 = 'N';
    int nCount = 0; //Zählvariable

    do
    {
    cout <<"******************************************\n\n";
    cout <<"Bitte waehlen Sie den Menue Punkt aus!\n\n";
    cout <<"******************************************\n\n";
    cout <<"[1]....Neues Element anlegen\n";
    cout <<"[2]....Elemente ausgeben\n";
    cout <<"[3]....Element loeschen\n";
    cout <<"[4]....Liste loeschen\n";
    cout <<"[5]....Liste sortieren\n";
    cout <<"[6]....Suche nach einem Element\n";
    cout <<"[7]....Programm beenden\n\n";
    cout <<"******************************************\n\n";

    cout <<"Ihre Auswahl: ";

    cin >> auswahl;
    cout << endl;

    switch(auswahl)
    {
    case 1:
    {
    system ("cls");
    AssignListe(head,z, nCount); //hinzufügen von Elementen
    }
    break;

    case 2:
    {
    system ("cls");
    DisplayListe(head);
    }
    break;

    case 3:
    {
    system ("cls");
    DeleteElement(head, z, nCount);
    }
    break;

    case 4:
    {
    system ("cls");
    DeleteListe(head, z);
    nCount = 0; // alles Löschen Zähler wieder auf 0
    }
    break;

    case 5:
    {
    system ("cls");
    bubble(head,nCount); //Bubble Sortierung
    }
    break;

    case 6:
    {
    system ("cls");
    cout <<"Geben Sie das zu suchende Element ein\n";
    cin >> suche;

    erg = search(head , suche);

    if (erg != 0)
    {
    cout << endl;
    cout <<"Das element wurde Gefunden!\n\n";
    break; // Abruch wenn gefunden
    }

    else
    cout << endl;
    cout <<"Das Element wurde nicht gefunden!\n\n";
    }
    break;

    default:
    {
    system ("cls");
    cout <<"Wollen Sie das Programm nun beenden? (J/N)\n";
    cin >> auswahl2;
    cout << endl;

    if (auswahl2 == 'j' || auswahl2 == 'J')
    {
    system ("cls");
    cout <<"Auf Wiedersehn!\n\n";
    return;
    }
    else
    {
    system ("cls");
    auswahl2 = 'N';
    }
    }
    break;
    }

    }while ( auswahl2 == 'n' || auswahl2 == 'N');

    delete head; //Löschen des Speichers
    delete z;

    _getch();
    }
    /*
    void AssignListe(Liste *head,Liste *z, int& nCount)
    {
    char frage1 = 'J';

    do
    {
    Liste *help01;
    help01 = new Liste;

    cout <<"Geben Sie das Element ein: ";
    cin >> help01->Element; // Element einlesen
    cout << endl;

    help01->next = head->next;
    help01->prev = head;

    head->next->prev = help01;
    head->next = help01;

    nCount++; //Zähler erhöhen

    cout <<"Noch eine Eingabe? (J/N)\n";
    cin >> frage1;
    cout << endl;
    system("cls");

    }while ( frage1 == 'j' || frage1 == 'J');
    }
    */

    void AssignListe(Liste *head,Liste *z, int& nCount)
    {
    char frage1 = 'J';

    do
    {
    Liste *help01;
    help01 = new Liste;

    cout <<"Geben Sie das Element ein: ";
    cin >> help01->Element; // Element einlesen
    cout << endl;

    help01->next = head->next;
    help01->prev = head;

    head->next->prev = help01;
    head->next = help01;

    nCount++; //Zähler erhöhen

    cout <<"Noch eine Eingabe? (J/N)\n";
    cin >> frage1;
    cout << endl;
    system("cls");

    }while ( frage1 == 'j' || frage1 == 'J');
    }

    void DisplayListe(Liste *head)
    {
    Liste *help02;
    help02 = new Liste;
    help02 = head->next;

    if(help02 != help02->next)
    {
    do
    {
    cout <<"Element: "<< help02->Element << endl;
    cout << endl;

    help02 = help02->next;

    }while (help02 != help02->next);
    }

    else
    {
    cout << endl;
    cout <<"\n";
    cout <<"Liste Leer!\n";
    cout <<"
    \n";
    }
    }

    void DeleteElement(Liste *head, Liste *z, int& nCount)
    {
    Liste *help03;
    help03 = new Liste;
    help03 = head->next;

    int ID = 0;

    system ("cls");
    cout <<"Geben Sie das zu loeschende Element ein: ";
    cin >> ID;

    help03 = head;
    while (help03->next != help03)
    if(help03->Element == ID)
    break;
    else
    help03 = help03->next;

    if (help03->Element != ID)
    {
    cout << endl;
    cout <<"\n";
    cout <<"Element nicht gefunden!\n";
    cout <<"
    \n";
    }

    help03->prev->next = help03->next;
    help03->next->prev = help03->prev;

    cout << endl;
    cout <<"************************\n";
    cout <<"Element wurde geloescht!\n";
    cout <<"************************\n";
    cout << endl;

    nCount --; // Zähler um 1 zurücksetzen

    }

    void DeleteListe(Liste *head, Liste *z)
    {
    Liste *help03;
    help03 = new Liste;
    help03 = head->next;

    system ("cls");

    head->next = z;
    head->prev = 0;
    z->next = z;
    z->prev = head;

    cout << endl;
    cout <<"\n";
    cout <<"Liste geloescht!\n";
    cout <<"
    \n";
    cout << endl;

    }

    void bubble(Liste *head,int& nCount)
    {
    int nKeys[100];
    int k = 0;
    int i, j, t = 0;

    Liste *help02;
    help02 = new Liste;
    help02 = head->next;

    if(help02 != help02->next)
    {
    do
    {
    k++;
    nKeys[k] = help02->Element; // Elemente in array

    help02 = help02->next;

    }while (help02 != help02->next);
    }

    else
    {
    cout << endl;
    cout <<"\n";
    cout <<"Liste Leer!\n";
    cout <<"
    \n";
    }
    //Bubble Sort ---> Absteigende sortierung
    for(i=0;i<10;i++)
    {
    for(j=0;j<i;j++)
    {
    if(nKeys[i]>nKeys[j])
    {
    int temp=nKeys[i];
    nKeys[i]=nKeys[j];
    nKeys[j]=temp;
    }
    }
    }

    cout << endl; //Ausgabe der Elemente
    cout <<"Die Sortierten Element: \n\n";

    for(i = 0; i < nCount; i++)
    {
    cout << nKeys[i] << endl;
    }
    }

    int search(Liste *head, int suche)
    {
    Liste *help02;
    help02 = new Liste;
    help02 = head->next;

    while(help02->next != help02)
    if(help02->Element == suche)
    break;
    else
    help02 = help02->next;
    if(help02->Element != suche)
    return 0;

    }



  • Das schaut sehr nach C aus, daher falsches Forum. Wird aber sicherlich bald verschoben.

    Ansonsten kannst du mehrere Ansätze verfolgen. Du kannst z.B. beim Add solangange durch die Liste laufen bis list->next == NULL ist. Dann bist du am Ende angelangt. Das wäre dann der ineffektive Weg. Der Effektive Weg ist: Du speicherst dir in deiner Leeren List noch den Anfang und das Ende der Liste. Dann wäre es aber sinnvoll zwei Structs zu machen

    //Die leere Liste
    struct List
    {
       Node * first; //Zeiger auf das erste Element
       Node * last; //Zeiger auf das letzte Element
       int count; //Ist nicht notwendig aber für Pluspunkte beim leerer wäre da ein netter gimmick ;)
    }
    
    //Ein eintrag in der Liste
    struct Node
    {
       Node* next;
       Node* prev;
       int Element;
    }
    

    Hier musst du etwas bei den Verzeigerungen aufpassen aber das ist nicht wirklich schwer.



  • Danke, dass werde ich mal versuchen.



  • Dieser Thread wurde von Moderator/in Martin Richter aus dem Forum MFC (Visual C++) in das Forum ANSI C verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • wenn man eine double circular list nehmen würde, also das erste element auf das letzte zeigen lassen würde bräuchte man sich nur den ersten knoten zu merken, ob diese link form vorteile hat weiß ich nicht, könnte aber sein, da es microsoft exzessiv in seinen task structs einsetzt.

    das mit der länge ist eigentlich nur sinnvoll, wenn man ständig die länge wissen will, sonst könnte man die schleife einfach gegen einen sentinel laufen lassen, also null oder der erste knoten.

    evtl. für einen ersten eindruck, ist zwar nur eine single circular linked list, aber das prinzip sollte schon klar werden 😉

    lg lolo



  • Immer noch im falschen Forum. Das ist verkorkstes C++. Ergo nimm #inlude <list> und alles wird jut.



  • Tyrdal schrieb:

    Immer noch im falschen Forum. Das ist verkorkstes C++. Ergo nimm #inlude <list> und alles wird jut.

    Y schrieb:

    cout << "Wollen Sie das Programm nun beenden? (J/N)\n";



  • Fedaykin schrieb:

    Das schaut sehr nach C aus, daher falsches Forum. Wird aber sicherlich bald verschoben.

    C? Ich kann diesen Code mit meinem C-Compilier nicht übersetzen. Ein Objekt 'cout' gibt es nicht, und in C habe ich noch nie Link-Shifts mit Strings gesehen.

    Bitte nach C++ verschieben.



  • Und der nächste im C++ Forum meckert das sein Standardkonformer Kompiler die

    void main()
    

    nicht akzeptiert und bittet um verschiebung ins Visual C++ Forum... Super 👍 .



  • Fedaykin schrieb:

    Und der nächste im C++ Forum meckert das sein Standardkonformer Kompiler die

    void main()
    

    nicht akzeptiert und bittet um verschiebung ins Visual C++ Forum... Super 👍 .

    dann weiß er zumindest was es heißt unportabelen code zu schreiben, da bist ständig auf der suchen nach nem passierschein a 38 :p



  • Und der nächste im C++ Forum meckert das sein Standardkonformer Kompiler die
    C/C++ Code:
    void main()
    C/C++ Code:
    void main()
    C/C++ Code:
    void main()

    nicht akzeptiert und bittet um verschiebung ins Visual C++ Forum... Super

    Da wäre er schonmal etwas besser aufgehoben, weil die Sprache stimmt.
    Es gibt allerdings überhaupt keinen Grund void main zu schreiben, nie.



  • Tyrdal schrieb:

    Es gibt allerdings überhaupt keinen Grund void main zu schreiben, nie.

    Doch natürlich. Z.B. ein Programm das nicht im klassischen Sinne terminiert und gar keinen Status an ein OS zurückgeben kann.



  • Tim schrieb:

    Tyrdal schrieb:

    Es gibt allerdings überhaupt keinen Grund void main zu schreiben, nie.

    Doch natürlich. Z.B. ein Programm das nicht im klassischen Sinne terminiert und gar keinen Status an ein OS zurückgeben kann.

    Muß ja nicht mal ein OS sein, bei embedded- Kisten wird der Assembler- Startupcode durchlaufen und main als Unterroutine angesprungen, meist sind noch Kommentare drin, wie man den Rückgabewert absammeln kann. Auf PCs kratzt das keinen mehr, aber auf Controllern mit nur ein paar Bytes RAM schon.
    Wenn man eh weiß, das Ding springt in main und kommt nie wieder, kann man sich die Bytes für die Rücksprungadresse sparen (RAM) und die paar Bytes ROM für den Code, der den Rückgabewert bereitstellen würde.
    Dann ist aber die main korrekterweise eine void main(void). Immer dran denken: Es laufen mehr Zeilen Code auf embedded als auf PCs oder Mainframes; in der Summe der installierten Systeme betrachtet, sind PCs tatsächlich in der Unterzahl. 😉



  • pointercrash() schrieb:

    Immer dran denken: Es laufen mehr Zeilen Code auf embedded als auf PCs oder Mainframes; in der Summe der installierten Systeme betrachtet, sind PCs tatsächlich in der Unterzahl. 😉

    Und? Obwohl es viel mehr Bazillen als Menschen gibt, darf ich doch trotzdem deren Tischmanieren ablehnen.



  • volkard schrieb:

    Und? Obwohl es viel mehr Bazillen als Menschen gibt, darf ich doch trotzdem deren Tischmanieren ablehnen.

    Endlich mal eine qualifizierte Meldung zur doppelt verketteten Liste!

    Martin Luther sagte dazu: "Warum rölpset und forzet Ihr nicht? Hat es Euch nicht geschmacket?"


Anmelden zum Antworten