设计函数分别求两个一元多项式的乘积与和。
输入格式:
输入分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<iostream>
#include<stdlib.h>
using namespace std;
typedef struct LNode
{
double coef;
int expn;
struct LNode *next;
}LNode,*LinkList;
LinkList InitList()//创建链表
{
int len;
LinkList L = (LinkList)malloc(sizeof(LNode));
LinkList S1, S2 = L;
cin>>len; //链表长度
for (int i = 0; i < len; i++)
{
S1 = (LinkList)malloc(sizeof(LNode));
cin>>S1->coef>>S1->expn;
S2->next = S1;
S2 = S2 ->next;
}
S2->next = NULL;
return L;
}
LinkList AddL(LinkList L1, LinkList L2)//求和函数
{
LinkList head = (LinkList)malloc(sizeof(LNode));
LinkList temp1 = L1->next;
LinkList temp2 = L2->next;
LinkList temp, temp3 = head;
LinkList temp4 = head; //比temp3慢一步的指针
while (NULL != temp1 && NULL != temp2)
{
temp = (LinkList)malloc(sizeof(LNode));
temp3->next = temp;
temp3 = temp3->next;
if (temp1->expn > temp2->expn)
{
temp->coef = temp1->coef;
temp->expn = temp1->expn;
temp1 = temp1->next;
}
else if (temp1->expn == temp2->expn)
{
temp->expn = temp2->expn;
temp->coef = temp2->coef + temp1->coef;
if (0 == temp->coef) //如果系数为0,那么这一项不存在
{
temp3 = temp4; //temp3返回到上一个节点
free(temp); //释放的,否则内存泄漏
}
temp2 = temp2->next;
temp1 = temp1->next;
}
else if (temp1->expn < temp2->expn)
{
temp->coef = temp2->coef;
temp->expn = temp2->expn;
temp2 = temp2->next;
}
temp4 = temp4->next;
}
if (NULL == temp1)
{
while (NULL != temp2)
{
temp = (LinkList)malloc(sizeof(LNode));
temp3->next = temp;
temp3 = temp3->next;
temp->coef = temp2->coef;
temp->expn = temp2->expn;
temp2 = temp2->next;
}
temp3->next = NULL;
}
else
{
while (NULL != temp1)
{
temp = (LinkList)malloc(sizeof(LNode));
temp3->next = temp;
temp3 = temp3->next;
temp->coef = temp1->coef;
temp->expn = temp1->expn;
temp1 = temp1->next;
}
temp3->next = NULL;
}
return head;
}
LinkList MultL(LinkList L1, LinkList L2)//求乘积函数
{
LinkList head = (LinkList)malloc(sizeof(LNode));
LinkList temp1, temp2;
temp1 = L1->next;
temp2 = L2->next;
if (NULL == temp1 || NULL == temp2) //如果其中一个多项式是0,那么乘积是0
{
head->next = NULL;
return head;
}
LinkList temp3, temp4;
temp3 = temp4 = head;
LinkList temp = NULL;
while (NULL != temp1) //用q的第一个元素乘以p的每一个元素,生成的第一轮的表
{
temp = (LinkList)malloc(sizeof(LNode));
temp->coef = temp1->coef * temp2->coef;
temp->expn = temp1->expn + temp2->expn;
temp3->next = temp;
temp3 = temp3->next;
temp1 = temp1->next;
}
temp3->next = NULL;
temp2 = L2->next->next;
while (NULL != temp2) //在第一轮的表的基础上进行乘积插入
{
temp1 = L1->next;
while (NULL != temp1)
{
temp4 = head;
temp3 = head->next;
temp = (LinkList)malloc(sizeof(LNode));
temp->coef = temp2->coef * temp1->coef;
temp->expn = temp2->expn + temp1->expn;
while (NULL != temp3)
{
if (temp->expn > temp3->expn)
{
temp->next = temp3;
temp4->next = temp;
break;
}
else if(temp->expn == temp3->expn)
{
temp3->coef += temp->coef;
if (0 == temp3->coef)
{
temp4->next = temp3->next;
free(temp3);
}
free(temp);
break;
}
temp4 = temp4->next;
temp3 = temp3->next;
}
if (NULL == temp3)
{
temp4->next = temp;
temp->next = NULL;
}
temp1 = temp1->next;
}
temp2 = temp2->next;
}
return head;
}
void PutL(LinkList L)
{
LinkList temp = L->next;
if (NULL == temp)
{
cout<<"0 0";
return;
}
else
{
cout<<temp->coef<<" "<<temp->expn;
temp = temp->next;
}
while (NULL != temp)
{
cout<<" "<<temp->coef<<" "<<temp->expn;
temp = temp->next;
}
}
int main()
{
LinkList L1,L2;
LinkList sum,mult;
L1 = InitList();
L2 = InitList();
mult = MultL(L1, L2);
PutL(mult);
cout<<endl;
sum = AddL(L1, L2);
PutL(sum);
return 0;
}