这结果怎么显示链表越来越短,在代码中从哪看出来的?

 #include<stdio.h>
#include<stdlib.h>
typedef struct list
{
    int data;
    struct list *next;
}SLIST;
void fun(SLIST *p)
{
    SLIST  *t, *s;
    t=p->next;    s=p;
    while(t->next != NULL)
    {
        s=t;
        t=t->next;
    }
    printf(" %d ",t->data);
    s->next=NULL;
    free(t);
}
SLIST *creatlist(int  *a)
{
    SLIST *h,*p,*q;      int  i;
    h=p=(SLIST*)malloc(sizeof(SLIST));
    for(i=0;i<8;i++)
    {
        q=(SLIST*)malloc(sizeof(SLIST));
        q->data=a[i];  p->next=q;  p=q;
    }
    p->next=NULL;
    return h;
}
void outlist(SLIST  *h)
{
    SLIST *p;
    p=h->next;
    if(p==NULL)
        printf("\nThe list is NULL!\n");
    else
    {
        printf("\nHead");
        do 
        { 
           printf("->%d",p->data);  p=p->next;  
        } 
        while(p!=NULL);
        printf("->End\n");
    }
}
void main()
{
    SLIST  *head;
    int  a[8]={11,12,15,18,19,22,25,29};
    head=creatlist(a);
    printf("\nOutput from head:\n");  outlist(head);
    printf("\nOutput from tail: \n");
    while (head->next != NULL)
    {
        fun(head);
        printf("\n\n"); printf("\nOutput from head again :\n");  
        outlist(head);
    }
}

图片说明

fun函数每次删掉最后一个节点。


 void fun(SLIST *p)
{
    SLIST  *t, *s;
    t=p->next;    s=p;
    while(t->next != NULL)
    {
        s=t;
        t=t->next;
    }
    printf(" %d ",t->data);
    s->next=NULL;//置为NULL,标志s为末尾
    free(t);//释放原来的末尾
}