关于链表的一个小问题

#include
#include
#include

typedef struct node
{
    unsigned char elem;
    node* next;
};

void print_linklist(void);
void create_list(unsigned char elem);

node* head = NULL;
node* tail = NULL;

void create_list(unsigned char elem)
{
    node* p = (node*)malloc(sizeof(node));
    p->elem = elem;
    p->next = NULL;

    if (head == NULL)
    {
        head = p;
    }
    else
    {
        tail->next = p;

    }

    tail = p;
}

void print_linklist(void)
{
    struct node* p;

    for (p = head; p; p = p->next)
        printf("%c", p->elem);

    printf("\n");
}

请问一下大家,这段代码中的head不是一直等于第一次创建的p吗?那它的next不是一直为NULL吗,那为什么后续可以通过head里的next来不断访问后续的内容呢?看了半天实在 不明白,希望xdm看看,谢谢!

1.head如果是空,就把它设置成p,如果不是空,就不设置成p,所以head会保持一直是首节点的地址,而不会随着节点的增多不断的指向新的地址
2.一开始的时候,head和tail都指向了p,当又新增节点的时候,tail->next = p;此时head与tail地址相同,head的next不也指向p了吗
3.最后tail=p,head与tail不再指向同一个地址了,此时head->next指向p,tail指向p,tail->next指向空
4.你能问出这样的问题来,说明你没有真正理解指针到底是个什么玩意,还以为指针跟整型变量一样里面存了个值吗

因为33行有tail = p,head虽然一直等于p不动,但tail=p后,tail相当于head,会一直向后移动,从而把链表串联起来