您的位置:首页 > 理论基础 > 数据结构算法

02 - 线性结构 2 一元多项式的乘法与加法运算 (20 分)

2017-03-11 23:02 531 查看
设计函数分别求两个一元多项式的乘积与和。

输入格式:

输入分 2 行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和指数(绝对值均为不超过 1000 的整数)。数字间以空格分隔。

输出格式:

输出分 2 行,分别以指数递降方式输出乘积多项式以及和多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。零多项式应输出 0 0。

输入样例:

4 3 4 -5 2  6 1  -2 0
3 5 20  -7 4  3 1


输出样例:

15 24 -25 22 30 21 -10 20 -21 8 35 6 -33 5 14 4 -15 3 18 2 -6 1
5 20 -4 4 -5 2 9 1 -2 0


完成代码如下:

#include <stdio.h>
#include <stdlib.h>
//链表实现 一元多项式的乘法与加法
typedef struct PolyNode *Polynomial;
struct PolyNode{
int coef;
int expon;
Polynomial link;
};
//这用指针传值,实现值得更改
//添加新的多项式节点
void Attach(int c,int e,Polynomial *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(){
int N;
int c,e;
scanf("%d",&N);
Polynomial Rear;
Polynomial p;
p=(Polynomial)malloc(sizeof(struct PolyNode));
Rear=p;
if (N==0) {
Attach(0, 0, &Rear);
}else {
while (N--) {
scanf("%d%d",&c,&e);
Attach(c, e, &Rear);
}

}
return p;
}
//输出多项式
void PrintPoly(Polynomial PPoly){
PPoly=PPoly->link;
int flag=0;//用来调整输出格式的代码
while (PPoly) {
if (!flag) {
flag=1;
}else {
printf(" ");
}
printf("%d %d",PPoly->coef,PPoly->expon);
PPoly=PPoly->link;
}
printf("\n");
}
//两个多项式相乘不按指数的大小顺序也不考虑系数相加为零的情况
/*Polynomial Mult(Polynomial P1,Polynomial P2){
Polynomial P,tmp,p;//p用于记录P2->link的位置
int c,e;
P1=P1->link;
P2=P2->link;
p=P2;
P=(Polynomial)malloc(sizeof(struct PolyNode));
tmp=P;
while(P1!=NULL){
while (P2!=NULL) {
c=P1->coef*P2->coef;
e=P1->expon+P2->expon;
Attach(c, e, &tmp);
P2=P2->link;
}
P1=P1->link;
P2=p;
}
return P;
}*/
//考虑分别以指数递降方式输出乘积多项式以及和多项式非零项的系数和指数
Polynomial Mult(Polynomial P1,Polynomial P2){
Polynomial tmp1,tmp2,Rear,P,t;
if (!P1||!P2) {
return NULL;
}
P=(Polynomial)malloc(sizeof(struct PolyNode));
P->link=NULL;
Rear=P;
int c,e;
tmp1=P1->link;
tmp2=P2->link;
//先判断是否某个多项试为0
if (tmp1->coef==0||tmp2->coef==0) {
Attach(0, 0, &Rear);
return P;
}
//先得出一个初始多项式
while (tmp2) {
Attach(tmp1->coef*tmp2->coef, tmp1->expon+tmp2->expon, &Rear);
tmp2=tmp2->link;
}
tmp1=tmp1->link;
while (tmp1) {
tmp2=P2->link;
Rear=P;
while (tmp2) {
c=tmp1->coef*tmp2->coef;
e=tmp1->expon+tmp2->expon;
while (Rear->link&&Rear->link->expon>e) {
Rear=Rear->link;
}
if (Rear->link&&Rear->link->expon==e) {
//系数相加还要考虑是否为零
//1.不为零的情况
if (Rear->link->coef+c) {
Rear->link->coef+=c;
}else {
//2.为零的情况,考虑删去节点
t=Rear->link;
Rear->link=t->link;
free(t);
}
}
else {
//小于当前节点的情况,需要重新构造一个节点
Polynomial p=(Polynomial)malloc(sizeof(struct PolyNode));
p->coef=c;
p->expon=e;
p->link=Rear->link;
Rear->link=p;
Rear=Rear->link;
}
tmp2=tmp2->link;

}
tmp1=tmp1->link;
}
return P;
}

Polynomial Add(Polynomial P1,Polynomial P2){
Polynomial tmp1,tmp2,P,t;
int c,e;
tmp1=P1->link;
tmp2=P2->link;
P=(Polynomial)malloc(sizeof(struct PolyNode));
P->link=NULL;
t=P;
while (tmp1&&tmp2) {
if (tmp1->expon==tmp2->expon) {//如果二者的指数相等,将二者的系数相加
if((tmp1->coef+tmp2->coef)!=0){
c=tmp1->coef+tmp2->coef;
e=tmp1->expon;
Attach(c, e, &t);
}
tmp1=tmp1->link;
tmp2=tmp2->link;
}else if (tmp1->expon>tmp2->expon) {
c=tmp1->coef;
e=tmp1->expon;
Attach(c, e, &t);
tmp1=tmp1->link;
}else {
c=tmp2->coef;
e=tmp2->expon;
Attach(c, e, &t);
tmp2=tmp2->link;
}
}
while(tmp1){
c=tmp1->coef;
e=tmp1->expon;
Attach(c, e, &t);
tmp1=tmp1->link;
}
while(tmp2){
c=tmp2->coef;
e=tmp2->expon;
Attach(c, e, &t);
tmp2=tmp2->link;
}
if(!P->link){
Attach(0,0,&t);
}
return P;

}
int main(int argc, char *argv[]) {
Polynomial P1,P2,PP,PS;
P1=ReadPoly();
P2=ReadPoly();

PP=Mult(P1,P2);
PrintPoly(PP);

PS=Add(P1,P2);
PrintPoly(PS);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  数据结构 链表 PTA