多项式计算也就是在动用链表 链表中存下多项式的系数和指数 使链表之间进行运算
加法:A+B的运算就等同于单链表的插入 使指数相同的系数相加减
减法:就是使相加法的后一项取余然后再做加法
乘法:使其A中链表节点与之B中链表所以节点依次相乘 然后按顺序插入进新建的链表中。。
#include<stdio.h>
#include<stdlib.h>typedef struct s
{
int coef; //多项式系数
int expn; //多项式指数
struct s *next;
}duoxiangshi;
duoxiangshi *creat() //创建多项式链表
{
duoxiangshi *head,*p,*rear;
int coef,expn;
head=rear=(duoxiangshi*)malloc(sizeof(duoxiangshi));
printf("请输入多项式数值\n");
scanf("%d%d",&coef,&expn);
while(coef)
{
//5printf("xxxxx");
p=(duoxiangshi*)malloc(sizeof(duoxiangshi));
p->coef=coef;
p->expn=expn;
rear->next=p;
rear=p;
scanf("%d%d",&coef,&expn);
}
rear->next=NULL;
return head;
}
int print(duoxiangshi *p)
{
duoxiangshi *q;
int flag=1;
q=p->next;
if(!q)
{
putchar('0');
printf("\n");
return 1;
}
while(q)
{
if(q->coef>0&&flag!=1)
putchar('+');
printf("%d",q->coef);
if(q->expn==1)
putchar('X');
else if(q->expn)
printf("X^%d",q->expn);
q=q->next;
flag++;
}
printf("\n");
return 0;
}
duoxiangshi * add(duoxiangshi *pa,duoxiangshi *pb)
{
duoxiangshi *qa=pa->next;
duoxiangshi *qb=pb->next;
duoxiangshi *qc,*pc,*headc;
pc=(duoxiangshi *)malloc(sizeof(duoxiangshi));
pc->next=NULL;
headc=pc;
while(qa!=NULL && qb!=NULL)
{
qc=(duoxiangshi *)malloc(sizeof(duoxiangshi));
if(qa->expn<qb->expn) //第一个多项式所指的项指数小于第二个多项式所指的项指数
{
qc->coef=qa->coef;
qc->expn=qa->expn;
qa=qa->next;
}
else if(qa->expn==qb->expn) //第一个多项式所指的项指数等于第二个多项式所指的项指数
{
qc->coef=qa->coef+qb->coef;
qc->expn=qa->expn;
qa=qa->next;
qb=qb->next;
}
else //第一个多项式所指的项指数大于第二个多项式所指的项指数
{
qc->coef=qb->coef;
qc->expn=qb->expn;
qb=qb->next;
}
if(qc->expn!=0)
{
qc->next=pc->next;
pc->next=qc;
pc=qc;
}
else
free(qc);
}
while(qa!=NULL) //第一个多项式有剩余,将剩余项插入
{
qc=(duoxiangshi *)malloc(sizeof(duoxiangshi));
qc->coef=qa->coef;
qc->expn=qa->expn;
qa=qa->next;
qc->next=pc->next;
pc->next=qc;
pc=qc;
}
while(qb!=NULL) //第二个多项式有剩余,将剩余项插入
{
qc=(duoxiangshi *)malloc(sizeof(duoxiangshi));
qc->coef=qb->coef;
qc->expn=qb->expn;
qb=qb->next;
qc->next=pc->next;
pc->next=qc;
pc=qc;
}
return headc;
}
duoxiangshi * jianfa(duoxiangshi *pa,duoxiangshi *pb)
{
duoxiangshi *pd;
duoxiangshi *h=pb;
duoxiangshi *p=h->next;
while(p)
{
p->coef*=-1;
p=p->next;
}
pd=add(pa,h);
return pd;
}
void insert(duoxiangshi *head,duoxiangshi *inpt)
{
duoxiangshi *pre,*now;
int flag=0;
pre=head;//pre定义为现在的前一个链节
if(pre->next==NULL)
{
pre->next=inpt;
flag=1;
}
else
{
now=pre->next;
}
while(flag==0)
{
if(inpt->expn>now->expn)//当新链节大于现在的连接时向后移一个链节
{
if(now->next==NULL)
{
now->next=inpt;
flag=1;
}
else
{
pre=now;
now=pre->next;
}
}
if(inpt->expn<now->expn)//如果发现比现在的链节小了就插入到这个连接的前面
{
inpt->next=now;
pre->next=inpt;
flag=1;
}
if(inpt->expn==now->expn) //如果指数相等
{
now->coef=now->coef+inpt->coef;
flag=1;
free(inpt);
if(now->coef==0)
{
pre->next=now->next;
free(now);
}
}
}
}
duoxiangshi *xiangcheng(duoxiangshi*pa,duoxiangshi *pb) //多项式相乘
{
duoxiangshi *inpt,*res,*pre;
int flag= 0;
res=(duoxiangshi *)malloc(sizeof(duoxiangshi));
res->next=NULL;
pa=pa->next;
pre=pb;
while(flag==0)
{
if(pre->next==NULL)
{
pre=pb;
pa=pa->next;
}
if(pa==NULL)
{
flag=1;
break;
}
pre=pre->next;
inpt=(duoxiangshi *)malloc(sizeof(duoxiangshi));
inpt->coef=pa->coef*pre->coef;
inpt->expn=pa->expn+pre->expn;
inpt->next=NULL;
insert(res,inpt); //把新创立的节点插入进头res节点中
}
return res;
}
jiemian() //界面选择函数
{
duoxiangshi *pa,*pb,*pc;
int choice,temp=1;
while(temp)
{
printf("输入你的选择\n");
printf(" **************************************************** \n");
printf(" 输入1 进行加法 输入2 进行减法 \n");
printf(" 输入3 进行乘法 输入0 退出 \n");
printf(" **************************************************** \n");
scanf("%d",&choice);
switch(choice)
{
case(1):
printf("请输入第一个多项式\n");
pa=creat();
printf("请输入第二个多项式\n");
pb=creat();
pc=add(pa,pb);
print(pc);
break;
case(2):
printf("请输入第一个多项式\n");
pa=creat();
printf("请输入第二个多项式\n");
pb=creat();
pc=jianfa(pa,pb);
print(pc);
break;
case(3):
printf("请输入第一个多项式\n");
pa=creat();
printf("请输入第二个多项式\n");
pb=creat();
pc=xiangcheng(pa,pb);
print(pc);
break;
case(0):
temp=0;
break;
if(temp==0)
break;
}
}
}
main()
{
jiemian();
}