题目:
设计函数分别求两个一元多项式的乘积与和。
输入格式:
输入分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 a;
int i;
struct node*next;
}node;
typedef struct{
node* head;
node* tail;
}list;
void insert(list *pl,int aa,int ii);
list multiply(list*l1,list*l2);
list plustwolist(list*l1,list*l2);
void add_node(list *pl,int a,int i);
void printlist(list *pl);
int main(){
int n1=0,n2=0,a1=0,a2=0,i1=0,i2=0;
list l1,l2,mul,plus;
l1.head=l1.tail=NULL;
l2.head=l2.tail=NULL;
scanf("%d",&n1);
for(int j=0;j<n1;j++){
scanf("%d %d",&a1,&i1);
add_node(&l1,a1,i1);
}
scanf("%d",&n2);
for(int j=0;j<n2;j++){
scanf("%d %d",&a2,&i2);
add_node(&l2,a2,i2);
}
mul=multiply(&l1,&l2);
printlist(&mul);
plus=plustwolist(&l1,&l2);
printlist(&plus);
return 0;
}
void add_node(list *l,int ai,int ii){
if(ai!=0){
if (!l->head) {
l->head = l->tail = (node*)malloc(sizeof(node));
l->tail->a = ai;
l->tail->i = ii;
l->tail->next = NULL;
}
else {
l->tail->next = (node*)malloc(sizeof(node));
l->tail = l->tail->next;
l->tail->a = ai;
l->tail->i = ii;
l->tail->next = NULL;
}
}
}
void printlist(list *pl){
int temp=1;
node* ptr=pl->head;
if(!pl->head){
printf("0 0\n");
return;
}
while(ptr!=pl->tail){
ptr=ptr->next;
temp++;
}
//printf("%d",temp);
ptr=pl->head;
for(int j=0;j<temp-1;j++){
printf("%d %d ",ptr->a,ptr->i);
ptr=ptr->next;
}
printf("%d %d",ptr->a,ptr->i);
printf("\n");
}
list multiply(list*l1,list*l2){
list l3;
int aa,ii;
l3.head=l3.tail=NULL;
if(!l1->head||!l2->head) return l3;
node *ptr1=l1->head,*ptr2=l2->head;
while(ptr1){
ptr2=l2->head;
while(ptr2){
aa=ptr1->a*ptr2->a;
ii=ptr1->i+ptr2->i;
if(!l3.head){
add_node(&l3,aa,ii);
}else if(ii<l3.tail->i){
add_node(&l3,aa,ii);
}
else{
insert(&l3,aa,ii);
}
ptr2=ptr2->next;
}
ptr1=ptr1->next;
}
return l3;
}
void insert(list *pl,int aa,int ii){
node* pfront=pl->head,*pnext;
if(ii>pfront->i){
node* p=(node*)malloc(sizeof(node));
p->a=aa;p->i=ii;
p->next=pl->head;
pl->head=p;
}else{
pnext=pfront->next;
while(ii<pnext->i){
pfront=pfront->next;
pnext=pfront->next;
}
if(ii==pnext->i){
if(pnext->a+aa!=0){
pnext->a+=aa;
}else{
pfront->next=pnext->next;
if(pnext==pl->tail){
pl->tail=pfront;
}
free(pnext);
}
}else{
node* p=(node*)malloc(sizeof(node));
p->a=aa;p->i=ii;
pfront->next=p;
p->next=pnext;
}
}
}
list plustwolist(list*l1,list*l2){
list l3;
l3.head=l3.tail=NULL;
node* ptr1=l1->head,*ptr2=l2->head;
while(ptr1&&ptr2){
if(ptr1->i>ptr2->i){
add_node(&l3,ptr1->a,ptr1->i);
ptr1=ptr1->next;
}else if(ptr1->i<ptr2->i){
add_node(&l3,ptr2->a,ptr2->i);
ptr2=ptr2->next;
}else{
if(ptr1->a+ptr2->a!=0){
add_node(&l3,ptr1->a+ptr2->a,ptr1->i);
}
ptr1=ptr1->next;ptr2=ptr2->next;
}
}
if(l3.head==NULL){
if(ptr1){
l3.head=ptr1;l3.tail=l1->tail;
}else if(ptr2){
l3.head=ptr2;l3.tail=l2->tail;
}
}
else{
if(ptr1){
l3.tail->next=ptr1;l3.tail=l1->tail;
}else if(ptr2){
l3.tail->next=ptr2;l3.tail=l2->tail;
}
}
return l3;
}