题目描述:
设计函数分别求两个一元多项式的乘积与和。
输入格式:
输入分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 int ElemType;
struct Poly//定义结构
{
ElemType ceof;
ElemType expon;
struct Poly* next;
};
typedef struct Poly* Polynomial;
void Attach(ElemType c, ElemType e, Polynomial* rear)//链表中插入元素
{
Polynomial p;
p = (Polynomial)malloc(sizeof(struct Poly));
p->ceof = c;
p->expon = e;
p->next = NULL;
(*rear)->next = p;
*rear = p;
}
Polynomial Read()//创建链表
{
int n;
Polynomial rear, p, temp;
p = (Polynomial)malloc(sizeof(struct Poly));
p->next = NULL;
rear = p;
ElemType c, e;
scanf("%d", &n);
while (n--)
{
scanf("%d%d", &c, &e);
Attach(c, e, &rear);
}
temp = p; p = p->next; free(temp);
return p;
}
int Compare(int a, int b)//比较函数
{
if (a > b)return 1;
else if (a < b)return -1;
else return 0;
}
Polynomial Add(Polynomial p1, Polynomial p2)//多项式相加
{
Polynomial p, rear, t1, t2, temp;
ElemType sum = 0;
rear= (Polynomial)malloc(sizeof(struct Poly));
p=rear;
t1 = p1; t2 = p2;
while (t1 && t2)
{
switch (Compare(t1->expon, t2->expon))
{
case 1:
Attach(t1->ceof, t1->expon, &rear);
t1 = t1->next;
break;
case -1:
Attach(t2->ceof, t2->expon, &rear);
t2 = t2->next;
break;
case 0:
sum = t1->ceof + t2->ceof;
if (sum == 0)
{
t1 = t1->next;
t2 = t2->next;
break;
}
else
{
Attach(sum, t1->expon, &rear);
t1 = t1->next;
t2 = t2->next;
break;
}
}
}
while (t1)
{
Attach(t1->ceof, t1->expon, &rear);
t1 = t1->next;
}
while (t2)
{
Attach(t2->ceof, t2->expon, &rear);
t2 = t2->next;
}
rear->next = NULL;
temp = p;
p = p->next;
free(temp);
return p;
}
Polynomial Mult(Polynomial p1, Polynomial p2)//多项式相乘
{
if (!p1 || !p2) return NULL;
Polynomial p, rear, t1, t2, temp, cnt;
ElemType c, e;
p = (Polynomial)malloc(sizeof(struct Poly));
p->next = NULL;
rear = p;
t1 = p1; t2 = p2;
while (t2)
{
Attach(t1->ceof * t2->ceof, t1->expon + t2->expon, &rear);
t2 = t2->next;
}
t1 = t1->next;
while (t1)
{
t2 = p2; rear = p;
while (t2)
{
c = t1->ceof * t2->ceof;
e = t1->expon + t2->expon;
while (rear->next && rear->next->expon > e)
rear = rear->next;
if (rear->next && rear->next->expon == e)
{
if (rear->next->ceof + c)
{
rear->next ->ceof += c;
}
else {
temp = rear->next;
rear->next = temp->next;
free(temp);
}
}
else
{
temp = (Polynomial)malloc(sizeof(struct Poly));
temp->ceof = c;
temp->expon = e;
temp->next = rear->next;
rear->next = temp;
rear = rear->next;
}
t2=t2->next;
}
t1=t1->next;
}
cnt = p;
p = p->next;
free(cnt);
return p;
}
void Print(Polynomial p)//打印多项式
{
int flag = 0;
if (!p)
{
printf("0 0\n");
return;
}
while (p)
{
if (!flag)
{
flag = 1;
}
else
{
printf(" ");
}
printf("%d %d", p->ceof, p->expon);
p = p->next;
}
printf("\n");
}
int main()
{
Polynomial p1, p2, p3, p4;
p1 = Read();
p2 = Read();
p3 = Mult(p1, p2);
Print(p3);
p4 = Add(p1, p2);
Print(p4);
}