能不能看看我那里错了 没输出

问题遇到的现象和发生背景

没有输出
题目如下
设计函数求一元多项式的导数。

输入格式:
以指数递降方式输入多项式非零项系数和指数(绝对值均为不超过1000的整数)。数字间以空格分隔。

输出格式:
以与输入相同的格式输出导数多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。

用代码块功能插入代码,请勿粘贴截图
#include 
#include 

typedef struct S
{
    int xi;
    int zhi;
    struct S *next;
}S,*list;
list createlist()
{
    list L1=(list)malloc(sizeof(struct S));
    L1->next=NULL;
    list p,q;
    q=L1;
    int xi,zhi;
    while(scanf("%d %d",&xi,&zhi)!=EOF)
    {
        p=(list)malloc(sizeof(struct S));
        p->xi=xi;
        p->zhi=zhi;
        p->next=NULL;
        q->next=p;
        q=p;
    }
    return L1;
}
list qiudao(list L1)
{
   list q=L1,L2,p;
   L2=(list)malloc(sizeof(struct S));
   L2->next=NULL;
   p=L2;
   while(q->next!=NULL)
   {
       if(q->next->zhi==0)
       {
           free(q->next);
       }
       if(q->next->zhi!=0)
       {
          q->next->xi=q->next->xi*q->next->zhi;
          q->next->zhi=q->next->zhi-1;
          p->next=q->next;
          p=q;
       }
       q=q->next;
   }
   return L2;
}
list printlist(list L1)
{
    list p=L1;
    if(p->next==NULL)
    {
        printf("0 0");
        return 0;
    }
    while(p->next!=NULL)
    {
        printf("%d %d " ,p->xi,p->zhi);
        p=p->next;
    }
}
int main()
{
   list L1=createlist();
   list L2=qiudao(L1);
   printlist(L1);
   return 0;
}

运行结果及报错内容

没有输出

while(p->next!=NULL)
{
printf("%d %d " ,p->next->xi,p->next->zhi);
p=p->next;
}

而且最后应该是 printlist(L2);啊啊