Letztes Element einer LinkedList



  • DAS Compiliert?

    void Create(LinkedList LinkedList)
    {
        LinkedList = NULL;
    }
    


  • nö - aber das akzeptiert mein Compiler:

    #include <stdio.h> 
    
    struct LinkedListElement 
    { 
        int value; 
        struct LinkedListElement *next; 
    }; 
    
    typedef struct LinkedListElement *LinkedList; 
    
    // Fuegt ein Element in die LinkedList ein 
    void Insert(int value, LinkedList LinkedList) 
    { 
        struct LinkedListElement *tmp = LinkedList; 
    
        LinkedList = malloc(sizeof(struct LinkedListElement)); 
        LinkedList->value = value; 
        LinkedList->next = tmp; 
    } 
    
    // Zeigt die Liste an 
    void Show(LinkedList LinkedList) 
    { 
        struct LinkedListElement *tmp = LinkedList; 
        while(tmp != NULL) 
        { 
            printf("%d\n", tmp->value); 
            tmp = tmp->next;    
        } 
    } 
    
    // Loescht die LinkedList 
    void Delete(LinkedList LinkedList) 
    { 
        struct LinkedListElement *tmp; 
        while (LinkedList != NULL) 
        { 
            LinkedList = LinkedList->next; 
            free(LinkedList); 
            LinkedList = tmp; 
        } 
    } 
    
    int main(void) 
    { 
        LinkedList Liste=NULL; 
    
        Insert(5, Liste); 
        Insert(10, Liste); 
        Insert(12, Liste); 
    
        Show(Liste); 
    
        Delete(Liste); 
    }
    

    was mach ich da falsch



  • Versuch mal das hier.

    /* 
        Code nach C99 (ISO/IEC 9899:1999) 
    */ 
    
    #include <stdio.h>
    #include <malloc.h>
    #include <stdio.h> 
    
    struct LinkedListElement 
    { 
        int value; 
        struct LinkedListElement *next; 
    }; 
    
    typedef struct LinkedListElement *LinkedList; 
    
    // Fuegt ein Element in die LinkedList ein 
    void Insert(int value, LinkedList *LinkedList) 
    { 
        struct LinkedListElement *tmp = (*LinkedList); 
    
        (*LinkedList) = (LinkedListElement*)malloc(sizeof(struct LinkedListElement)); 
        (*LinkedList)->value = value; 
        (*LinkedList)->next = tmp; 
    } 
    
    // Zeigt die Liste an 
    void Show(LinkedList LinkedList) 
    { 
        struct LinkedListElement *tmp = LinkedList; 
        while(tmp != NULL) 
        { 
            printf("%d\n", tmp->value); 
            tmp = tmp->next;     
        } 
    } 
    
    // Loescht die LinkedList 
    void Delete(LinkedList LinkedList) 
    { 
        struct LinkedListElement *tmp=NULL; 
        while (LinkedList != NULL) 
        { 
            LinkedList = LinkedList->next; 
            free(LinkedList); 
            LinkedList = tmp; 
        } 
    } 
    
    int main(void) 
    { 
        LinkedList Liste=NULL; 
    
        Insert(5, &Liste); 
        Insert(10, &Liste); 
        Insert(12, &Liste); 
    
        Show(Liste); 
    
        Delete(Liste); 
    
    	return 0;
    }
    

    *EDIT* Ein Include zuviel 🙄



  • ups... Zeiger auf Zeiger - da fällt mir jetzt wieder was ein



  • Netzwerk-Latenz schrieb:

    // Loescht die LinkedList 
    1: void Delete(LinkedList LinkedList) 
    2: { 
    3:    struct LinkedListElement *tmp=NULL; 
    4:    while (LinkedList != NULL) 
    5:    { 
    6:        LinkedList = LinkedList->next; 
    7:        free(LinkedList); 
    8:        LinkedList = tmp; 
    9:    } 
    10:}
    

    ist das nicht ein Memory Leak?

    in Zeile 8 setzt du LinkedList auf den Wert NULL - damit ist die Schleife beendet - es wird maximal einmal free aufgerufen



  • // Loescht die LinkedList 
    void Delete(LinkedList *LinkedList) 
    { 
    	struct LinkedListElement *tmp  = NULL;
    	while(*LinkedList != NULL)
    	{
    		tmp = (*LinkedList)->next;
    		free(*LinkedList);
    		*LinkedList = tmp;
    	}
    }
    

    irgendwie funzt das auch wieder nicht - kann aber keinen fehler erkennen...



  • // Loescht die LinkedList 
    void Delete(LinkedList LinkedList) 
    { 
        struct LinkedListElement *tmp=NULL;
    
        while (LinkedList != NULL) 
        { 
    		tmp = LinkedList->next;
            free(LinkedList); 
            LinkedList = tmp; 
        } 
    }
    

    Und so.



  • Die Funktion Delete bekommt ja bei deiner Version nur eine Kopie der Adresse geliefert, wobei bei meiner Version call by reference stattfindet - ich will die übergebene liste nachdem ich sie "deletet" habe auf NULL setzten - das geht halt nur wenn ich call by reference mach



  • kann mir jemand meinen Fehler bei Folgender Funktion sagen (der Funktionskopf soll nicht verändert werden):

    // Loescht die LinkedList 
    void Delete(LinkedList *LinkedList) 
    { 
        struct LinkedListElement *tmp  = NULL; 
        while(*LinkedList != NULL) 
        { 
            tmp = (*LinkedList)->next; 
            free(*LinkedList); 
            *LinkedList = tmp; 
        } 
    }
    


  • Ich finde, du solltest erstmal ausschlafen, oder alternativ das Kapitel Zeiger (inkl. * und -> Operatoren) nochmal überfliegen. Das kann eigentlich nicht sein, dass man solche Fehler nicht selber findet.


Anmelden zum Antworten