c语言链表按输入顺序输出怎么理解


include <stdio.h>
//submit C++
struct Node{
    int data;
    Node *next;
};
void createList(Node *&head){
    Node *t,*tail=head;
    int x;
    while(scanf("%d",&x)==1&&x){
        t=new Node;
        t->data=x;
        t->next=tail->next;
        tail->next=t;
        tail=t;
    }    
}
void print(Node *&head){
    Node *p=head->next;
    while(p){
        printf("%d ",p->data);
        p=p->next;
    }
    printf("\n");    
}
int main(){
    Node *head;
    head=new Node;
    head->next=NULL;
    createList(head);
    print(head);
    return 0;
}

这里面函数createList我无法理解, tail=t;不是直接把tail->next=t;覆盖了吗?但删去就不对了,而且这个head->next为null啊,怎么能形成链表呢?

tail->next=t
这个意思是将t结点插入到tail结点之后,
tail=t
这个是移动tail指针,让他指向他的下一个结点,这样每插入一个结点t,都会插入到上个结点之后,也就是按顺序建表(尾插法)

这是尾插法,新产生结点链接在链表的最末尾结点的->next。tail 是某一个结点的头部指针,taile->next 是某个结点的尾指针,指向下一个结点的头指针。

如果要使输出的顺序是输入的顺序,那么就要用尾插法,tail表示头结点,头结点一般不会有数据,就只是一个空的结点,他的指针指向空,创建一个新的结点后,将结点的指针指向新建立的这个结点,然后将头结点后移,以此类推,就建立了一个链表