c++链表后插法的问题

就是为什么这个对链表的遍历只输出最后一个插入的数字?


#include<iostream>
using namespace std;
typedef struct sqlist{
    int data;
    sqlist *next;
    int size;//链表长
}*linklist;
void initlist(linklist &L) //初始化链表
{
    L=new sqlist;
    L->size=0;
    L->next=NULL;
}
void enlist(linklist &L,int n,int *e) //尾插法,n是插入的数组的个数,*e是要传入的数组
{
    linklist p,r;
    r=L;
    for(int i=0;i<n;i++)
    {
        p=new sqlist;
        p->data=e[i];
        p->next=NULL;
        r->next=p;
        r=p;
        L->size++;
    }
}
void addrear(linklist &L,int e)//在链表尾端只插入一个整型数
{
    int a[1]={e};        //创建一个容量为1整型数组将它插入到尾端
    enlist(L,1,a);     //调用尾插法函数
}
int main()
{
    linklist L;
    initlist(L);
    //尾部分别插入三个数字,分三步
    addrear(s3,1);
    addrear(s3,2);
    addrear(s3,3);
    //下面是遍历上面的那个链表
    linklist p=s3->next;
    while(p!=NULL)
    {
        cout<<p->data;    //现在的问题是这个对链表的遍历只输出最后一个插入的数字
        p=p->next;
    }
}

s3有进行初始化吗? enlist(linklist &L,int n,int *e)你这个L是尾节点吗?不是尾节点那怎么尾插?