2016-11-12 2 views
-2

Grundsätzlich versuche ich im folgenden Code einige Namen und einige Altersstufen in eine Liste einzufügen und auszudrucken. Mein Programm druckt jedoch nur den Nachnamen und das Alter der Liste. Irgendwelche Vorschläge?Druckelemente einer Liste in C

#include <stdio.h> 
#include <stdlib.h> 
/* these arrays are just used to give the parameters to 'insert', 
    to create the 'people' array 
*/ 

#define HOW_MANY 7 
char *names[HOW_MANY]= {"Simon", "Suzie", "Alfred", "Chip", "John", "Tim", 
       "Harriet"}; 
int ages[HOW_MANY]= {22, 24, 106, 6, 18, 32, 24}; 

typedef struct person 
{ 
    char *name; 
    int age; 
    struct person *next; 
}Person; 

Person *headp = NULL; 
static Person* insert(Person *p, char *name, int age) 
{ 
    p = (Person*)malloc(sizeof(Person)); 
    if (p == NULL) 
    abort(); 
    p->name = name; 
    p->age = age; 
    p->next = headp; 
    return p; 
} 

int main(int argc, char **argv) 
{ 
    Person *people=headp; 
    for (int i = 0; i < 7; i++) 
    { 
    people = insert (people, names[i], ages[i]); 
    } 
    while (people != NULL) 
    { 
    printf ("name: %s, age: %i\n", people->name, people->age); 
    people= people->next; 
    } 
    return 0; 
} 

Antwort

0

Möglicherweise müssen headp-people neu zuzuweisen, wenn Sie Einfügen getan werden, weil sonst die people Zeiger noch auf die letzte Person Punkte (weil Sie den people Zeiger in jedem Einsatz voran).

2

Sie überschreiben die übergebene Variable p mit der Adresse von malloc zurück (Speicherleck und Sie verlieren den vorherigen Kopf), Änderung:

static Person *insert(Person *head, char *name, int age) 
{ 
    Person *p = malloc(sizeof(Person)); /* Don't cast malloc */ 

    if (p == NULL) 
    abort(); 
    p->name = name; 
    p->age = age; 
    p->next = head; 
    return p; 
} 
+0

Es funktioniert .... aber es druckt die Elemente in umgekehrter Reihenfolge ... ie das erste Element ist das letzte ... –

+0

Dann ändern Sie 'für (int i = 0; i <7; i ++)' zu 'für (int i = 6; i> = 0; i -)' –

+2

@ RalucaDamarisLupeş : Wie ist das überraschend? Sie haben Ihre 'insert'-Funktion so entworfen, dass sie sich wie' prepend' anstatt als 'append' verhält. –