  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 如何用stata画出文献中常见的安慰剂检验图
  • ¥15 c语言链表结构体数据插入
  • ¥40 使用MATLAB解答线性代数问题
  • ¥15 COCOS的问题COCOS的问题
  • ¥15 FPGA-SRIO初始化失败
  • ¥15 MapReduce实现倒排索引失败
  • ¥15 ZABBIX6.0L连接数据库报错,如何解决?(操作系统-centos)
  • ¥15 找一位技术过硬的游戏pj程序员
  • ¥15 matlab生成电测深三层曲线模型代码
  • ¥50 随机森林与房贷信用风险模型