linked list in c

hallo C Freunde!

ich schon wieder ;)

Ich habe da mal ein paar fragen zur linked list...

Habe mir nun einige Beispiele Angeschaut zum Beispiel :

C-Programmierung: Verkettete Listen
http://de.wikibooks.org/wiki/C-Programmierung:_Verkettete_Listenhttp://perlgeek.de/de/artikel/einfach-verkettete-listen

und denke auch das ich diese gut verstanden habe.

Allerdings arbeiten diese Beispiele immer nur mit einem Èlment ich habe aber eine Liste an sich die ein letztes und erstes Element besitzt und ein Element das sieht so aus :

Code:
struct element
{
    char d[20];
    int val;
    struct element* next;

};


struct list
{
    struct element* first;
    struct element* last;
};
So weit so gut die Liste initialisiere ich nun mit einer init Funktion
Code:
void init(struct list *list)
{
    list->first = NULL;
    list->last = NULL;
}
hier wird alles auf NULL gesetzt da die liste im Moment ja noch leer ist.
Als nächstes versuche ich ein Element einzufügen :

Code:
void insert(struct list *list, int val, char* dat)
{
    struct element *newelement;
    struct list *list_itr = list;

    newelement = malloc(sizeof(newelement));
    newelement ->val = val;
    
    if(list_itr->first == NULL)
    {
        list_itr->first = newelement;
    }else
    {
        list_itr->last = newelement;
    }
   
}
Hier erstelle ich einfach ein neues Element und überprüfe ob an List->first schon ein Element steht falls nein weiß ich das die Liste leer ist und setze nun an betreffende Stelle mein neues Element. falls die liste nicht Lerr ist eben an letzte Stelle.

genau hier liegt anscheinend das Problem das Program spuckt mir bei ausführung immer segmentation fault entgegen. Was ja soviel bedeutet wie das er versucht auf einen ungültigen Speicherbereich zuzugreifen bzw auf etwas das nicht vorhanden ist und ich vermute Stark das meine If abfrage damit gemeint ist. Also ist die Frage wie greife ich auf das Element bzw das nicht vorhandene Element bei List->first zu ?

Als nächstes komme ich auch nicht so ganz mit der Iteration zu recht habe dazu folgende Funktion geschrieben:

Code:
void printlist(struct list *list)
{
    struct list *l = list;
    l = list;
    
    if(l->first !=NULL)
    {
        while(l->first->next->next != NULL)
        {
            l=l->first->next->next;
            printf("%d\n",l->val);
        }
    }

}
Vermute aber das das auch Falsch ist kann es leider nicht prüfen da ich so weit eben gar nicht komm.

Wäre nett wenn mir jemand etwas auf die Sprünge helfen könnte.

Viele Grüße und Danke im Vorraus
 
Kannst du bitte die Codeabschnitte posten, die zu deinem Aufruf für insert führen?
Ich habe die Vermutung, dass du evtl. list falsch übergibst. Am besten alles von der Deklaration der Variablen bis zum Aufruf von insert.

/Edith meint noch, dass du den Fehler durch debuggen oder Debug-Ausgaben genauer einschränken solltest, also ob es wirklich die if-Abfrage ist oder doch einer der Blöcke danach.
 
Zuletzt bearbeitet:
Hallo Lookshe!

also hier mal meine main :

Code:
int main(void)
{
    
    struct list *ll;
    
    char dat[]={"1.6.2011"};

    init(ll);
    
    insert(ll, 3,dat);

    //printlist(ll);

    return 0;

}

Das ist doch was du wolltest oder ? printlist ist übrignes auskommentiert weil mir der Compiler sagt L hat kein member namens val gemeint ist die zeile :
Code:
printf("%d",l->val);
Also muss ich schon was mit den Zeigern falsch machen.

PS: Da ich nur über Gedit Programmiere habe ich keine Debug Funktion betreibe also das gute alte printf debuging ;) naja alles wird ausgeben bis zu dem IF block in insert dann brichts ab es wird auch nichts ausgegeben was im IF block steht.
 
Was mir nur Mal so auffällt ist, dass deine Liste keinen Speicherbereich bekommt. "struct list *ll;" -> Der Zeiger zeigt auf einen undefinierten Speicherbereich und in init() befüllst du den auch noch mit ((long long) 0), ergo schreibst du _irgendwohin_.
Also erst Mal die Liste initialisieren: "struct list *ll=malloc(sizeof(struct list));" sollte es tun.

In deiner insert-Funktion ähnliches:
Code:
    struct element *newelement;
    newelement = malloc(sizeof(newelement));

Das Problem: newelement ist 4 Byte lang, d.h. du forderst mit malloc nur 4 Byte an, verwendest aber 28. Also hier auch "newelement = malloc(sizeof(struct element));"

Den Rest habe ich nur überflogen, an deiner insert-Funktion solltest du vielleicht noch eine Änderung machen, wenn es ein first-Element gibt, wird das last-Element überschrieben - ich nehme aber an, das hast du runtergekürzt oder noch nicht erweitert, um den Fehler einzugrenzen.

mfg Thunder
 
Zurück
Oben