Hello,

I'm trying to understand the logic of recursive structures (or is "linked list" much proper term?) and I have a problem with following code:

Code:
#include <stdio.h>
#include <stdlib.h>


struct person
    {
    const char *first_name;
    const char *last_name;
    int age;
    struct person *next;
    };

typedef struct person PERSON;


void add_new_person(PERSON **p_obj, const char *first_name, const char *last_name, int age)
    {
    PERSON *p = (PERSON *)malloc(sizeof(PERSON));
    p = *p_obj;

    if(p->next != NULL)
        p = p->next;

    p->first_name = first_name;
    p->last_name = last_name;
    p->age = age;

    p->next = (PERSON *)malloc(sizeof(PERSON));

    return;
    }


void show_persons(PERSON **p_obj)
    {
    PERSON *p = (PERSON *)malloc(sizeof(PERSON));
    p = *p_obj;

    if(p != NULL)
        {
        while(p->next != NULL)
            {
            printf("%s %s (age: %d years)\n"
                , p->first_name
                , p->last_name
                , p->age
                );

            p = p->next;
            }
        }

    return;
    }


int main(void)
    {
    PERSON *nice_person = (PERSON *)malloc(sizeof(PERSON));

    add_new_person(&nice_person, "Donald", "Duck", 122);
    add_new_person(&nice_person, "Jack", "Sparrows", 32);
    add_new_person(&nice_person, "Bruce", "Wayne", 40);
    add_new_person(&nice_person, "Gregory", "House", 55);
    add_new_person(&nice_person, "Luke", "Skywalker", 20);
    add_new_person(&nice_person, "Hannibal", "Lecter", 65);

    show_persons(&nice_person);

    return 0;
    }
I was hoping it prints out all six of the names, but the actual outpot is:

Code:
Donald Duck (age: 122 years)
Hannibal Lecter (age: 65 years)
(the first and the last item from the list).

I can't figure out what am I doing wrong here.