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;
}