https://pintia.cn/problem-sets/910354764736491520/problems/910354975319912449(一元多项式的乘法和加法)点击打开题目链接
注意:很巧妙地求解办法,技巧很多,需要好好理解,自己想的还不够,先记下,再找时间慢慢消化。
代码:
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
//函数状态码定义
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int Status;
typedef struct
{
int coef;//系数
int expn;//指数
} Term;
typedef Term ElemType; //假设线性表中的元素均为
typedef struct LNode
{
ElemType data;//一个元素,包括系数和指数
struct LNode *next;
} LNode,*LinkList;
//
//typedef LinkList Polynomial;
LinkList Insert(LinkList &P,LinkList q)
{
LNode *pre,*p;
pre=P;
p=P->next;
while(p&&p->data.expn>q->data.expn)//如果没到最后一个,并且指数较大,一直后移,
//直到找到一个比它小的
{
p=p->next;//当前结点
pre=pre->next;//当前结点的后一个结点
}
if(!p)//如果当前结点已经到了最后一个
{
pre->next=q;
q->next=NULL;//直接赋值
}
else
{
if(p->data.expn==q->data.expn)//否则,插入其中
{
int sum=(p->data.coef+q->data.coef);
if(!sum)
{
pre->next=p->next;
free(p);
}
else
{
p->data.coef=sum;
}
}
else
{
pre->next=q;
q->next=p;
}
}
return P;
}
LinkList CreatPolyn(LinkList &P,int n)
{
LinkList q;
P=(LNode *)malloc(sizeof(LNode ));
if(!P)
exit(OVERFLOW);
P->next=NULL;
for(int i=1; i<=n; i++)
{
q=(LNode *)malloc(sizeof(LNode));
if(!q)
exit(OVERFLOW);
scanf("%d %d",&q->data.coef,&q->data.expn);//两个结构体变量,直接写入
P=Insert(P,q);//创建链表
}
return P;
}
LinkList AddPoly(LinkList Pa,LinkList Pb)
{
LinkList pa,pb,temp;
LinkList Pc;
Pc=(LNode *)malloc(sizeof(LNode ));
if(!Pc)
exit(OVERFLOW);
Pc->next=NULL;
pa=Pa->next;
pb=Pb->next;
while(pb!=NULL)
{
temp=pb->next;
Pc=Insert(Pc,pb);
pb=temp;
}
while(pa!=NULL)
{
temp=pa->next;
Pc=Insert(Pc,pa);
pa=temp;
}
return Pc;
}
LinkList MulPoly(LinkList Pa,LinkList Pb)
{
LinkList pa,pb,pc;
LinkList Pc;
Pc=(LNode *)malloc(sizeof(LNode ));
if(!Pc)
exit(OVERFLOW);
Pc->next=NULL;
pa=Pa->next;
pb=Pb->next;
while(pa!=NULL)
{
// LinkList s;
// s=(LNode *)malloc(sizeof(LNode));
// s->next=NULL;
while(pb!=NULL)
{
LinkList q;
q=(LNode *)malloc(sizeof(LNode));
q->data.coef=(pa->data.coef)*(pb->data.coef);
q->data.expn=(pa->data.expn)+(pb->data.expn);
Pc=Insert(Pc,q);
pb=pb->next;
}
if(pb==NULL)
pb=Pb->next;
pa=pa->next;
}
return Pc;
}
void Output(LinkList &P)
{
LinkList p;
int flag=0;
p=P->next;
if(p==NULL)
printf("0 0");
else
{
while(p!=NULL)
{
if(p->data.coef!=0)
{
if(!flag)
printf("%d %d",p->data.coef,p->data.expn);
else
printf(" %d %d",p->data.coef,p->data.expn);
flag++;
}
p=p->next;
}
}
printf("\n");
}
int main()
{
int n,m;
LinkList Pa,Pb,Pc,Pd;
Pc=(LNode *)malloc(sizeof(LNode ));
if(!Pc)
exit(OVERFLOW);
Pc->next=NULL;
Pd=(LNode *)malloc(sizeof(LNode ));
if(!Pd)
exit(OVERFLOW);
Pd->next=NULL;
scanf("%d",&n);
Pa=CreatPolyn(Pa,n);//创建乘积链表
scanf("%d",&m);
Pb=CreatPolyn(Pb,m);
Pd=MulPoly(Pa,Pb);
Pc=AddPoly(Pa,Pb);
Output(Pd);
Output(Pc);
}