结果:
具体后面有时间再写吧,要找时间复习一下指针和结构体之类的了。
#include<stdio.h>
#include<stdlib.h>
typedef struct PolyomialNode* PolyomialType;
struct PolyomialNode
{
int coef;//系数coefficient
int expon; //指数
PolyomialType link;
};
PolyomialType input_init(int N) //接收输入
{
PolyomialType P = (PolyomialType)malloc(sizeof(struct PolyomialNode));
PolyomialType Header = NULL;
PolyomialType S = NULL;
for (int i = 0; i < N; i++)
{
S = (PolyomialType)malloc(sizeof(struct PolyomialNode));
while(!scanf("%d", &(S->coef)));
while(!scanf("%d", &(S->expon)));
P->link = S;
P = S;
if (Header==NULL)
Header = S;
}
S = (PolyomialType)malloc(sizeof(struct PolyomialNode));
S->link = NULL;
P->link = S;//使得链表最后一个元素时指向NULL
P = S;
//此处若直接P.link=NULL则会漏掉最后一个数
return Header;
}
void Insert(PolyomialType *P, int expon, int coef) //插入元素
{
PolyomialType S = NULL;
S = (PolyomialType)malloc(sizeof(struct PolyomialNode));
S->expon = expon;
S->coef = coef;
S->link = NULL;
(*P)->link = S;
(*P) = S;
return ;
}
PolyomialType Sum(PolyomialType T1, PolyomialType T2) //求和多项式
{
PolyomialType P = (PolyomialType)malloc(sizeof(struct PolyomialNode));
PolyomialType S = NULL, Header = P;
// PolyomialType T1 = *P1, T2 = *P2;
while (T2->link && T1->link) //两边同时不为空时
{
if (T1->expon == T2->expon)
{
if((T1->coef+T2->coef)!=0) //同类项合并时有抵消则不添加
Insert(&P, T1->expon, T1->coef+T2->coef);
T1 = T1->link;
T2 = T2->link;
}
else if(T1->expon > T2->expon)
{
Insert(&P, T1->expon, T1->coef);
T1 = T1->link;
}
else if(T1->expon < T2->expon)
{
Insert(&P, T2->expon, T2->coef);
T2 = T2->link;
}
}
while (T2->link)
{
Insert(&P, T2->expon, T2->coef);
T2 = T2->link;
}
while (T1->link)
{
Insert(&P, T1->expon, T1->coef);
T1 = T1->link;
}
S = (PolyomialType)malloc(sizeof(struct PolyomialNode));
S->link = NULL;
P->link = S;//使得链表最后一个元素时指向NULL
P = S;
return Header->link;
}
PolyomialType Multiply(PolyomialType P1, PolyomialType P2) //求乘积多项式
{
PolyomialType Sum_P = (PolyomialType)malloc(sizeof(struct PolyomialNode));
Sum_P->link = NULL;
PolyomialType S = NULL;
PolyomialType T1 = P1, T2 = P2;
while (T2->link) //两边同时不为空时
{
PolyomialType P = (PolyomialType)malloc(sizeof(struct PolyomialNode));
P->link = NULL;
PolyomialType S = NULL, Headers = P;
while (T1->link)
{
Insert(&P, T1->expon+T2->expon, T1->coef*T2->coef);
T1 = T1->link;
}
S = (PolyomialType)malloc(sizeof(struct PolyomialNode));
S->link = NULL;
P->link = S;//使得链表最后一个元素时指向NULL
Sum_P = Sum(Sum_P,Headers->link);
free(P);
T2 = T2->link;
T1 = P1;
}
return Sum_P;
}
int main()
{
int N = 0;
PolyomialType P1 = (PolyomialType)malloc(sizeof(struct PolyomialNode));
PolyomialType P2 = (PolyomialType)malloc(sizeof(struct PolyomialNode));
PolyomialType S;
while(!scanf("%d",&N));
if(N==0)//输入为零项时
{
P1->coef = 0;
P1->expon = 0;
S = (PolyomialType)malloc(sizeof(struct PolyomialNode));
S->link = NULL;
P2->link = S;//使得链表最后一个元素时指向NULL
}
else P1 = input_init(N);
while(!scanf("%d",&N));
if(N==0)
{
P2->coef = 0;
P2->expon = 0;
S = (PolyomialType)malloc(sizeof(struct PolyomialNode));
S->link = NULL;
P2->link = S;//使得链表最后一个元素时指向NULL
}
else P2 = input_init(N);
PolyomialType Sum_P = Sum(P1, P2);
PolyomialType Multiply_P = Multiply(P1, P2);
if(!Multiply_P->link) // 系数和指数取上限,结果有零多项式
{
printf("0 0");
}
else
while (Multiply_P->link)
{
printf("%d %d", (*Multiply_P).coef, (*Multiply_P).expon);
Multiply_P = Multiply_P->link;
if(Multiply_P->coef==0 && Multiply_P==0)
break;
if(Multiply_P->link)
printf(" ");
}
printf("\n");
if(!Sum_P->link) // 系数和指数取上限,结果有零多项式
printf("0 0");
while (Sum_P->link)
{
printf("%d %d", (*Sum_P).coef, (*Sum_P).expon);
Sum_P = Sum_P->link;
if(Multiply_P->coef==0 && Multiply_P==0)
break;
if(Sum_P->link)
printf(" ");
}
return 0;
}