Warum geht meine Liste nicht?
-
Ich versuche eine Liste mit 2 Elementen nach dem Muster auf Wikipedia zu erstellen allerdings komm ich mit meinen Zeigern nicht klar.
#include <stdio.h> #include <stdlib.h> struct element { int value; // der Wert des Elements struct element *next; // das nächste Element }; void printliste(struct element *l) { struct element *liste; liste=l; printf ("%d\n", liste->value); while (liste->next != NULL) { liste=liste->next; printf ("%d\n", liste->value); } } void append(struct element **liste, int value) { struct element *nElement; struct element *node = *liste; nElement = (struct element*) malloc(sizeof(*nElement)); // erzeuge ein neues Element nElement->value = value; nElement->next = NULL; // Wichtig für das Erkennen des Listenendes if ( node != NULL ) { // sind Elemente vorhanden while (node->next != NULL ) // suche das letzte Element node=node->next; node->next=nElement; // Hänge das Element hinten an } else // wenn die liste leer ist, bin ich das erste Element *liste=nElement; } int main() { struct element *Liste; Liste = NULL; // init. die Liste mit NULL = leere liste append(&Liste, 1); // füge neues Element in die Liste ein append(&Liste, 3); // füge neues Element in die Liste ein append(&Liste, 2); // füge neues Element in die Liste ein printliste(Liste); // zeige liste an return EXIT_SUCCESS; }
und hier ist mein Versuch:
#include<stdlib.h> #include<stdio.h> struct elem { int value; struct elem *next; }; int main() { struct elem *liste, *element; liste = NULL; //hier wird ein Fehler angezeigt //ich versuche den Zeiger node auf die adresse von liste zeigen zu lassen struct element *node = liste; element = (struct elem*) malloc(sizeof(*element)); element->value = 9; element->next = NULL; liste = element; element = (struct elem*) malloc(sizeof(*element)); element->value = 8; element->next = NULL; //beide nachfolgende anweisungen werden als falsch angezeigt /*hier versuche ich dem next welches im Moment auf NULL steht das neue element zuzuweisen*/ node->next = element; //hier soll node nun auf das angehängte Listenelement zeigen node = node->next; printf("%d %d", liste->value, liste->next->value); system("pause"); return 0; }
ich verstehe nicht warum es nicht geht!
Wenn ihr antwortet erklärt mir bitte ausführlich was da falsch ist und nicht nur das es falsch ist, denn das weiß ich selber
Danke im Voraus.
-
Da du keine Fehlermeldung nennst, rate ich mal: Du benutzt C nach 1989er Standard (zum Beispiel Microsoft Compiler), da ist es nicht erlaubt, Variablen im Block zu definieren.
-
Zu Zeile 16:
gibt es denn bei dir eine struct element?
-
stimmt sollte struct elem heißen
so nun bekomme ich keine Fehlermeldungen mehr allerdings hängt sich das Programm beim ausführen sofort auf ohne eine Fehlermeldung etc.
Ich nutze MinGW und daraus den gcc ohne zusätzliche Parameter - vermute, dass er dann automatisch den c99 Standard nutzt - weiß es aber nicht!
Wäre nett wenn ihr mir helfen könntet.
-
int main() { struct elem *liste, *element; liste = NULL; struct elem *node = liste; // node zeigt jetzt auf NULL element = (struct elem*) malloc(sizeof(*element)); element->value = 9; element->next = NULL; liste = element; // liste zeigt jetzt auf element element = (struct elem*) malloc(sizeof(*element)); element->value = 8; element->next = NULL; printf("liste:%p node:%p", liste, node); node->next = element; // wo zeigt denn node hin? siehe Zeile 6 node = node->next; printf("%d %d", liste->value, liste->next->value); system("pause"); return 0; }
-
alles klar jetzt seh ich den Fehler, denn node Zeigt immer noch auf NULL
Wie müsste ich node verändern, dass es funktioniert?
also irgendwie vermute ich, dass ich **node = &liste; machen muss, so dass er nicht auf Null sondern auf die Liste Zeigt und dann kann ich mit node auch irgendwie auf next zeigen
könnte es bitte iwer korrigieren, so dass es funktioniert ich mach da immer noch was falsch
-
habs
struct elem **node = &liste;
(*node)->next = element; node = &((*node)->next);
Danke an alle!
-
Zu umständlich.
Verzichte auf node.
-
und wie soll ich dann meinen anchor - liste wiederfinden?
-
Über die Variable liste
Dafür ist sie ja da.
-
wenn ich die variable liste verschiebe finde ich ja die wurzel nicht mehr oder ich muss eine doppelt verkettete Liste machen
-
Du sollst doch liste nicht verschieben. liste ist der Startpunkt
Du hast aber nur zwei Einträge in die Liste. Daher brauchst du node nicht.
Wenn doch, dann reicht ein
node = liste;
auch aus.