Hinten an Liste anhängen
-
Hallo,
ich bins noch einemal mit einer meiner Listen. (-:
Ich möchte einfach nur eine einfach verkette Liste, wo die neuen Elemente hinten, also ans Ende, angehangen werden. Ich habe jetzt schon super viele Variationen durchbrobiert und komme einfach nicht weiter. Wenn ich zewi zeiger hätten wie bei der doppelt verketteten Liste, wäre mir die Sache klar. Ich komme aber hier mit diesem einzelnen "Nachfolger-Zeiger" irgendwie nicht zurecht
Vielleicht sie ja jemand von Euch sofort, welcher Zeiger in einfuegen() falsch steht.
#include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct knot* neu; typedef struct knot{ int zahl; neu nachfolger; }knoten; typedef struct { neu anfang; neu ende; } anfang_ende_liste; void einfuegen(anfang_ende_liste* liste,int a){ if(liste->anfang=NULL){ neu element=(neu) malloc(sizeof(knoten)); element->zahl=a; liste->anfang=element; liste->ende=element; liste->anfang->nachfolger=NULL; } else{ neu element=(knoten*) malloc(sizeof(knoten)); element->zahl=a; liste->ende->nachfolger=element; liste->ende=element; } } int main(void){ int a; anfang_ende_liste liste={0}; printf("geben sie eine zahl ein\n"); scanf("%d",&a); if(a==0){ return 0; } else{ einfuegen(&liste,a); } while(a!=0){ printf("geben sie eine zahl ein\n"); scanf("%d",&a); einfuegen(&liste,a); } neu zeiger=liste.anfang; while(zeiger!=NULL){ printf("%d",zeiger->zahl); zeiger=zeiger->nachfolger; } return 0; }
-
In deinem else- Zweig fehlt ein
element->nachfolger=NULL;
-
Ich glaube das stimmt noch mehr nicht.
Das hier z.B. ist komisch
liste->anfang->nachfolger=NULL;
Wenn ich jetzt das nächste Element einfüge, müsste ich dieses ja verändern. Denn dann ist der Nachfolger ja dieses neue Element, das ich gerade einfüge. Aber ich komme ja nicht mehr zurück. Wenn ich einen Vorgänger zeiger hätte, könnte ich das. Aber ich möchte es ja extra mal mit der einfach verketten Liste versuchen.
-
Da ist das element->nachfolger=NULL; im if-Zweig
(Vorher sagst du ja iste->anfang = element;)
Das wird ja nur gemacht, wenn die Liste leer ist. Danach ist anfang und ende gleich.
-
void einfuegen(anfang_ende_liste* liste,int a){ if(liste->anfang=NULL){ neu element=(neu) malloc(sizeof(knoten)); element->zahl=a; liste->anfang=element; liste->ende=element; } else{ neu element=(knoten*) malloc(sizeof(knoten)); element->zahl=a; liste->ende->nachfolger=element; liste->ende=element; element->nachfolger=NULL; } }
Vielen Dank, ich bin jetzt etwas durcheinander. So müsste es doch besser sein, oder? Ich denke da auch an meine Ausgabe, die ja so aussieht:
neu zeiger=liste.anfang; while(zeiger!=NULL){ printf("%d",zeiger->zahl); zeiger=zeiger->nachfolger; } return 0; }
Da möchte ich ja vom Anfang an loslaufen und die Sachen ausgeben.Muss ich dann nicht auch mal irgendwo sowas wie anfang->nachfolger in der Funktion einfuegen() haben?
-
Der einzige Sonderfall ist doch eine leere Liste.
Der Rest ist gleich.void einfuegen(anfang_ende_liste* liste,int a){ // Neues Element am Ende der Liste einfügen neu element=(neu) malloc(sizeof(knoten)); // Neues Element anlegen element->zahl=a; // Wert Einfügen if(liste->anfang=NULL){ // Liste leer? liste->anfang=element; // Ja, dann haben wir jetzt ein erstes Element } else { liste->ende->nachfolger=element; // Nein, dann haben wir auch schon ein letztes } liste->ende=element; // Unser Element als letztes Eintragen element->nachfolger=NULL; // und darum hat unser Element keinen nachfolger }
-
Vielen vielen Dank für die Hilfe. Ich hab langsam einen Knoten im Kopf.
Ich habe jetzt in main noch dieses deklariert:
anfang_ende_liste liste;
liste.anfang=NULL;Jetzt muss ich nur noch die Ausgabe hinbekommen.
-
Eeeendlich, jetzt geht es. Ich habe auch vergessen, in der if-Klammer ein doppeltes Gleichheitszeichen zu schreiben.
#include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct knot* neu; typedef struct knot{ int zahl; neu nachfolger; }knoten; typedef struct { neu anfang; neu ende; } anfang_ende_liste; void einfuegen(anfang_ende_liste* liste,int a){ // Neues Element am Ende der Liste einfügen neu element=(neu) malloc(sizeof(knoten)); // Neues Element anlegen element->zahl=a; // Wert Einfügen if(liste->anfang==NULL){ // Liste leer? liste->anfang=element; // Ja, dann haben wir jetzt ein erstes Element } else { liste->ende->nachfolger=element; // Nein, dann haben wir auch schon ein letztes } liste->ende=element; // Unser Element als letztes Eintragen element->nachfolger=NULL; // und darum hat unser Element keinen nachfolger } int main(void){ int a; anfang_ende_liste liste; liste.anfang=NULL; printf("geben sie eine zahl ein\n"); scanf("%d",&a); if(a==0){ return 0; } else{ einfuegen(&liste,a); } while(a!=0){ printf("geben sie eine zahl ein\n"); scanf("%d",&a); einfuegen(&liste,a); } neu zeiger=liste.anfang; while(zeiger!=NULL){ printf("%d",zeiger->zahl); zeiger=zeiger->nachfolger; } return 0; }
-
psigh schrieb:
Ich habe jetzt in main noch dieses deklariert:
anfang_ende_liste liste;
liste.anfang=NULL;Du hattest doch
anfang_ende_liste liste={0};
Das reicht und initialisiert alles mit 0, auch liste.ende.
Sorry für das fehlende ==