这是一次悲惨的经历,RE,WE 共20余次,我决议要记录一下。
首先放上较早错误的代码:
void AddNode(int coef, int exp, Node *tail)
{
if(coef == 0) return;
Node *p = (Node*)malloc(sizeof(Node));
p->exp = exp;
p->coef = coef;
p->next=NULL;
tail->next = p;
tail = p;
}
Node* Add(Node* A, Node* B)
{
Node *head = (Node*)malloc(sizeof(Node)), *pa = A->next, *pb = B->next, *tail = head;
while(pa != NULL || pb != NULL)
{
if(pa->exp == pb->exp)
{
AddNode(pa->coef + pb->coef, pa->exp, tail);
pa = pa->next;
pb = pb->next;
}
else if(pa->exp > pb->exp || pa == NULL)
{
AddNode(pb->coef, pb->exp, tail);
pb = pb->next;
}
else if(pa->exp < pb->exp || pb == NULL)
{
AddNode(pa->coef, pa->exp, tail);
pa = pa->next;
}
}
tail->next = NULL;
return head;
}
bug十分多(摊手):
在AddNode中用地址传参
这是最基本的函数的形参,函数中tail = p;
实际并没有改变
最后加了返回值,小改了尾插代码。
Node* AddNode(int coef, int exp, Node *tail)
{
tail->next = (Node*)malloc(sizeof(Node));
tail = tail->next;
tail->exp = exp;
tail->coef = coef;
return tail;
}
代码执行顺序
在while
语句中的else if(pa->exp > pb->exp || pa == NULL)
将pa == NULL
放在了后方,导致了pa == NULL
情况下也会先执行pa->exp
语句导致RE。最终改为else if(pa == NULL || (pa->exp > pb->exp))
😢 😢
注意: ac代码第18行中(pa && pb && pa->exp < pb->exp)
的pa && pb
也是必不可少。是为了避免在pa != NULL
而pb == NULL
的情况下依旧执行pb->exp
语句导致程序RE(自己写另一个题目时候忘记加了)
最后附上ac代码
Node* AddNode(int coef, int exp, Node *tail)
{
tail->next = (Node*)malloc(sizeof(Node));
tail = tail->next;
tail->exp = exp;
tail->coef = coef;
return tail;
}
Node* Add(Node* A, Node* B)
{
Node *head, *pa = A->next, *pb = B->next, *tail = (Node*)malloc(sizeof(Node));
head = tail;
while(pa || pb)
{
if( pb == NULL || (pa && pb && pa->exp < pb->exp))
{
tail = AddNode(pa->coef, pa->exp, tail);
pa = pa->next;
}
else if(pa == NULL || (pa->exp > pb->exp))
{
tail = AddNode(pb->coef, pb->exp, tail);
pb = pb->next;
}
else
{
if(pb->coef + pa->coef != 0)
tail = AddNode(pa->coef + pb->coef, pa->exp, tail);
pa = pa->next;
pb = pb->next;
}
}
tail->next = NULL;
return head;
}