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 }
-
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
)