多项式的乘法与加法运算
多项式的表示
仅表示非零项
数组:
编程简单、调试容易
需要实现确定数组大小
链表:
动态性强
编程略为复杂、调试比较困难
一种比较好的实现方法是:动态数组
数据结构设计
typedef struct PolyNode *Polynomial;
struct PolyNode{
int coef;//系数
int expon;//指数
Polynomial link;//指向下一个节点的指针
程序框架搭建
int main()
{
读入多项式1
读入多项式2
乘法运算并输出
加法运算并输出
return 0;
}
需要设计的函数
读一个多项式
两多项式相乘
两多项式相加
多项式输出
int main()
{
Polynomial P1,P2,PP,PS;
P1 = ReadPoly();
P2 = ReadPoly();
PP = Mult(P1,P2);
PrintPoly(PP);
PS = Add(P1,P2);
PrintPoly(PS);
return 0;
如何读入多项式
先读项数,再一对一对的读指数和系数
Polynomial ReadPoly()
{
……
scanf("%d",&N);
……
while(N--)
{
scanf("%d %d",&c,&e);
Attach(c,e,&Rear);
}
……
return P;
}
Rear初值是多少?
两种处理方法:
1.Rear初值为NULL
在Attach函数中根据Rear是否为NULL做不同处理
2.Rear指向一个空结点
void Attach(int c,int e,Polynomial *pRear)//pRear是指针的指针
{
Polynomial P;
P = (Polynomial)malloc(sizeof(struct PolyNode));
P->coef = c;
P->expon = e;
P->link = NULL;
(*pRear)->link = P;
*pRear = P;
}
Polynomial ReadPoly()
{
Polynomial P,Rear,t;
int c,e,N;
scanf("%d",&N);
P = (Polynomial)malloc(sizeof(struct PolyNode));
P->link = NULL;
Rear = P;
while(N--)
{
scanf("%d %d",&c,&e);
Attach(c,e,&Rear);
}
t = P;
P = P->link;
free(t);
return P;
}
如何将两个多项式相加
Polynomial Add(Polynomial P1,Polynomial P2)
{
……
t1 = P1;
t2 = P2;
P = (Polynomial)malloc(sizeof(struct PolyNode));
P->link = NULL;
Rear = P;
while(t1 && t2){
if(t1->expon == t2->expon){
……
}
else if(t1->expon>t2->expon){
……
}
else {
……
}
}
while(t1)
{
……
}
while(t2)
{
……
}
……
return P;
}
如何将两个多项式相乘
方法1.将乘法运算转换为加法运算
将P1当前项(ci,ei)乘P2多项式,再加到结果多项式里
t1 = P1;
t2 = P2;
P = (Polynomial)malloc(sizeof(struct PolyNode));
P->link = NULL;
Rear = P;
while(t2){
Attach(t1->coef*t2->coef,t1->expon+t2->expon,&Rear);
t2 = t2->link;
}
方法2.逐项插入
将P1当前项(c1i,e1i)乘P2当前项(c2i,e2i),并插入到结果多项式中,关键是要找到插入位置。
初始结果多项式可由P1第一项乘P2获得
如何将多项式输出
void PrintPoly( Polynomial P )
{/*输出多项式*/
int flag = 0; /*辅助调整输出格式用*/
if(!P) {printf("0 0
");return;}
while(P) {
if(!flag)
flag = 1;
else
printf(" ")
printf("%d %d",P->coef,P->expon);
P = P->link;
}
printf("
");
}