Einfach verkettete Liste



  • Hey Leute 🙂
    Leider will meine selbst geschriebene Liste nicht so..
    Wenn ich ein element einfüge gehts ... wenn ich zwei einfüge gibt es einen Heap error....leider hab ich grad ein Brett vorm Kopf und suche schon Stunden nach dem Fehler....:/
    Wäre Super wenn mir jemand helfen könnte!

    Vielen Dank im vorraus!!!
    MFG

    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    
    typedef struct addr{
    	char name[20], address[256];
    	int age;
    	struct addr *next;
    }Adress_t;
    
    //Um dann einen Datensatz an dei Liste zu anzuhängen brauchen wir eine globale Variable
    Adress_t *first;
    
    Adress_t ElementEinfügen(char *name, char *address,int age)
    {
    	//Wenn die Liste, quasi First leer ist, ist das Einfügen recht einfach...
    	//sollte die Liste aber schon gefüllt sein, braucht man einen erneuten Zeiger der bist zum
    	//Ende der Liste läuft und das letzte Element sucht, an das angehangen werden kann!
    	Adress_t *ptr;
    	if(first ==NULL)
    	{
    		first = (Adress_t *) malloc(sizeof(first)); 
    		strcpy(first->name,name);
    		strcpy(first->address,address);
    		first->age=age;
    		first->next =NULL;  //Und nun lassen wir den Zeiger des neu eingefügten Elements wieder auf NULL zeigen um das Ende zu makieren
    
    	}
    	else
    		//Falls es doch schon Elemente in der Liste gibt, muss ersteinmal das letzte Element ermittelt werden. Hierfür verwenden wir den neuen Zeiger ptr.
    	{
    		ptr = first; //Wir setzten ihn an die gleiche Stelle wie den first Zeiger.
    		while (ptr != NULL) //Wir durchlaufen die Liste bis wir an der letzen Stelle angekommen sind. Dann verlassen wir die Schleife
    		{
    			ptr = ptr->next;
    		}
    		ptr->next =(Adress_t *) malloc(sizeof(ptr));
    		ptr=ptr->next; //Dann lass ich den ptr Zeiger wieder auf das nächste Element zeigen.
    		//Ich übergebe die Werte an das allokierte Element
    		strcpy(ptr->name,name);
    		strcpy(ptr->address,address);
    		ptr->age=age;
    		ptr->next =NULL;  
    
    	}
    	return *first;
    
    }
    void ausgeben()
    {
    	Adress_t *ptr;
    	ptr=first;
    	while(ptr !=NULL)
    	{
    
    	printf("%s %s %d",ptr->name,ptr->address,ptr->age);
    
    	ptr=ptr->next;
    	}
    
    }
    
    int main(void)
    
    {
    	//Adress_t neueAdress;
    	ElementEinfügen("Matthias","azf",'23');
    	//ElementEinfügen("Jonas","azf",'22');
    	//ElementEinfügen("Stef","azf",'13');
    	//ElementEinfügen("Roberts","azf",'43');
    	//ElementEinfügen("Paul","azf",'53');
    	//ElementEinfügen("Peters","azf",'63');
    	ausgeben();
    
    	return 0;
    
    }
    


  • Welchen Wert hat ptr in Zeile 38?
    Wenn du es nicht siehst, nimm den Debugger oder

    printf("ptr nach while: %p\n", ptr);
    


  • ich seh grad das der schon bei malloc beim debug sagt, dass der den Ausdruck gar nicht auswerten kann...
    sowohl bei adresse, als auch bei age usw...
    Wie kann das sein?



  • DirkB schrieb:

    Welchen Wert hat ptr in Zeile 38?

    Hast du das printf mal vor Zeile 38 eingebaut? Was kommt da raus?





  • Und sizeof(ptr) ist die Größe des Pointers (4 oder 😎 und nicht die Größe der struct.
    Das gilt ebenso für first.

    Da meinst du sizeof(*ptr) bzw. sizeof(*first)



  • Whereeaglesdare schrieb:

    ... hier ein screenshot

    Spaßvogel, da ist doch gar kein while.
    Das kommt erst im else-Zweig.



  • oh sorry... 😃
    Das passiert, wenn man nach stunden programmieren nur noch müde ist 😃



  • also wie sollte es aussehen?
    Könntest du den Code korrigieren? 😕
    Würde mir sehr helfen!! 😕
    Schreibe da bald ne Klausur und muss es wissen 😕

    Vielen Dank im schoneinmal!! 🙂



  • while (ptr != NULL) // Die Schleife wird verlassen, wenn ptr GLEICH NULL ist
            {
                ptr = ptr->next;
            }
            ptr->next = .... // Unde wenn ptr gleich NULL ist, dann funktioniert der Verweis natürlich nicht
    

    Das ist das Problem.

    Die Abbruchbedingung ist falsch.
    Du bist schon einen Schritt zu weit.

    Und überleg mal selber.
    Du willst in der Liste das Element haben, dessen next auf NULL zeigt.



  • verstehe ehrlichgesagt nicht warum dann z.b. in einem beispiel das so steht:

    while(zeiger != NULL) {
    printf("|%12s,%-12s| %02d.%02d.%04d|"
    "%02d.%02d.%04d|%06ld|\n",
    zeiger->name,zeiger->vorname,zeiger->alter.tag,
    zeiger->alter.monat,zeiger->alter.jahr,
    zeiger->eingest.tag,zeiger->eingest.monat,
    zeiger->eingest.jahr,zeiger->gehalt);

    zeiger=zeiger->next;
    }

    wüsste nicht, was ich anders gemacht habe:/



  • Da greifst du innerhalb der while-Schleife auf die Elemente zu.
    Und da gilt ja noch zeiger != NULL .

    Nur nach der Schleife ist dann auch zeiger gleich NULL.



  • Wenn man (spazieren) geht, dann macht man das normalerweise so:
    Solange die Stelle vor mir kein Loch ist, gehe ich weiter.

    Du machst aber:
    Solange die Stelle auf der ich gerade bin kein Loch ist, gehe ich weiter.

    Kleiner Unterschied, aber so fällst du rein, weil du nicht überprüfst, was vor die liegt.



  • achso 🙂
    Super vielen Dank für diese gute Hilfe!!!
    Ich schaue mir das morgen nochmal in Ruhe an!
    Aber langsam wird mir klar, was du meinst!!
    🙂

    DANKESCHÖN!!

    LG


Anmelden zum Antworten