  2021-04-06 19:21 采纳率: 0%
浏览 18

PTA一元多项式的加法与乘法出错?

运行正确但是提交

#include <stdio.h>
#include <stdlib.h>

typedef struct LNode{
	int coef;
	int exp;
	struct LNode *Next;
}LNode, *LinkList;

LinkList L1, L2, L3;

void InitPolyn(LinkList &L)
{
	LinkList p = (LinkList)malloc(sizeof(LNode));
	L = p;
	L->Next = NULL;
}

void CreatPolyn(LinkList &L, int m)
{
	LinkList s;
	L = (LinkList)malloc(sizeof(LNode));
	s = L;
	for(int i = 0; i < m; i++)
	{
		LinkList p = (LinkList)malloc(sizeof(LNode));
		scanf("%d%d", &p->coef, &p->exp);
		s->Next = p;
		s = p;
		s->Next = NULL;
	}
}

void DestoryPolyn(LinkList &L)
{
	LinkList p;
	p = L;
	while(p)
	{
		p = p->Next;
		free(L);
		L = p;
	}
}

void PrintPolyn(LinkList &L)
{
	int flag = 0;//flag is used to control the format of output 
	LinkList p;
	p = L->Next;
	if(p == NULL)
	{	
		printf("0 0\n");
		return;
	}
	while(p)
	{
		if(!flag) 
			flag = 1;
		else
			printf(" ");
		printf("%d %d", p->coef, p->exp);
		p = p->Next;
	}
}

LinkList BeforeNode(LinkList L, LinkList p)
{
	LinkList r = L;
	while(r->Next != p)
		r = r->Next;
	return r;
}

int compare(int a, int b)
{
	if(a > b)
		return 1;
	else if(a == b)
		return 0;
	else
		return -1;
}

LinkList InsertPolyn(LinkList &L, LinkList p)
{
	LinkList r, s;
	r = L;
	while(r->Next != p)
	{
		r = r->Next;
	}
	if(r->Next == p)
	{
		s = (LinkList)malloc(sizeof(LNode));
		r->Next = s;
		s->Next = p;
	}
	return s;
}

LinkList DeletePolyn(LinkList &L, LinkList p)
{
	LinkList r = L;
	while(r->Next != p)
	{
		r = r->Next;
	}
	if(r->Next == p)
	{
		r->Next = p->Next;
		free(p);
	}
	r = r->Next;
	return r;
}

void AddPolyn(LinkList &L1, LinkList &L2)
{
	LinkList p1, p2;
	p1 = L1->Next;
	p2 = L2->Next;
	while(p1 && p2)
	{
		switch(compare(p1->exp, p2->exp))
		{
			case -1:
				p1 = InsertPolyn(L1, p1);
				p1->coef = p2->coef;
				p1->exp = p2->exp;
				p2 = p2->Next;
				break;
			case 0:
				if(p1->coef + p2->coef == 0)
				{
					p1 = DeletePolyn(L1, p1);
					p2 = p2->Next;
				}
				else
				{
					p1->coef += p2->coef;
					p1 = p1->Next;
					p2 = p2->Next;
				}
				break;
			case 1:
				p1 = p1->Next;
				break;
		}
	}
	if(p2)
	{
		p1 = BeforeNode(L1, p1);
		p1->Next = p2?p2:p1; 
	}
}

LinkList MultiplyPolyn(LinkList &L1, LinkList &L2, LinkList &L3)
{
	LinkList Rear, p1, p2, p;
	int coef, exp;
	if(!L1 && !L2)
		return NULL;
	p1 = L1->Next;
	p2 = L2->Next;
	Rear = L3;
	while(p2)
	{
		LinkList r;
		r = (LinkList)malloc(sizeof(LNode));
		r->coef = p1->coef * p2->coef;
		r->exp = p1->exp + p2->exp;
		r->Next = NULL;
		Rear->Next = r;
		Rear = r;
		p2 = p2->Next;
	}
	while(p1)
	{
		p2 = L2->Next;
		Rear = L3->Next;
		while(p2)
		{
			exp = p1->exp + p2->exp;
			coef = p1->coef * p2->coef;
			while(Rear->Next && Rear->Next->exp > exp)
				Rear = Rear->Next;
			if(Rear->Next && Rear->Next->exp == exp)
			{
				if(Rear->Next->coef + coef != 0)
					Rear->Next->coef += coef;
				else
				{
					p = Rear->Next;
					Rear->Next = p->Next;
					free(p);
				}
			}
			else
			{
				p = (LinkList)malloc(sizeof(LNode));
				p->coef = coef;
				p->exp = exp;
				p->Next = Rear->Next;
				Rear->Next = p;
				Rear = Rear->Next;
			}
			p2 = p2->Next;
		}
		p1 = p1->Next;
	}
	p2 = L3;
	L3 = L3->Next;
	free(p2);
	p = L3->Next;
	while(p->Next)
	{
		if(p->Next->coef == 0)
		{
			p->Next = p->Next->Next;
		}
		p = p->Next;
	}
	return L3;
}

int main()
{
	int m, n;
	InitPolyn(L1);
	InitPolyn(L2);
	InitPolyn(L3);
	scanf("%d", &m);
	CreatPolyn(L1, m);
	scanf("%d", &n);
	CreatPolyn(L2, n);
	L3 = MultiplyPolyn(L1, L2, L3);
	AddPolyn(L1, L2);
	PrintPolyn(L3);
	printf("\n");
	PrintPolyn(L1);
}

总是答案出错,实在找不出问题了,求大佬帮助

  • 写回答

1条回答 默认 最新

  • 明初啥都能学会 2024-03-28 13:09
    关注

    以下回答参考GPT老师

    在您提供的代码中,存在一些问题导致多项式的加法和乘法出错:

    未考虑到多项式的初始化:在进行多项式的创建、加法和乘法操作之前,应该先初始化多项式链表。您定义了初始化函数InitPolyn,但在主函数中没有调用这个函数来初始化链表。

    多项式加法操作中的错误:在AddPolyn函数中,对于多项式加法操作存在一些问题。比如,在处理完某一项后,未将指针正确移动到下一个节点。

    多项式乘法操作中的错误:在MultiplyPolyn函数中,有一些逻辑错误,比如在内层循环中未正确处理Rear指针的移动,导致生成的多项式链表混乱。

    内存泄漏问题:在一些情况下,您分配了内存但未释放,可能会导致内存泄漏。

    我建议您重新审查并修复这些问题,特别是在处理多项式链表的过程中需要更加仔细地考虑节点的连接和指针的移动。另外,确保在每次分配内存后都要进行内存释放,以避免内存泄漏问题。

    评论

报告相同问题?

悬赏问题

  • ¥15 求差集那个函数有问题,有无佬可以解决
  • ¥15 【提问】基于Invest的水源涵养
  • ¥20 微信网友居然可以通过vx号找到我绑的手机号
  • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
  • ¥15 解riccati方程组
  • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名
  • ¥65 汇编语言除法溢出问题