一元多项式的乘法与加法运算
作者:互联网
设计函数分别求两个一元多项式的乘积与和。
输入格式:
输入分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 node{
int coe;//系数
int index;//指数
struct node *next;//指针
}*Ptrnode,ptrnode;
void product(Ptrnode HeadP,Ptrnode HeadQ){
Ptrnode p,q;//建立两个指针分别指向两个链表的头结点
p = HeadP->next;q = HeadQ->next;
Ptrnode Head = (Ptrnode)malloc(sizeof(ptrnode));
Head->next = NULL;//创建一个用于储存乘积结果的链表
Ptrnode h = Head;
int i = 0;
while(q){
Ptrnode H = (Ptrnode)malloc(sizeof(ptrnode));
H->coe = p->coe*q->coe;H->index = p->index+q->index;
H->next = NULL;h->next = H;h = H;
q = q->next;
}
for(p = p->next;p;p = p->next){//当p链表不为空
q = HeadQ->next;
while(q){//当q链表不为空
h = Head;
Ptrnode H = (Ptrnode)malloc(sizeof(ptrnode));
H->coe = p->coe*q->coe;H->index = p->index+q->index;H->next = NULL;
while(h->next&&H->index < h->next->index){//指数值小于当前节点指数值,h后移,继续寻找插入位置
h = h->next;
}//此时的h后置位即为插入位置
if(!h->next){//如果链表已空
h->next = H;
H->next = NULL;
}else if(H->index > h->next->index){//如果H->index大于h->next->index
H->next = h->next;
h->next = H;
}else if(H->index == h->next->index){//如果H->index等于h->next->index
if(H->coe == -1*h->next->coe){
h->next = h->next->next;//跳过该节点
}else{
h->next->coe = h->next->coe+H->coe;
}
}
q = q->next;
}
}
h = Head->next;
while(h){
if(!h->next)
printf("%d %d",h->coe,h->index);
else
printf("%d %d ",h->coe,h->index);
h = h->next;
}
printf("\n");
}
void sum(Ptrnode HeadP,Ptrnode HeadQ){
Ptrnode p,q,h;//建立三个指针分别指向三个链表的头结点
p = HeadP;q = HeadQ;
Ptrnode Head = (Ptrnode)malloc(sizeof(ptrnode));
Head->next = NULL;Ptrnode last3 = Head;//创建一个用于储存和的链表
while(p->next&&q->next){//当p、q两链表均不为空时
if(p->next->index > q->next->index){
h = (Ptrnode)malloc(sizeof(ptrnode));
h->next = NULL;last3->next = h;last3 = h;//尾插法
h->coe = p->next->coe;h->index = p->next->index;p = p->next;
}else if(p->next->index < q->next->index){
h = (Ptrnode)malloc(sizeof(ptrnode));
h->next = NULL;last3->next = h;last3 = h;//尾插法
h->coe = q->next->coe;h->index = q->next->index;q = q->next;
}else{
if(q->next->coe == -1*p->next->coe){
q = q->next;
p = p->next;
}else{
h = (Ptrnode)malloc(sizeof(ptrnode));
h->next = NULL;last3->next = h;last3 = h;//尾插法
h->coe = q->next->coe+p->next->coe;h->index = q->next->index;q = q->next;p = p->next;
}
}
}
if(!HeadP->next||!HeadQ->next){
if(!HeadP->next)
Head->next = HeadQ->next;
else
Head->next = HeadP->next;
}else if(p->next){
h->next = p->next;
}else if(q->next){
h->next = q->next;
}
h = Head->next;
if(!h){
printf("0 0");
}else{
while(h){
if(!h->next)
printf("%d %d",h->coe,h->index);
else
printf("%d %d ",h->coe,h->index);
h = h->next;
}
}
}
int main(){
int n,m;
Ptrnode HeadP = (Ptrnode)malloc(sizeof(ptrnode));HeadP->next = NULL;Ptrnode last1 = HeadP;
Ptrnode HeadQ = (Ptrnode)malloc(sizeof(ptrnode));HeadQ->next = NULL;Ptrnode last2 = HeadQ;
//申请两条带头结点的链表用来储存题目所给的数据
scanf("%d",&n);
while(n--){//尾插法
Ptrnode P = (Ptrnode)malloc(sizeof(ptrnode));
P->next = NULL;last1->next = P;last1 = P;
scanf("%d%d",&P->coe,&P->index);
}
scanf("%d",&m);
while(m--){//尾插法
Ptrnode Q = (Ptrnode)malloc(sizeof(ptrnode));
Q->next = NULL;last2->next = Q;last2 = Q;
scanf("%d%d",&Q->coe,&Q->index);
}
if(!HeadP->next||!HeadQ->next){
printf("0 0\n");
sum(HeadP,HeadQ);
}else{
product(HeadP,HeadQ);
sum(HeadP,HeadQ);
}
}
有个地方哥们弄错了,指数的英语不是index
这是指针的英语,但是又懒得改了,就这样^ _ ^
整个题目有乘法和加法两个程序需要实现
加法实现的思路就是引入两个指针分别指向两个多项式链表
乘法实现的思路我是先将第一个多项式的第一项分别与第二个多项式相乘得到一条链表(其实就是平常自己动手计算时的中间步骤)
然后将之后的乘积分别与刚刚得到的链表相比较然后插入进去
最后这个题目需要注意一下加法中同类项的合并,它存在这样的测试点
3 -5 20 -7 4 -3 1
3 5 20 7 4 3 1
这种情况下加法运算也要输出0 0(一开始没注意到这一例子)
标签:index,HeadQ,HeadP,多项式,next,coe,Ptrnode,加法,乘法 来源: https://blog.csdn.net/Mai___/article/details/115336235