对链表操作的函数误改指针的问题

我在写一段把多项式相加的代码时,出现了如题的错误,下面是代码,问题出现deletem函数中,跳出函数后把指针m改变了,但问题是我并没有向deletem传入m指针,所以很困惑,其他代码保留便于答主理解

#include<stdio.h>
#include<stdlib.h> 
#include<string.h>
typedef struct node
{   
  int coef;             /* 系数 */
  int exp;              /* 指数 */
  struct node *next;
} polynomial;
polynomial *create_polynomial();//创建多项式链表
polynomial *mergelists(polynomial *list1, polynomial *list2);//升序合并两个多项式
void printlist( polynomial *head );//打印
polynomial *merge(polynomial *list);//得到多项式的和
polynomial *deletem(polynomial *list, int exp);//被merge调用
int main()
{
    polynomial  *list1, *list2, *list3, *flist;

    list1 = create_polynomial();
    list2 = create_polynomial();
    list3 = mergelists(list1, list2);
    printlist(list3);
    printlist(list1);
    printlist(list2);
    flist = merge(list3);
    printlist(flist);
    return 0;
}

/* 你的代码将被嵌在这里 */
void printlist( polynomial *head )
{
     polynomial *p = head;
     while (p) {
           printf("%d-%d ", p->coef, p->exp);
           p = p->next;
     }
     printf("\n");
}

polynomial *copy_polynomial(polynomial *origin){
    polynomial *head, *node, *end, *p;
    head = end = NULL;
    p = origin;
    while(p){
        node = (polynomial*)malloc(sizeof(polynomial));
        node->coef = p->coef;
        node->exp = p->exp;
        if(head == NULL) head = node;
        else end->next = node;
        end = node;
        p = p->next;
    }
    end->next = NULL;
    return head;
}
polynomial *create_polynomial(){
    polynomial *head = NULL, *p, *end = NULL;
    int n,i;
    scanf("%d", &n);
    for(i = 0; i < n; i++){
        p = (polynomial*)malloc(sizeof(polynomial));
        scanf("%d%d", &p->coef, &p->exp);
        if(head == NULL) head = p;
        else end->next = p;
        end = p;
    }
    end ->next = NULL;
    return head;
}
 polynomial *mergelists(polynomial *olist1, polynomial *olist2){
     polynomial *list1 = copy_polynomial(olist1);
     polynomial *list2 = copy_polynomial(olist2);
     polynomial *head,*p1,*p2,*temp;
     if(list1==NULL) return list2;    
     if(list2==NULL) return list1;    
     if(list1->exp >= list2->exp){    
         head=list2;
         p1=list1;
         p2=list2;
     }                            
     else{
         head=list1;
         p2=list1;
         p1=list2;
     }                            
     while(1){    
         while(p2->next!=NULL && p2->next->exp <= p1->exp){
                 p2=p2->next;
         }
         if(p2->next==NULL){
             p2->next=p1;
             return head;
         }
         else{        
             temp=p2->next;
             p2->next=p1;
             p2=p2->next;
             p1=temp;
         }
     }
     return head;
 }
//先合并相同项,再删去链表
polynomial *deletem(polynomial *list, int exp){
    for(polynomial *p= list, *q = NULL; p; q=p, p = p->next){
        if(p ->exp == exp){
            if(q){
                q->next = p->next;
            }else{
                list = p->next;
            }
            free(p);
            break;
        }
    }
    return list;
}

polynomial *merge(polynomial *list){
    polynomial *m = list;
    while(m->next){
        if(m->exp == m->next->exp){
            m->next->coef = m->coef + m->next->coef;
            int exp = m->exp;
            list = deletem(list, exp);//deletem函数把m改变了,导致程序出错
        }
        m = m->next;
    }
    return list;
}

希望能帮忙解答一下,谢啦~