tzoj 5641: 数据结构实验:一元多项式相加

题目

这是一次悲惨的经历,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 != NULLpb == 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;
}
  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值