Projekt C++ III: Doppelt-verzeigerte Listen

14. Info
Verfügbare Informationen zu "Projekt C++ III: Doppelt-verzeigerte Listen"

  • Qualität des Beitrags: 0 Sterne
  • Beteiligte Poster: timo
  • Forum: 14. Info
  • Forenbeschreibung: Informatiker der NTA-Isny
  • aus dem Unterforum: C++
  • Antworten: 1
  • Forum gestartet am: Donnerstag 15.06.2006
  • Sprache: deutsch
  • Link zum Originaltopic: Projekt C++ III: Doppelt-verzeigerte Listen
  • Letzte Antwort: vor 17 Jahren, 2 Monaten, 19 Tagen, 4 Stunden, 37 Minuten
  • Alle Beiträge und Antworten zu "Projekt C++ III: Doppelt-verzeigerte Listen"

    Re: Projekt C++ III: Doppelt-verzeigerte Listen

    timo - 30.01.2007, 17:37

    Projekt C++ III: Doppelt-verzeigerte Listen
    Thema:
    Realisierung eines Algorithmus zur Erzeugung und Nutzung zweifach verketteter Listen in C++ (Arbeitstitel)


    ********************************


    // Projekt: Modul Programmiersprachen C++ III
    // Thema: Realisierung eines Algorithmus zur Erzeugung und Nutzung zweifach verketteter Listen in C++
    // Datei: dvliste3.cpp
    // Testumgebung: Windows XP SP2
    // SW-Test: Borland C++ 5.02
    // Hilfszeiger2 beim löschen von Knoten entfernt, Überprüfung ob Elemente vorhanden, bevor Eingabe, kein Speicherfehler beim Löschen des ersten oder letzten Elements in der Liste

    #include <string>
    #include <conio> // Fuer clrscr()
    #include <iostream>


    // <ANFANG>


    /* Der Datentyp 'struct' gehoert zu den benutzerdefinierten Datentypen.
    * Dabei unterscheidet man die 'Deklaration', die die Eigenschaften der
    * Komponenten beschreibt, und die 'Definition', die Variablen mit den
    * deklarierten Eigenschaften festlegt
    */


    struct listenelement
    {
    // In Klammern ist Komponentenliste
    char *daten;
    // Zeiger auf 'next'-Listenelement
    listenelement *elementnext;
    // Zeiger auf 'previous'-Listenelement ohne Variablenliste zwischen '}' und ';'
    listenelement *elementprev;
    };


    /* Structurvariablen werden ueber die 'Komponenten' angesprochen. Dies
    * entspricht der Bearbeitung eines Feldes ueber seine Elemente, die mit
    * einem Index adressiert sind. Bei uns geschieht dies durch Zeiger
    */



    // Zeiger auf Listenanfang
    listenelement *listenanfang;
    // Zeiger auf Listenende
    listenelement *listenende;
    // Hilfszeiger fuer verschiedene Operationen
    listenelement *hilfszeiger;
    // 1 wegen Root-Knoten-Element
    int element_zaehler = 1;

    // <ENDE>


    // <ANFANG>


    /* Das Schluesselwort 'void' bezeichnet den Typ des Rückgabewerts
    * von Funktionen, die keinen Wert zurückliefern
    */


    void einfuegen(const char* datenneu, int datenneu_length)
    {

    /* Zaehlt Elemente fuer Positionseingaben beim Loeschen und Aendern
    */

    element_zaehler++;
    hilfszeiger = listenanfang;

    while (hilfszeiger->elementnext != NULL)
    {
    hilfszeiger = hilfszeiger->elementnext;
    }

    hilfszeiger->elementnext = new(listenelement);
    listenelement *bisherLetzter = hilfszeiger;
    hilfszeiger = hilfszeiger->elementnext;

    /* Ergebnis: Zeiger auf Anfang
    * Funktionsaufruf: strcpy('Ziel', 'Quelle')
    * Aufgabe: Haenge String 'Quelle' an String 'Ziel' an
    */

    hilfszeiger->daten = new char[datenneu_length];
    strcpy (hilfszeiger->daten, datenneu);
    hilfszeiger->elementnext = NULL;

    /* 'elementprev'-Zeiger aktualisieren. Jedes neu dazukommende Element
    * muss als 'elementprev-Zeiger' auf das bisherige Listenende zeigen.
    */

    hilfszeiger->elementprev = bisherLetzter;

    /* 'listenende-Zeiger' aktualisieren werden,
    * damit der Zeiger jederzeit bereit steht.
    */

    listenende = hilfszeiger;
    }

    // <ENDE>


    // <ANFANG>

    void aendern()
    {
    int position;
    int count = 0;
    bool eingabe = true;
    string datensatz;

    if(element_zaehler==1)
    {
    cout<<"\nFehler: kein Element zum aendern vorhanden..."; getch();
    }
    else
    {
    do
    {
    cout << "\nPosition des zu aendernden Datensatzes: ";
    cin >> position;

    //Überprüfen ob Datensatz existiert - 'Exception Handling'

    if(cin.fail())
    {
    cin.clear(); // Fehlerhaftes Zeichen loeschen
    cin.get(); // Fehlerhaftes Zeichen entfernen
    eingabe=false;
    char c;
    cout << "Falsche Eingabe, nur Ziffern!";
    cin >> c;
    }
    else
    {
    if(eingabe>0 && eingabe<element_zaehler)
    {
    eingabe = true;
    }
    else
    {
    eingabe=false;
    cout << "Falsche Eingabe, Element nicht vorhanden!";
    }
    }
    }while(eingabe==false);

    hilfszeiger = listenanfang;

    //Durchlaufen bis zur Position

    while (hilfszeiger->elementnext != NULL && count<position>elementnext;
    }

    cout << "Neuer Datensatz: ";
    cin >> datensatz;
    hilfszeiger->daten = new char[datensatz.length()];
    strcpy (hilfszeiger->daten, datensatz.c_str());
    }
    }

    // <ENDE>


    //<ANFANG>

    void loeschen()
    {
    int position; // Wunschposition(-eingabe)
    int count = 0; // Schleifenzaehler
    bool eingabe = true;

    if(element_zaehler==1)
    {
    cout<<"\nFehler: kein Element zum loeschen vorhanden..."; getch();
    }
    else
    {
    do
    {
    cout << "\nPosition des zu loeschenden Datensatzes: ";
    cin >> position; // siehe unten: char c bei Falscheingabe

    if(cin.fail())
    {
    cin.clear(); // Fehlerhaftes Zeichen loeschen
    cin.get(); // Fehlerhaftes Zeichen entfernen
    eingabe=false;
    char c; // Char-Eingabe Synchronisation Bufferlehrung
    cout << "Falsche Eingabe, nur Ziffern!";
    cin>>c;
    }

    else
    {
    if(eingabe>0 && eingabe<element_zaehler)
    {
    eingabe = true;
    }
    else
    {
    eingabe=false;
    cout << "Falsche Eingabe, Element nicht vorhanden!";
    }
    }
    }while(eingabe==false);

    element_zaehler--;
    hilfszeiger = listenanfang;

    //Durchlaufen bis zur Position

    while (hilfszeiger->elementnext != NULL && count<position>elementnext;
    }


    if(element_zaehler==1)
    {
    hilfszeiger->elementprev->elementnext=NULL;
    listenende = hilfszeiger->elementprev;
    delete (hilfszeiger);
    cout<<"Einziges Element wurde entfernt.";
    getch();
    }

    else if(hilfszeiger->elementnext==NULL)
    {
    hilfszeiger->elementprev->elementnext=NULL;
    listenende = hilfszeiger->elementprev;
    delete(hilfszeiger);
    }

    else
    {
    hilfszeiger->elementnext->elementprev = hilfszeiger->elementprev;
    hilfszeiger->elementprev->elementnext = hilfszeiger->elementnext;
    delete(hilfszeiger); // Altes Element loeschen
    }
    }
    }

    // <ENDE>


    // <ANFANG>
    // Keine Aenderungen
    void ausgeben()
    {
    if(element_zaehler==1)
    {
    cout<<"Fehler: kein Element zum ausgeben vorhanden...";
    }
    else {
    hilfszeiger = listenanfang;
    cout <<hilfszeiger>daten <<endl>elementnext != NULL)
    {
    hilfszeiger = hilfszeiger->elementnext;
    cout <<hilfszeiger>daten << endl;
    }
    }
    }

    // <ENDE>


    // <ANFANG>

    void ausgaberueckwaerts()
    {
    if(element_zaehler==1)
    {
    cout<<"Fehler: kein Element zum ausgeben vorhanden...";
    }
    else {
    //Wichtig: Hilfszeiger muss auf das Listenende zeigen und nicht umgekehrt
    hilfszeiger = listenende;
    cout <<hilfszeiger>daten <<endl>elementprev != NULL)
    {
    hilfszeiger = hilfszeiger->elementprev;
    cout <<hilfszeiger>daten << endl;
    }
    }
    }

    // <ENDE>


    // <ANFANG>

    void init()
    {
    listenanfang = new(listenelement);
    listenanfang->elementnext = NULL;
    listenanfang->elementprev = NULL;

    /* Listenende gleich dem Listenanfang setzen, da das Startelement
    * sowohl erstes als auch letztes Element ist.
    */
    listenende = listenanfang;
    listenanfang->daten = new char[30];
    strcpy(listenanfang->daten, ""); // Root-Element definieren -> Zyklisch verkettete Liste
    }

    // <ENDE>


    // <ANFANG>

    void ende()
    {
    while (listenanfang != NULL)
    {
    hilfszeiger = listenanfang;
    listenanfang = listenanfang->elementnext;
    delete(hilfszeiger);
    }
    }

    // <ENDE>


    // <ANFANG>

    /* Nur Funktionsaufrufe fuer 'void'-Abschnitte
    */
    int main()
    {
    init();
    bool menuende=false;
    char eingabe;
    string datensatz;
    /*
    string datensatz;
    cout << "\Datensatz einfuegen" << endl
    << "\nName des Elements eingeben: ";
    cin >> datensatz;
    einfuegen(datensatz.c_str(), datensatz.length()); //char-Array c_strings.()
    */

    //cout<<"Bitte geben sie das erste Listenelement ein: ";
    //cin >> datensatz;
    //einfuegen(datensatz.c_str(), datensatz.length());

    do
    {
    clrscr();
    cout << "M E N U:" << endl << "========" << endl
    << "[1] Datensatz einfuegen" << endl
    << "[2] Datensatz aendern" << endl
    << "[3] Datensatz loeschen" << endl
    << "[4] Alle Elemente vorwaerts ausgeben" << endl
    << "[5] Alle Elemente rueckwaerts ausgeben" <<endl
    << "[0] Programm beenden" << endl
    << "\nAuswahl: ";

    cin >> eingabe;

    switch (eingabe)
    {
    case '1': cout << "\nName des Elements eingeben: ";
    cin >> datensatz;
    /* char-Array c_strings.()
    */
    einfuegen(datensatz.c_str(), datensatz.length());
    break;
    case '2': clrscr();
    cout << "*** Datensatz aendern ***";
    aendern();
    break;
    case '3': clrscr();
    cout << "*** Datensatz loeschen ***";
    loeschen();
    break;
    case '4': clrscr();
    cout << "*** Ausgabe vorwaerts ***" << endl;
    ausgeben();
    cout << endl << "\nZum Menu weiter mit Taste ...";
    getch();
    break;
    case '5': clrscr();
    cout << "*** Ausgabe rueckwaerts ***" << endl;
    ausgaberueckwaerts();
    cout << endl << "\nZum Menu weiter mit Taste ...";
    getch();
    break;
    case '0': menuende=true;
    break;
    default: cout << "Falsche Eingabe!";
    getch();
    break;
    }
    } while(menuende==false);

    ende();
    return 0;
    }

    // <ENDE>



    Mit folgendem Code, können Sie den Beitrag ganz bequem auf ihrer Homepage verlinken



    Weitere Beiträge aus dem Forum 14. Info

    Tipps Rund ums Studium - gepostet von LEX am Freitag 04.08.2006
    WIKIs - gepostet von ravekev am Mittwoch 29.11.2006
    Praktika Java / Computergraphik - gepostet von timo am Samstag 14.07.2007
    Sommerferien - gepostet von ravekev am Montag 19.06.2006
    wo ist der prüfungsplan ws 06/07 online? - gepostet von Tobi am Freitag 05.01.2007
    Passwort für die Prüfungsanmeldung - gepostet von ravekev am Dienstag 12.06.2007
    MarketingStrategien - gepostet von ravekev am Sonntag 08.04.2007
    ComputerGrafik - gepostet von Onas am Mittwoch 14.03.2007



    Ähnliche Beiträge wie "Projekt C++ III: Doppelt-verzeigerte Listen"

    NAP`s für das Projekt Uni2 - Anonymous (Samstag 09.06.2007)
    Projekt: Streckenbau - Jinzoo (Montag 13.08.2007)
    Projekt Gutenberg - Jadzia (Montag 31.10.2005)
    Fehler im Projekt - andreasw (Mittwoch 30.11.2005)
    Diverse Proleme beim Projekt - Bravad (Freitag 06.04.2007)
    Wer ist der Versuchung erlegen (E10) - rollerbär (Montag 10.10.2011)
    Projekt X - Bassi (Montag 20.02.2006)
    Das Projekt. - shadowsmals (Sonntag 06.08.2006)
    Staudamm-Projekt muss verhindert werden! (Österreich) - GreenMike (Sonntag 04.02.2007)
    Import - Export zwischen Open Source Tools und MS Projekt - carsten (Mittwoch 25.04.2007)