Verkettete Liste
-
Ich lerne gerade C und versuche eine verkettete Liste von Integern zu schreiben.
Leider scheitere ich noch und bin nicht in der Lage herauszufinden, woran es liegt.1 #include <stdlib.h> 2 #include <stdio.h> 3 4 typedef struct 5 { 6 int value; 7 struct list *next; 8 } list; 9 10 void list_add(list **ll, int v) 11 { 12 list *l = (*ll); 13 if( l == NULL) 14 { 15 printf("Liste ist leer\n"); 16 list * new = (list*) malloc(sizeof(list)); 17 new->value = v; 18 new->next = NULL; 19 l = new; 20 } 21 } 22 23 printlist(list* l) 24 { 25 if(l != NULL) 26 { 27 printf("%d \n", l->value); 28 } 29 else 30 { 31 printf("Liste ist leer\n"); 32 } 33 } 34 35 int main() 36 { 37 list *l = NULL; 38 list_add(&l, 1); 39 printlist(l); 40 return 0; 41 }
Würde mich freuen, wenn mir jmd erklärt, wieso meine Liste nicht aufgefüllt wird.
Das ganze ist noch lange nicht fertig, aber wenn es jetzt schon hängt ...
-
Weil du in list_add an dem *ll nichts änderst.
Das zeigt weiterhin auf NULL und nicht auf new.
-
DirkB schrieb:
Weil du in list_add an dem *ll nichts änderst.
Das zeigt weiterhin auf NULL und nicht auf new.Das ist wahrscheinlich dann genau der Punbkt, den ich nicht verstehe.
list *l = (*ll); l = new;
In diesem Abschnitt ändere ich für mein bsiheriges Verständnis (*ll), da l ja (*ll) ist, oder?
-
Mit
list *l = (*ll);
zeigt l dahin, wo auch *ll hinzeigt. (in diesem Fall auf NULL)
Mitl = new;
zeigt l auf new.
*ll änderst du nicht.
-
Ja, wenn ich das umändere funktioniert es.
Ich habe nochmal was ähnliches versucht,was leider auch nicht ganz hinhaut:
1 #include <stdlib.h> 2 #include <stdio.h> 3 4 typedef struct 5 { 6 int value; 7 struct list *next; 8 } list; 9 10 int main() 11 { 12 list *l = NULL; 13 14 list *t = (list*) malloc(sizeof(list)); 15 t->value = 99; 16 t->next = NULL; 17 18 list *tt = (list*) malloc(sizeof(list)); 19 tt->value = 999; 20 tt->next = NULL; 21 22 23 if(l == NULL) 24 l = t; 25 26 printf("%p\n", l->next); 27 l->next = tt; 28 29 return 0; 30 31 }
Kompiliert nicht mit dem Hinweis, dass ich inkompatible Zeigertypen in Zeile 27 verwende.
Auch hier frage ich mich, wieso das der Fall ist.
l sollte ja nun dorthin zeigen, wo t hingezeigt hat.
Das dürfte ja dann ein valides Listenelement sein.Dieses müsste dann auch einen Zeiger auf ein weiteres Listenelement besitzen.
und wenn ich schreibe l->next = tt müsste dieser next-Zeiger doch verändert worden sein?
-
Das liegt da dran, dass du keine Ahnung hast, was
typedef struct {/*irgendwas*/} foo;
bedeutet. Das definiert ein namenloses struct und gleichzeitig einen typedef, dass foo von nun an ein alternativer Name für dieses struct ist. Hingegen:
struct foo {/*irgendwas */};
Dies definiert ein struct namens struct foo. Danach könnte man mit
typedef struct foo foo;
ein typedef von struct foo auf den Bezeichner foo machen. Hingegen:
struct {/*irgendwas*/} foo;
deklariert eine Variable namens foo vom Typ des vorstehenden namenlosen structs. Hingegen:
struct foo {/*irgendwas*/} foo;
deklariert eine Variable namens foo vom Typ struct foo.
Hier fragt in letzter Zeit dauernd ein Unregistrierter mit einer verketteten Liste der immer dieses Problem oder ein ganz ähnliches Problem hat. Bist das immer du? Wie wäre es mal mit Lernen statt Abschreiben?
c.rackwitz schrieb:
Wenn du selber Code schreibst, musst du ihn auch verstehen. Code ist kein Haufen von wahllos zusammengeschmissenen Buchstaben und Zeichen, Code ist Logik pur. Du musst genau wissen, warum du wo und welches Zeichen setzt.
-
Hallo Seppj.
Wenn du in letzter Zeit heute meinst und in diesem Thread, dann hast du Recht.
Ansonsten handelt es sich wohl um jmd anderes.Verkettete Listen sind ziemlich Standard für den Einstieg und es werden sich sicherlich mehr Anfänger damit herumschlagen.
Aber dennoch danke, es war jetzt recht offensichtlich dass ich ich vor dem typedef der Struktur noch einen Namen (oder in meinem Fall den selben Namen wie im typedef) geben sollte.