用C语言解决一元多项式求导的问题,要求用单链表解决,为什么我这个的输出这么奇怪?

实验要求
(1)输人说明:以指数递降方式输人多项式非零项系数和指数(绝对值均为不超过1000的整数)。数字间以空格分隔。
(2)输出说明:以与输入相同的格式输出导数多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。
(3)测试用例:图片说明

这是我的代码:

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
typedef struct Link{
    int c;
    int e;
    struct Link *next; 
}LinkNode;
void InitList(LinkNode *&L){
        L=(LinkNode *)malloc(sizeof(LinkNode));   
        L->next=NULL;
 }//建立头结点 

void CreateListF(LinkNode *&L,int n)
{   void InitList(LinkNode *&L);
    InitList(L);
    LinkNode *s,*r;
    int i;
    L=(LinkNode *)malloc(sizeof(LinkNode));  
    r=L;        
    for (i=0;i<n;i++){  
        s=(LinkNode *)malloc(sizeof(LinkNode));
        r->next=s;  
        r=s;
        scanf("%d %d ",&s->c,&s->e);
        }
    r->next=NULL;
}//建立链表
void change(LinkNode *L){
    LinkNode *p=L;
    while(p!=NULL){ 
        p=p->next;
        p->c=(p->e)*(p->c);
        p->e=(p->e)-1;
        if(p->next==NULL){
            p->c=0;
            p->e=-1;
            }
    }
    free(p);
}//求导函数 
void DispList(LinkNode *L,int n){
    int i=0;
    LinkNode *p=L->next;
    printf("求导后的系数和指数");  
    while (i<n) {   
        printf("%d %d ",p->c,p->e);
        p=p->next;
        i++;        
        }
    printf("\n");
}//输出链表
void DestroyList(LinkNode *&L){   
        LinkNode *pre=L,*p=L->next;
        while (p!=NULL) {     
            free(pre);  
            pre=p;  
            p=pre->next;
            }
        free(pre);     
}//销毁链表函数 
int main(void) {
    void CreateListF(LinkNode *&L,int n);
    void DispList(LinkNode *L,int n);
    void change(LinkNode *L);
    void InitList(LinkNode *&L);
    void DestroyList(LinkNode *&L);
    int m;
    LinkNode *L;
    InitList(L);
    printf("输入系数与指数总数:");
    scanf("%d",&m);
    printf("输入系数和指数:"); 
    CreateListF(L,m/2);
    DispList(L,m/2-1);
    DestroyList(L);
    return 0;
}

结果运行出来是这样:
输入系数与指数总数:4
输入系数和指数:1,1,1,0,
求导后的系数和指数1 0
要么就是:
输入系数与指数总数:6
输入系数和指数:1,2,
求导后的系数和指数1 0 7738368 0
求大神解答,弄了一下午了,本人将万分感激
用的编译器是DeV.C++

图片说明

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
typedef struct Link{
    int c;
    int e;
    struct Link *next; 
}LinkNode;
void InitList(LinkNode *&L){
        L=(LinkNode *)malloc(sizeof(LinkNode));   
        L->next=NULL;
 }//建立头结点 

void CreateListF(LinkNode *&L,int n){   
    InitList(L);
    LinkNode *s,*r;
    int i;
    L=(LinkNode *)malloc(sizeof(LinkNode));  
    r=L;        
    for (i=0;i<n;i++){  
        s=(LinkNode *)malloc(sizeof(LinkNode));
        r->next=s;  
        r=s;
        scanf("%d%d",&(s->c),&(s->e));
    }
    r->next=NULL;
}//建立链表
void change(LinkNode *L){
    LinkNode *p=L->next;
    if(p->e == 0) {
        p->c = 0;
        p->e = 0;
        return ;
    }
    while(p!=NULL){ 
        if(p->e != 0) {
            p->c=(p->e)*(p->c);
            p->e=(p->e)-1;
        }else {
            p->c = 1000001;
            p->e = 1000001;
        }
        p=p->next;
    }
    free(p);
}//求导函数 
void DispList(LinkNode *L){
    LinkNode *p=L->next;
    printf("求导后的系数和指数");  
    while (p!=NULL) {
        if(p->c == 1000001) break;
        printf("%d %d ",p->c,p->e);
        p=p->next;      
    }
    printf("\n");
}//输出链表
void DestroyList(LinkNode *&L){   
        LinkNode *pre=L,*p=L->next;
        while (p!=NULL) {     
            free(pre);  
            pre=p;  
            p=pre->next;
            }
        free(pre);     
}//销毁链表函数 
int main(void) {
    int m;
    LinkNode *L;
    printf("输入系数与指数总数:");
    scanf("%d",&m);
    printf("输入系数和指数:"); 
    CreateListF(L,m/2);
    change(L);
    DispList(L);
    DestroyList(L);
    return 0;
}