题目如图:
本人所写如下:
#include<stdio.h>
#include<stdlib.h>
typedef struct _polynode *Polynomial;
struct _polynode {
int coef;
int expon;
Polynomial next;
};
Polynomial read(int n);
void attach(int co, int ex, Polynomial *PtrP);
Polynomial add(Polynomial P, Polynomial Q);
Polynomial multiply(Polynomial P, Polynomial Q);
void print(Polynomial PtrL);
int main(void){
Polynomial p1, p2;
int n;
scanf("%d", &n);
p1 = read(n);
int m;
scanf("%d", &m);
p2 = read(m);
print(multiply(p1, p2));
print(add(p1, p2));
return 0;
}
Polynomial read(int n){
Polynomial head = NULL, tail = NULL;
for (int i = 0; i < n; i++){
Polynomial p = (Polynomial)malloc(sizeof(Polynomial));
scanf("%d", &p->coef);
scanf("%d", &p->expon);
if (head){
tail->next = p;
}else{
head = p;
}
tail = p;
}
tail->next = NULL;
return head;
}
void attach(int co, int ex, Polynomial *PtrP){
Polynomial P = (Polynomial)malloc(sizeof(Polynomial));
P->coef = co;
P->expon = ex;
P->next = NULL;
(*PtrP)->next = P;
*PtrP = P;
}
Polynomial add(Polynomial P, Polynomial Q){
Polynomial rear = (Polynomial)malloc(sizeof(Polynomial));
Polynomial front = rear;
while (P && Q){
if (P->expon > Q->expon){
attach(P->coef, P->expon, &rear);
P = P->next;
}else if (P->expon < Q->expon){
attach(Q->coef, Q->expon, &rear);
Q = Q->next;
}else{
int sum = P->coef + Q->coef;
if (sum) attach(sum, P->expon, &rear);
P = P->next;
Q = Q->next;
}
}
for (; P; P = P->next) attach(P->coef, P->expon, &rear);
for (; Q; Q = Q->next) attach(Q->coef, Q->expon, &rear);
rear->next = NULL;
Polynomial temp = front;
front = front->next;
free(temp);
return front;
}
Polynomial multiply(Polynomial P, Polynomial Q){
Polynomial ret = (Polynomial)malloc(sizeof(Polynomial));
ret->next = NULL;
ret->coef = ret->expon = 0;
for (; P; P = P->next){
Polynomial cal = (Polynomial)malloc(sizeof(Polynomial));
cal->next = NULL;
Polynomial calhead = cal;
for(; Q; Q = Q->next){
attach(P->coef * Q->coef, P->expon + Q->expon, &cal);
}
ret = add(ret, calhead->next);
free(calhead);
}
return ret;
}
void print(Polynomial PtrL){
Polynomial p = PtrL;
while(p->next){
printf("%d %d", p->coef, p->expon);
printf(" ");
p = p->next;
}
printf("%d %d", p->coef, p->expon);
printf("\n");
}
在OJ(浙大PTA)上运行结果为:
可见加法实现没有问题,而乘法似乎在外层for循环失效了,想知道原因,于是进入vscode调试,结果报错,如下:
所以想问代码错误出在哪里。
感觉是浅拷贝的问题。temp和front的地址是一样的,你free掉其中一个,另外一个也呗free。