多项式之加减乘

多项式计算也就是在动用链表  链表中存下多项式的系数和指数  使链表之间进行运算  

加法: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();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值