Pointer für verkette Liste



  • Hallo 🙂

    Ich versuche eine verkette Liste in C zu implementieren um vorallem meine Fähigkeiten im Umgang mit Pointern zu verbessern.

    Dazu habe ich folgende Struktur:

    struct entry
    {
    	char name;
    	struct entry *next;
    
    }*start ;
    
    void addEntry(char** name)
    {
    	struct entry *current = start;
    	struct entry *new_entry = (struct entry*) malloc(sizeof(struct entry));
    	new_entry->name = *name;
    	new_entry->next = NULL;
    
    	while(current->next != NULL)
    		current = current->next;
    
    	current->next = new_entry;
    }
    

    Der start-Pointer soll den Anfang der Liste repräsentieren.
    Die addEntry-Funktion soll einen Wert übergeben bekommen, für welchen Ich dann ein neuen entry erzeuge und diesen hinten an hänge.

    Der Aufruf sieht etwa so aus:

    int main(void)
    {
    	char *ptr = "abc";
    	for(int i=66; i <=90; i++)
    	{
    		addEntry(ptr);
    	}
    
    	...
    }
    

    Was mache ich falsch?Was ist hier der richtige Lösungsansatz?

    Danke schonmal!



  • Zwei Sachen:
    1. Der Cast bei malloc ist unnötig
    2. addEntry erwartet einen char**, du übergibst ihm einen char*
    Beim nächsten mal schreibe bitte genau den Fehler dabei. Was du gemacht hast dürfte zu einem Segmentation Fault geführt haben. Hättest dud as dabeigeschrieben wäre die Fehlersuche wesentlich einfacher gewesen



  • Hab unten im Code par Dinge geändert, siehe Kommentare.

    struct entry 
    { 
        char* name; // Hier möchtest du wahrscheinlich einen string und nicht nur einen einzelnen character, darum char* verwenden
        struct entry *next; 
    
    }*start ; 
    
    void addEntry(char* name) // Hier willst du ja ein Array von characters übergeben, also nur ein * und nicht zwei
    { 
        struct entry *current = start; 
        struct entry *new_entry = (struct entry*) malloc(sizeof(struct entry)); 
        new_entry->name = name; // Hier kannst du dann den Dereferenzierungsoperator * weglassen
        new_entry->next = NULL; 
    
        while(current->next != NULL) 
            current = current->next; 
    
        current->next = new_entry; 
    }
    
    int main(void) 
    { 
        char *ptr = "abc"; 
        for(int i=66; i <=90; i++) 
        { 
            addEntry(ptr); 
        } 
    
    }
    

    Scheint so zu funktionieren. Habs aber nicht getestet.



  • Hallo,

    Danke für die schnelle Hilfe!

    Nachdem ich den code gemäß eurer Anweisung folgend modifiziert habe, sieht er so aus:

    struct entry
    {
    	char *name;
    	struct entry *next;
    
    }*start ;
    
    void addEntry(char* name)
    {
    	struct entry *current = start;
    	struct entry *new_entry = (struct entry*) malloc(sizeof(struct entry));
    	new_entry->name = name;
    	new_entry->next = NULL;
    
    	while(current->next != NULL)
    		current = current->next;
    
    	current->next = new_entry;
    }
    
    int main(void)
    {
    	char *ptr = "abc";
    	for(int i=66; i <=90; i++)
    	{
    		addEntry(ptr);
    	}
    
    	....
    
    }
    

    Gibt er quasi noch eine Warnung:

    verkette_liste.c:46: Warnung: veraltete Konvertierung von Zeichenkettenkonstante in »char*«
    

    Wie sollte man hier denn eigentlich vorgehen?Will ja sauberen Code produzieren!

    Außerdem bekomme ich leider noch einen Segmenation Fault



  • verkette_liste.c:46: Warnung: veraltete Konvertierung von Zeichenkettenkonstante in »char*«
    

    Der Fehler ist in Zeile 46. Also sind die ... falsch.



  • Tja, dann sei froh, dass es knallt.
    So bemerkst du wenigstens Fehler.
    Und der Fehler wird beim Deferenzieren eines NULL Zeigers geworfen, d.h. also beim erstmaligen

    current->next
    

Log in to reply