Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » liste

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
08.04.2006, 10:38 Uhr
ref



Der Code zum erzeugen ein einfache liste:


C++:
// Arbeiten mit einer Liste
#include <iostream>
#include <cstring>

using namespace std;

struct Knoten
{
   char Name[50];
   int  Alter;
   Knoten* Nachfolger;  // Zeiger auf den Nachfolger
};

// Funktionsprototypen*
Knoten* Letztes(void);
void NeuesElement(char* Name, int Alter);
void ElementeAusgeben(void);
void ListeLoeschen(void);

// den Listenkopf definieren
Knoten Listenkopf;

int main(void)
{
   cout << "Daten fuer den Listenkopf angeben\n";

   cout << "Alter: ";
   cin  >> Listenkopf.Alter;
   cout << "Name : ";
   cin  >> Listenkopf.Name;

   cout << "Daten eingeben (Alter -1 fuer Ende)\n";

   int  Alter = 0;
   char Puffer[50];

   // bei einer -1 wird die Eingabe abgebrochen
   while(-1 != Alter)
   {
      cout << "Alter: ";
      cin  >> Alter;

       if(-1 != Alter)
        {
            cout << "Name : ";
            cin  >> Puffer;
            NeuesElement(Puffer, Alter);
        }
   }

   ElementeAusgeben();

   ListeLoeschen();
}

Knoten* Letztes(void)
{
    Knoten* p = &Listenkopf;

    while(NULL != p->Nachfolger)
    {
        p = p->Nachfolger;
    }

    return p;
}

void NeuesElement(char* Name, int Alter)
{
    Knoten* Element = new Knoten;

    strcpy(Element->Name, Name);
    Element->Alter = Alter;
    Element->Nachfolger = NULL;

    Letztes()->Nachfolger = Element;
}

void ElementeAusgeben(void)
{
    Knoten* p = &Listenkopf;

    while(NULL != p)
    {
        cout << p->Name << " " << p->Alter << '\n';
        p = p->Nachfolger;
    }
}

void ListeLoeschen(void)
{
   while(NULL != Listenkopf.Nachfolger)
   {
       Knoten* p = &Listenkopf;

       while(Letztes() != p->Nachfolger )
       {
          p = p->Nachfolger;
       }

      delete Letztes();
      p->Nachfolger = NULL;
  }
}




die frage : schauen wir folgendes code-abschnitt an
hier soll irgenwann p->Nachfolger gleich NULL sein und raus aus dem while schleife
ich finde aber, es gibt kein grund, warum soll p->Nachfolger NULL sein ?
ANALYSIEREN Wir mal diesem code-abschnitt:
p ist ein zeiger auf Listenkopf , da gab es nirgenwo im code, dass
Listenkopf->Nachfolger = NULL gibt es nicht , es gibt nur Element->nachfolger = NULL
und Nicht Listenkopf->Nachfolger = NULL , hier wird nur die liste Listenkopf durchgesucht
oder, ? warum also p->Nachfolger wird irgendwann NULL sein, ich will nur das verstehen
danke in vorraus.



C++:
Knoten* Letztes(void)
{
    Knoten* p = &Listenkopf;

    while(NULL != p->Nachfolger)
    {
        p = p->Nachfolger;
    }

    return p;
}



--
Man kann ein Problem nicht mit der gleichen Denkweise lösen, mit der es erschaffen wurde. (Albert Einstein)

Dieser Post wurde am 08.04.2006 um 10:39 Uhr von ref editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
08.04.2006, 13:16 Uhr
ref



ich hab die antwort gefunden , jede erste zugriff ohne inisialisierung auf struct object
wenn diese AUSSERHALB main() erzeugt ist , gleich null automatisch.
natulich soll die zugriff auch von ein struct object sein.

wie diese test zeigt


C++:
// den Listenkopf definieren
Knoten Listenkopf;
Knoten Test;    // zum testen
int main(void)
{
  
   cout<<Test.Nachfolger;  // gleich null
   getchar();



mekwurdig ist : wenn Listenkopf oder test innerhalb main gewesen , dann hatte bei zugriff keine automatische null gehabt, warum keine ahnung?
--
Man kann ein Problem nicht mit der gleichen Denkweise lösen, mit der es erschaffen wurde. (Albert Einstein)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
08.04.2006, 13:35 Uhr
mauralix



Hey das sieht aus wie die Liste in "Jetzt lerne ich Visual C++ und DirectX9"

Ich empfehle alle die STL zu verwenden wenn es um Datenstrukturen geht allerdings wenn man programmieren lernt sollte man schon mal ne Liste selber machen. Vorallem wegen Verständnis der Zeiger
--
nur olfaktorisch fassbar....
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
08.04.2006, 18:44 Uhr
ref




Zitat von Verfasser:

schon mal ne Liste selber machen.


ja aber erst mal verstehen


C++:
Knoten* Letztes(void)
{
    Knoten* p = &Listenkopf;

    while(NULL != p->Nachfolger)
    {
        p = p->Nachfolger; // z.b. ich bin nicht sicher was hier genau passiert ???
    }

    return p;
}



--
Man kann ein Problem nicht mit der gleichen Denkweise lösen, mit der es erschaffen wurde. (Albert Einstein)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
08.04.2006, 19:10 Uhr
Spacelord
Hoffnungsloser Fall


Hi,
das Ende der Liste wird dadurch gekennzeichnet dass Nachfolger NULL ist.
Vor der while Schleife initialisierst du p mit dem Listenkopf um dann in der while Schleife p,sofern p->Nachfolger nicht NULL ist, auf p->Nachfolger zu setzen.
Nach jedem Durchlauf der while Schleife zeigt p also auf das nächste Element in der Liste und zwar solange bis p->Nachfolger NULL ist und somit das Ende der Liste erreicht ist.
Dann wird die while Schleife verlassen und p als letztes Element zurückgegeben.

MfG Spacelord
--
.....Ich mach jetzt nämlich mein Jodeldiplom.Dann hab ich endlich was Eigenes.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
08.04.2006, 19:11 Uhr
Karldin Shinowa
Professional Noob


Der zeiger des Letzten elements der Liste zeigt auf null da er der letzte ist!
mit:

C++:
while(true)
{
   p = p->Nachfolger;
}


springst du immer in den nächsten Knoten. allerdings muss ja irgendwann das ende erreicht werden. und da der letzte knoten einen pointer hat der auf null zeigt is die abbruchbedingung dass der letzte pointer auf null zeigt.
daher:

C++:
while(NULL != p->Nachfolger)
{
p = p->Nachfolger;
}


--
Ich will die Welt verbessern, doch Gott gibt mir nicht den Code.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
09.04.2006, 11:53 Uhr
ref



das löschen prozess kann ich so vorstellen : das löschen fangt mit der letzte zeiger an , z.b. wenn dreimals
Alter & Name eingegeben sind , mit der dritte , Dann der erste und dann der mitte fertig
was meint ihr?



C++:
void ListeLoeschen(void)
{
   while(NULL != Listenkopf.Nachfolger)
   {
       Knoten* p = &Listenkopf;

       while(Letztes() != p->Nachfolger )
       {
          p = p->Nachfolger;
       }

      delete Letztes();
      p->Nachfolger = NULL;
  }
}



--
Man kann ein Problem nicht mit der gleichen Denkweise lösen, mit der es erschaffen wurde. (Albert Einstein)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
13.04.2006, 19:28 Uhr
~sra_500
Gast


ich glaube dass hier dass loeschen so geht, wie in deinem Beispiel nur 3,2,1. Also du gehst bis ans Ende der Liste und loescht die Elemente der Liste immer am Ende bis die Liste leer ist.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
13.04.2006, 23:20 Uhr
ref




Zitat von Verfasser:

wie in deinem Beispiel nur 3,2,1. Also du gehst bis ans Ende




mm wie könnte das sein ... die funktion p->Nachfolger geht immer
vorwärts , Und nach dem letzte gibt es keine
--
Man kann ein Problem nicht mit der gleichen Denkweise lösen, mit der es erschaffen wurde. (Albert Einstein)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
13.04.2006, 23:34 Uhr
ref



vielleicht wie beim destruktoren , oder?
--
Man kann ein Problem nicht mit der gleichen Denkweise lösen, mit der es erschaffen wurde. (Albert Einstein)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: