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) ). Wenn main keine Parameter erwartet, dann definiere es direkt als int main(void) . Kompiliere immer mit höchster Warnstufe.

    Was soll

    printf("d");
    

    bewirken?



  • supermex schrieb:

    /* ... */
    
    	exit(EXIT_SUCCESS);
    } /* main() */
    

    Ja nee, oder??


Log in to reply