您的位置:首页 > 编程语言 > C语言/C++

实验项目3-4:一元多项式的乘法与加法运算

2016-07-22 21:09 453 查看
设计函数分别求两个一元多项式的乘积与和。

输入格式说明:

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

输出格式说明:

输出分2行。分别以指数递降方式输出乘积多项式以及和多项式非零项的系数和指数。

数字间以空格分隔,但结尾不能有多余空格。

例子输入与输出:



#include<stdio.h>
#include<stdlib.h>
#define MAX 100
typedef struct node{
int cofi;
int index;
struct node *next;
}list;
list * create()
{
list *p,*r,*q;
int a[MAX],N,i;
scanf("%d",&N);
p=(list *)malloc(sizeof(list));
p->next=NULL;
q=p;
for(i=0;i<2*N;i=i+2)
scanf("%d %d",&a[i],&a[i+1]);
for(i=0;i<2*N;i=i+2)
{
r=(list *)malloc(sizeof(list));
r->cofi=a[i];
r->index=a[i+1];
r->next=NULL;
q->next=r;
q=r;
}
return p;
}
list *add(list* l1,list *l2)
{
list * q1,*q2,*p,*q,* r;
q1=l1->next;
q2=l2->next;
p=(list *)malloc(sizeof(list));
p->next=NULL;
q=p;
while(q1!=NULL||q2!=NULL)
{
if(q1!=NULL&&q2!=NULL)  //两者都不为空
{
if(q1->index>q2->index)
{
r=(list *)malloc(sizeof(list));
r->cofi=q1->cofi;
r->index=q1->index;
r->next=NULL;
q->next=r;
q=r;
q1=q1->next;
}
else if(q1->index<q2->index)
{
r=(list *)malloc(sizeof(list));
r->cofi=q2->cofi;
r->index=q2->index;
r->next=NULL;
q->next=r;
q=r;
q2=q2->next;
}
else
{
if((q1->cofi+q2->cofi)!=0)
{
r=(list *)malloc(sizeof(list));
r->cofi=q1->cofi+q2->cofi;
r->index=q1->index;
r->next=NULL;
q->next=r;
q=r;
q1=q1->next;
q2=q2->next;
}
else      //系数为0,跳过
{
q1=q1->next;
q2=q2->next;
}
}
}
else if(q1!=NULL&&q2==NULL)// 其中q2为空
{
r=(list *)malloc(sizeof(list));
r->cofi=q1->cofi;
r->index=q1->index;
r->next=NULL;
q->next=r;
q=r;
q1=q1->next;
}
else //                   其中q1为空
{
r=(list *)malloc(sizeof(list));
r->cofi=q2->cofi;
r->index=q2->index;
r->next=NULL;
q->next=r;
q=r;
q2=q2->next;
}

}
return p;
}
list *insert(list *l1,list *l2)//将l2插入l1中,返回l1
{
list * q1,*q2,* r;
int flag;
for(q2=l2->next;q2!=NULL;q2=q2->next)
{
flag=1;
q1=(list *)malloc(sizeof(list));
q1=l1;
while(q1->next!=NULL)
{
if(q2->index>q1->next->index)
{
r=(list *)malloc(sizeof(list));
r->cofi=q2->cofi;
r->index=q2->index;
r->next=q1->next;
q1->next=r;
flag=0;
break;   //插入后退出,继续插下一个
}
else if(q2->index==q1->next->index)
{
if((q1->next->cofi+q2->cofi)!=0)
{
q1->next->cofi=q1->next->cofi+q2->cofi;
flag=0;
break;
}
else
{
r=(list *)malloc(sizeof(list));
r=q1->next;
q1->next=r->next;
free(r);
flag=0;
break;
}
}
else
q1=q1->next;//比当前指数小,和下一个比较
}
if(flag==1)//flag是标志位,如果flag=1,表示没执行插入,插在l1末尾
{
r=(list *)malloc(sizeof(list));
r->cofi=q2->cofi;
r->index=q2->index;
r->next=q1->next;
q1->next=r;
}
}
return l1;
}
list *multiply(list *l1,list *l2)
{
list * q1,*q2,*p,*q,*r,*l3;
l3=(list *)malloc(sizeof(list));
l3->next=NULL;
for(q1=l1->next;q1!=NULL;q1=q1->next)
{
p=(list *)malloc(sizeof(list));
p->next=NULL;
q=p;
for(q2=l2->next;q2!=NULL;q2=q2->next)
{
r=(list *)malloc(sizeof(list));
r->cofi=q1->cofi*q2->cofi;
r->index=q1->index+q2->index;
r->next=NULL;
q->next=r;
q=r;
}
l3=insert(l3,p);
}
return l3;
}

void print(list *l)
{
list *p;
p=l->next;
//如果p为空,输出两个零,并返回
if(p==NULL)
{
printf("0 0\n");
return;
}
while(p->next!=NULL)
{
printf("%d %d ",p->cofi,p->index);
p=p->next;
}
printf("%d %d\n",p->cofi,p->index);
}
main()
{
list *L1,*L2,*L3,*L4;
L1=create();
L2=create();
L4=multiply(L1,L2);
print(L4);
L3=add(L1,L2);
print(L3);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C语言 单链表