Anfänger-Problem: Liste
-
Hallo,
Lerne gerade C und stehe noch ganz am Anfang. Ich habe hier eine verkettete Liste programmiert,in die Zahlen am Ende eingefügt und am Anfang entfernt werden sollen aber sie kompiliert nicht. Ich bekomme immer nur "Laufzeitfehler" Mehr steht nicht dabei. Ich hoffe mir kann jemand helfen
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <stdbool.h> struct node { int data; struct node *next; }; struct node *head = NULL; struct node *current = NULL; int insertElement(int value) { struct node *link = (struct node*) malloc(sizeof(struct node)); link->data = value; //point it to old first node link->next = NULL; while(current->next != NULL) { //if it is last node if(current->next == NULL) { current->next = link; } else { //go to next link current = current->next; } } return 1; } int removeElement() { /* //save reference to first link struct node *tempLink = head; //mark next to first link as first head = head->next; //return the deleted link*/ return 1; } int main (int argc, char* argv[]) { printf("d"); printf("insert 47: %d\n", insertElement(47)); printf("insert 11: %d\n", insertElement(11)); printf("insert 23: %d\n", insertElement(23)); printf("insert 11: %d\n", insertElement(11)); printf("remove: %d\n", removeElement()); printf("remove: %d\n", removeElement()); exit(EXIT_SUCCESS); }
-
Oh, das ist der Code, den ich eigentlich senden wollte...
[code="c"]
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <stdbool.h>struct node {
int data;
struct node *next;
};struct node *head = NULL;
struct node *current = NULL;int insertElement(int value) {
struct node *link = (struct node*) malloc(sizeof(struct node));
link->data = value;
//point it to old first node
link->next = NULL;while(current->next != NULL) {
//if it is last node
if(current->next == NULL) {current->next = link;
} else {
//go to next link
current = current->next;
}
}return value;
}int removeElement() {
//save reference to first link
struct node *tempLink = head;//mark next to first link as first
head = head->next;//return the deleted link
return tempLink->data;
}int main (int argc, char* argv[]) {
printf("d");
printf("insert 47: %d\n", insertElement(47));
printf("insert 11: %d\n", insertElement(11));
printf("insert 23: %d\n", insertElement(23));
printf("insert 11: %d\n", insertElement(11));printf("remove: %d\n", removeElement());
printf("remove: %d\n", removeElement());exit(EXIT_SUCCESS);
}[/quote]
-
Entschuldigung, jetzt wurde der Code nicht richtig dargestellt.
supermex schrieb:
Oh, das ist der Code, den ich eigentlich senden wollte...
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <stdbool.h> struct node { int data; struct node *next; }; struct node *head = NULL; struct node *current = NULL; int insertElement(int value) { struct node *link = (struct node*) malloc(sizeof(struct node)); link->data = value; //point it to old first node link->next = NULL; while(current->next != NULL) { //if it is last node if(current->next == NULL) { current->next = link; } else { //go to next link current = current->next; } } return value; } int removeElement() { //save reference to first link struct node *tempLink = head; //mark next to first link as first head = head->next; //return the deleted link return tempLink->data; } int main (int argc, char* argv[]) { printf("d"); printf("insert 47: %d\n", insertElement(47)); printf("insert 11: %d\n", insertElement(11)); printf("insert 23: %d\n", insertElement(23)); printf("insert 11: %d\n", insertElement(11)); printf("remove: %d\n", removeElement()); printf("remove: %d\n", removeElement()); exit(EXIT_SUCCESS); }
[/quote]
-
supermex schrieb:
Ich habe hier eine verkettete Liste programmiert,in die Zahlen am Ende eingefügt und am Anfang entfernt werden sollen aber sie kompiliert nicht. Ich bekomme immer nur "Laufzeitfehler" Mehr steht nicht dabei.
Entscheide dich! "Kompiliert nicht" und "Laufzeitfehler" schließen sich beide aus. Der Erste stritt zum Übersetzungszeitpunkt (compile time) ein, diese (unter anderem) muss erfolgreich durchlaufen, damit das Programm überhaupt eine Laufzeit hat, in der es einen Fehler hat.
(Jetzt bitte keinen Verweis darauf, dass du noch Anfänger bist. Wir können lesen. Solche Unterschiede sollte einem das Buch/der Lehrer bei Listenprogrammierung beigebracht haben. Wenn nicht, Buch/Lehrer wegwerfen).
Dass nur "Laufzeitfehler" als Fehlermeldung erscheint, bezweifele ich stark. Abhängig vom System solltest du Debuggingmöglichkeiten haben - unter Linux wird der Core gedumbt, den kannst du mit
gdb
analysieren. Unter Windows wird (anscheinend? kenne mich mit der Plattform wenig aus) ein Crash Dumb generiert, den du analysieren kannst. (EDIT:) Notfalls gehe halt schrittweise durch ein Programm, bis der Crash auftritt, Visual Studio kann das.Ein solcher Debugger würde dir dann sagen, welche Zeile den Fehler hervorruft. Und damit findest du den Fehler in 5 Sekunden.
Jetzt nicht fragen, wie man das macht. Die Stichworte hast du bereits, dazu gibt es Tonnen an Dokumentation. Nicht, fragen, suchen!
Unabhängig davon: globale Variablen sind blöd (wenn du was anderes gelernt hast - siehe Wegwerfverhalten bezüglich Lernmaterialien und Tutoren oben), mache deine Einrückung vernünftig, setze nicht überall Leerzeilen, sondern da, wo sie die Lesbarkeit erhöhen, und wenn möglich, verwende
sizeof
nie mit einem Typen, sondern mit einer Variable (sizeof(*link)
). Wennmain
keine Parameter erwartet, dann definiere es direkt alsint main(void)
. Kompiliere immer mit höchster Warnstufe.Was soll
printf("d");
bewirken?
-
supermex schrieb:
/* ... */ exit(EXIT_SUCCESS); } /* main() */
Ja nee, oder??