PAT Advanced Level 1002 A+B for Polynomials 解题思路及AC代码 v0.8

PAT Advanced Level 1002 A+B for Polynomials

1. 题目简述及在线测试位置

1.1 两个一元多项式做加法,输入格式是:共多少项 指数 系数(各项按指数从大到小排列),例如:2 1 2.4 0 3.2就代表 2.4X+3.2
1.2 在线测试位置: 1002 A+B for Polynomials

2. 基本思路

2.1 数据结构使用链表(吐槽:代码量大又容易出错,后面有时间了尝试下其他的数据结构),头结点不存数据

typedef struct Node* PtrN;
struct Node
{
	int Expo;
	float Coef;
	PtrN Next;
};

2.2 使用两个链表存储两个多项式:编写Insert()函数插入各个结点,插入函数需要考虑到 指数相同时系数相加,但相加结果为0的情况
2.3 比较两个链表各结点的指数,将指数较大的结点插入到结果链表中。数据存储完毕后,按要求打印结果链表即可

	Poly01 = Poly01->Next; Poly02 = Poly02->Next;
	while (Poly01!=NULL && Poly02!=NULL)
	{
		if (Poly01->Expo >= Poly02->Expo)
		{		
			Poly = Insert(Poly, Poly01);
			Poly01 = Poly01->Next;
		}
		else
		{
			Poly = Insert(Poly, Poly02);
			Poly02 = Poly02->Next;
		}
	}

2.4 注意:将链表中的结点插入到新链表时,不能直接将结点插入到新链表,而是将结点拷贝后插入到新链表中(不拷贝结点的链接信息),因为当前结点可能还链接着其他结点,直接插入会造成数据混乱;使用指针数据前,先申请内存空间;另外,通过new申请内存后,使用完毕后使用delete释放内存

3. 完整AC代码

#include <iostream>
using namespace std;

typedef struct Node* PtrN;
struct Node
{
	int Expo;
	float Coef;
	PtrN Next;
};

PtrN Insert(PtrN Poly, PtrN PolyNode);
void DeleteMemoryOccupy(PtrN Poly);

int main()
{
	int N,Count = 0;
	PtrN Poly01, Poly02, Poly, PolyNode;
	PtrN HPoly01, HPoly02, HPoly; //头结点不存数据

	Poly = new struct Node;
	Poly01 = new struct Node; Poly02 = new struct Node;
	Poly->Next = NULL;
	Poly01->Next = NULL; Poly02->Next = NULL;

	HPoly01 = Poly01; HPoly02 = Poly02; HPoly = Poly;

	int Expo; float Coef;
	cin >> N; 
	while (N--)
	{
		cin >> Expo >> Coef;
		PolyNode = new struct Node;
		PolyNode->Expo = Expo;
		PolyNode->Coef = Coef;
		PolyNode->Next = NULL;

		Poly01 = Insert(Poly01, PolyNode);
		delete PolyNode;
	}

	cin >> N;
	while (N--)
	{
		cin >> Expo >> Coef;
		PolyNode = new struct Node;
		PolyNode->Expo = Expo;
		PolyNode->Coef = Coef;
		PolyNode->Next = NULL;

		Poly02 = Insert(Poly02, PolyNode);
		delete PolyNode;
	}
	
	Poly01 = Poly01->Next; Poly02 = Poly02->Next;
	while (Poly01!=NULL && Poly02!=NULL)
	{
		if (Poly01->Expo >= Poly02->Expo)
		{		
			Poly = Insert(Poly, Poly01);
			Poly01 = Poly01->Next;
		}
		else
		{
			Poly = Insert(Poly, Poly02);
			Poly02 = Poly02->Next;
		}
	}

	while (Poly01!=NULL)
	{
		Poly = Insert(Poly, Poly01);
		Poly01 = Poly01->Next;
	}

	while (Poly02!=NULL)
	{
		Poly = Insert(Poly, Poly02);
		Poly02 = Poly02->Next;
	}

	Poly = Poly->Next;
	while (Poly != NULL)
	{
		Count++;
		Poly = Poly->Next;
	}
	Poly = HPoly;

	printf("%d", Count);
	Poly = Poly->Next;
	while (Poly!=NULL)
	{
		printf(" %d %.1f", Poly->Expo, Poly->Coef);
		Poly = Poly->Next;
	}
	DeleteMemoryOccupy(HPoly); DeleteMemoryOccupy(HPoly01); DeleteMemoryOccupy(HPoly02);

	return 0;
}

PtrN Insert(PtrN Poly, PtrN PolyNode) //将节点PolyNode加入链表Poly中(Poly是头结点)
{
	PtrN Head, Node = NULL, PreNode = NULL;
	Head = Poly; //记录头结点

	Node = new struct Node;
	Node->Expo = PolyNode->Expo;
	Node->Coef = PolyNode->Coef;
	Node->Next = NULL;

	PreNode = Poly;
	Poly = Poly->Next;

	while (Poly != NULL && Poly->Expo != Node->Expo)
	{
		PreNode = Poly;
		Poly = Poly->Next;
	}

	if (Poly == NULL)
		PreNode->Next = Node;
	else
	{
		Poly->Coef += Node->Coef;
		delete Node;

		if (Poly->Coef);
		else //Poly->Coef=0
		{
			PreNode->Next = Poly->Next;
			delete Poly;
		}		
	}
	
	return Head;
}

void DeleteMemoryOccupy(PtrN Poly)
{
	PtrN HeadNode = Poly,PreNode=NULL,Tmp=NULL;

	PreNode = Poly;
	Poly = Poly->Next;

	while (Poly != NULL)
	{
		Tmp = Poly;
		PreNode->Next = Poly->Next;
		Poly = PreNode->Next;
		delete Tmp;
	}
	delete HeadNode;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值