verkettete Liste



  • hi moju,

    als erstes würde ich die Zeile

    help->next=head;
    

    aus deiner insert-funktion löschen. Ansonsten zeigt dein letztes Element nämlich immer auf sich selber und die Liste hat keine wirkliches Ende. Wenn du die Zeile weglässt, dann zeigt dein letztes Element auf NULL und du erkennst so, wo deine Liste endet

    Den else-Teil deiner display-Funktion würde ich so schreiben:

    element *p =head;
    
    while (p)
    {
      cout << p->zahl;
      p=p->next;
    }
    

    Das Problem bei deiner Ausgabe ist zum Einen, dass die while-Schleife erst gar nicht betreten wirst, da du p erst auf head setzt und dann abfragst, ob p ungleich head ist, was natürlich nicht zutrifft. Also wird nur die Zeile

    cout << p->zahl;
    

    ausgeführt, da sie (anders als du es wahrscheinlich wolltest) nicht zur Schleife gehört.



  • hab die display jetzt geändert, aber jetzt krieg ich eine Endlosschleife die nur mehr die zahl 3 ausgibt. 😞

    warum soll ich die

    help->next=head;
    

    löschen? 🙄
    wenn ich die zeile weglösche, dann gibt er mir nix aus...
    ich füge ja immer ein neues element zu beginn am kopf ein. das mit dem Ende stimmt ....wie krieg ich ein schönes Ende, damit ich weiß wo die Liste endet?



  • am besten ist mal nur mit einer liste anzufangen die ien *next beinhaltet und einen integer 😉



  • zb

    class liste
    {
    int z;
    liste *next;
    };
    
    int main()
    {
    liste *zeiger=0;
    liste *lauf=0;
    liste hilfszeiger=0;
    hilfszeiger= new liste
    zeiger = hilfszeiger;
    lauf=zeiger;
    for(int i=0;i<10;i++)
    {
    zeiger->z=i;
    hilfszeiger=new liste;
    zeiger->next=heilfszeiger;
    zeiger=zeiger->next;
    zeiger->next=0;
    }
    while(true)
    {
    cout<<lauf->z<<endl;
    if(lauf->next==0)
    break;
    lauf=lauf->next;
    }
    }
    


  • hmm...ich würds gerne anhand meines Versuches verstehen...also was muss ich ändern, dass aus meiner liste eine funktionierende liste wird, bei der man zahlen einfügen kann? so falsch kanns ja nicht sein, oder? 🙄



  • verwerfen waere besser

    dann neu schreiben...

    eine klasse

    und in der main die algorithmen fuer anfuegenund ausgeben

    element(int z, element *n=NULL){
        zahl=z;
        next=n;
        }
    

    wozu solchen konstruktor?

    class Ring{
    public:
        element *head;
        Ring()
        {
            head=NULL;
        }
    
        void insert(int zahl);
        void display();
    
    };
    

    unnuetze klasse?

    ware besserr als elementmethode

    simple anfangen dann alles checken dann weiterdenken

    meine devise 😉



  • lookias schrieb:

    verwerfen waere besser

    dann neu schreiben...

    eine klasse

    und in der main die algorithmen fuer anfuegenund ausgeben

    element(int z, element *n=NULL){
        zahl=z;
        next=n;
        }
    

    wozu solchen konstruktor?

    class Ring{
    public:
        element *head;
        Ring()
        {
            head=NULL;
        }
    
        void insert(int zahl);
        void display();
    
    };
    

    unnuetze klasse?

    ware besserr als elementmethode

    simple anfangen dann alles checken dann weiterdenken

    meine devise 😉

    🕶



  • mit ein paar änderungen funktioniert es soger 😉

    ...
    class liste
    {
    public:
    	int z;
    ...
           liste *hilfszeiger=0;
    ...
    	while(true)
    	{
    		if(lauf->next==0)
    		break;
    		cout<<lauf->z<<endl;
    		lauf=lauf->next;
    	}
    


  • optimieren ist besser

    while(T* t=lauf->next)
        {
            //if(lauf->next==0)
            //break;
            cout<<lauf->z<<endl;
            //lauf=lauf->next; //t schon vorhanden
        }
    


  • @lookias

    Tip of the day: Die Gelegenheiten sinnvoll Endlosschleifen im Code unterzubringen sind rarer gesäht als man allgemein annehmen sollte.
    Tip of tomorrow: if for while else - Statements generell in einen Block packen.

    (Disclaimer: meine Devise 😉 )


Anmelden zum Antworten