2016-11-12 2 views
-2

В приведенной ниже программе я пытаюсь вставить элементы в конце списка и распечатать их. Однако я получаю ошибку сегментации в if (headp-> next == NULL). Что я делаю не так ? Какие-либо предложения? Спасибо!Вставка элемента в конце списка в 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; 
    static Person* insert_end(Person *headp, char *name, int age) 
    { 
     Person *p = malloc(sizeof(Person)); 
     if (p == NULL) 
     abort(); 
     p->name = name; 
     p->age = age; 
     if (headp->next == NULL) 
     { 
     headp->next = p; 
     return p; 
     } 
     else 
     { 
     Person *current = headp; 
     while(current->next != NULL) 
     { 
      current = current->next; 
     } 
     current->next = p; 
     return p; 
     } 

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

запустить свой код под отладчиком. –

+1

Запустите его в отладчике, и вы увидите, что –

+1

спросите себя: первый элемент (people1) имеет значение null, но в следующий раз он имеет еще один следующий? когда заголовок был выделен? (ответ: никогда), сначала убедитесь, что ваш первый элемент выделен, а затем перейдите – LiorA

ответ

0

Первоначально, когда список пуст, то headp равно NULL.

Таким образом, эти заявления

if (headp->next == NULL) 

и

while(current->next != NULL) 

непредсказуемый результат.

Также вы забыли инициализировать NULL элементом данных next присоединенного узла.

Функция может быть написана более простым

static int insert_end(Person **headp, char *name, int age) 
{ 
    Person *p = malloc(sizeof(Person)); 
    int success = p != NULL; 

    if (success) 
    { 
     p->name = name; 
     p->age = age; 
     p->next = NULL; 

     wjile (*headp) headp = &(*headp)->next; 

     *headp = p; 
    } 

    return success; 
} 

И функция может быть вызвана как

size_t i = 0; 

while (i < sizeof(names)/sizeof(*names) && 
     insert_end(&people1, names[i], ages[i])) i++