PTA-数据结构 编程题02- 一元多项式的乘法与加法运算
设计函数分别求两个一元多项式的乘积与和。
输入格式:
输入分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
对于加法
首先建立一个空链表rear,然后分类对A,B两个链的指数进行比较
- A > B的时候,令A的数值入rear
- A < B的时候,令B的数值入rear
- A = B的时候,令(A+B)的数值入rear
然后判断 A,B 两个链表哪个为空,将不为空的链表接到rear上,返回rear的地址即可,加法完毕
对于乘法
先从A,B两个链表中选取一个链表(我取了A),建立一个空链表rear
- 先拿出A的第一个元素,让它分别与B中的元素相乘,将所得到的数值入B
- 在循环A之后的元素,让他与A相乘,把所得到的结果按相加的原理加到rear上即可
返回rear的地址,乘法完毕
#include<stdio.h>
#include<stdlib.h>
#define LEN sizeof(struct Equation)
typedef struct Equation{
int coefficient; //系数
int power; //指数
struct Equation *next;
}*Equ;
Equ creat(void) //输入
{
Equ p,L,s;
int co,ex,N;
scanf("%d",&N); //输入有几个 多项式非零项的个数
L = (Equ)malloc(LEN);
L->next = NULL;
s = L;
while(N--)
{
scanf("%d %d",&co,&ex);
p = (Equ)malloc(LEN);
p->coefficient = co;
p->power = ex;
p->next = NULL;
s->next = p;
s = p;
}
s->next = NULL;
return L;
}
void print(Equ P) //输出
{
Equ pointer = P;
int flag = 0;
if(pointer == NULL)
{
printf("0 0");
}
while( pointer != NULL)
{
if(flag == 0)
{
printf("%d %d",pointer->coefficient,pointer->power);
pointer = pointer->next;
flag = 1;
}
else
{
printf(" %d %d",pointer->coefficient,pointer->power);
pointer = pointer->next;
}
}
}
void Attach(int c,int e,Equ rear) //将读入的数入链
{
Equ p2;
p2 = (Equ)malloc(LEN);
p2->coefficient = c;
p2->power = e;
p2->next = NULL;
rear->next = p2;
rear = p2;
}
Equ multiplication(Equ head_1,Equ head_2) //相乘
{
Equ front, rear, t, t1, t2;
int c, e;
t1 = head_1->next; t2 = head_2->next;
front = (Equ)malloc(LEN);
front->next = NULL;
rear = front;
if(!t1 || !t2)
{
return NULL;
}
while(t2) //用t1的第一项与t2的各项相乘,构成rear
{
c = t1->coefficient * t2->coefficient;
e = t1->power + t2->power;
Attach(c,e,rear);
t2 = t2->next;
rear = rear->next;
}
t1 = t1->next;
while(t1)
{
t2 = head_2->next;
rear = front;
while(t2)
{
c = t1->coefficient * t2->coefficient;
e = t1->power + t2->power;
while((rear->next) && (rear->next->power > e)) rear = rear->next; //循环到 rear所指的指数 = 现在的指数pow 或 p4所指的指数 < 现在的指数pow 或 rear为空
if((rear->next) && (rear->next->power == e)) //reae所指的指数 = 现在的指数pow
{
if(rear->next->coefficient+c != 0) //当 rear所指的系数 + 现在的系数 != 0 时
{
rear->next->coefficient += c;
}
else //当 rear所指的系数 + 现在的系数 = 0 时 删掉这个节点
{
t = rear->next;
rear->next = t->next;
free(t);
}
}
else
{
t = (Equ)malloc(LEN);
t->coefficient = c;
t->power = e;
t->next = rear->next;
rear->next = t;
rear = rear->next;
}
t2 = t2->next;
}
t1 = t1->next;
}
t = front; //删除头节点
front = front->next;
free(t);
return front;
}
int compare(int a, int b) //用于比较
{
if (a > b) return 1;
if (a < b) return 0;
if (a == b) return -1;
}
Equ Addition(Equ head_1, Equ head_2) //相加
{
Equ front, rear, t, p1, p2;
int sum = 0;
p1=head_1->next; p2=head_2->next;
front =(Equ)malloc(LEN);
front->next = NULL;
rear = front;
if (!p1 && !p2)
return NULL;
while (p1&&p2)
{
switch (compare(p1->power, p2->power))
{
case 1: Attach(p1->coefficient, p1->power, rear); rear=rear->next; p1 = p1->next; break;
case 0: Attach(p2->coefficient, p2->power, rear); rear=rear->next; p2 = p2->next; break;
case -1:
sum = p1->coefficient + p2->coefficient;
if (sum)
{
Attach(sum, p1->power, rear);
rear=rear->next;
}
p1 = p1->next;
p2 = p2->next;
break;
}
}
for (; p1 != 0;Attach(p1->coefficient, p1->power, rear), rear=rear->next, p1 = p1->next);
for (; p2 != 0;Attach(p2->coefficient, p2->power, rear), rear=rear->next, p2 = p2->next);
t = front;
front = front->next;
free(t);
return front;
}
int main()
{
Equ head_1, head_2 ,head_3, head_4; // *head_1第一个输入的方程的头节点 *head_2第二个方程的头节点 *head_3加起来的的头节点
head_1 = creat();
head_2 = creat();
head_3 = multiplication(head_1,head_2); //加法
print(head_3);
printf("\n");
head_4 = Addition(head_1,head_2); //乘法
print(head_4);
return 0;
}