Verfügbare Informationen zu "Projekt C++ III: Doppelt-verzeigerte Listen"
Qualität des Beitrags: 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:37Projekt 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)