LinkedList erstellen
-
Hallo zusammen,
ich möchte eine Funktion erstellen, die als Parameter einen int-Wert erhält und die Zahlen 0 bis n in eine LinkedList einfügt.
Mein Programm führt jedoch immer zu einem Absturz, wenn ich auf ein Listenelement zugreifen möchte und den Wert abfrage.
//Struktur erstellen struct node{ int value; struct node *next; }; //Mein Anfangselement node *head; typedef struct node node; //Liste mit n-Werten erstellen und als Rückgabewert soll das erste Element der Liste zurückgegeben werden. node* createList(int val){ node *current; current = head; int counter = 0; while(counter == val){ current = (node*)malloc(sizeof(node)); if(head == NULL){ head = (node*)malloc(sizeof(node)); head = current; current->value = counter; current = current->next; } current->value = counter; current = current->next; counter++; } return head; } // Liste durchiterieren und den Wert jeweils ausgeben void printList(node *myList){ node *current = head; while(current->next != NULL){ printf("%d", current->value); current = current->next; }
Vielen Dank im voraus!
-
head wird wahrscheinlich nach wie vor NULL sein, du dereferenzierst es aber fröhlich.
Ein paar allgemeine Tipps:
-Hier im Forum ist es besser, wenn du ein minimales, compilierbares Beispiel für deinen Fehler präsentierst. Etwas, das man einfach kopieren und compilieren kann, um deinen Fehler nach zu vollziehen, das aber keinen unnötigen Code enthält.
-Mit einem Debugger kann man solche Fehler ganz leicht nachvollziehen. Daher ist ein compilierbares Minimalbeipsiel auch so nützlich für potentielle Helfer.
-Beim Programmieren keine globalen Variablen benutzen. Dein Programm ist ein Paradebeispiel dafür wie man es nicht macht und warum.
-Funktionen sollten eine klar definierte Aufgabe haben und diese und nur diese erfüllen. Dein createList macht eine wilde Mischung aus Iteration über Werte, Speicherverwaltung und Listenlogik. Hättest du für alle diese Dinge eine Funktion, die sich nur diesem einen Ding widmen würde, könntest du diese viel besser testen und Fehler einfacher finden oder im Vorhinein ganz vermeiden.
-Der Ausdruck im Kopf einer while-Schleife ist eine Laufbedingung, keine Abbruchbedingung! while = solange. Das gilt auch für alle anderen Schleifen.
-
Du forderst Speicher an und überschreibst den (einzigendarauf zeigenden) Zeiger gleich wieder.
Das gibt SPeicherlecks.Du greifst nirgend schreiben auf current->next zu. Du weißt, wofür das da ist?
Deine Ausgabe ist falsch!
Dein läuft so: "Wenn das nächste Element nicht existiert, dann gib das aktuelle nicht aus."Wenn dir der Debugger (noch) nicht liegt, dann bau ein paar
printf
ein. Der Formatspecifier für Zeiger ist %p
-
Hallo,
danke euch erstmal für die Hilfe! Ich habe nochmal alles von vorne angefangen und konnte das Problem lösen.
Ich stehe nun vor einem neuen Problem und möchte hierfür nicht extra einen neuen Thread eröffnen. Es geht um das löschen eines Knoten in einer Liste.
Ich möchte als Parameter die Liste und einen int-Wert angeben und der Knoten mit dem entsprechenden Wert gelöscht wird. Anschließend soll die neue Liste zurückgegeben werden.
Ich hänge an einer Stelle und zwar, wenn das aller erste Element in der Liste gelöscht werden soll. Da passiert leider nichts in meinem Fallnode *deleteElem(node *list, int value) { node *current = list; if (list->value == value) { list = list->next; return list; } while (current->next != NULL) { if (current->next->value == value) { current->next = current->next->next; return list; } else { current = current->next; } } return list; }
Vielen Dank im voraus!
-
Wie rufst du die Funktion auf?
Wo ist das
free
?