我在写一段把多项式相加的代码时,出现了如题的错误,下面是代码,问题出现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;
}
希望能帮忙解答一下,谢啦~