您的位置:首页 > 其它

一元多次多项式的四则运算

2012-11-17 13:13 183 查看
#include <stdio.h>
#include<stdlib.h>

#define  Error  1
#define  Ok     0
typedef int Status;
typedef int ElemType;
typedef struct term{
float coef;
int expn;
struct term *next;
}term,*Linklist;                            //每个数据节点的结构体的定义  coef为浮点型的常数位, expn为整数类型的指数位

Linklist Ini_Polynomial ()                 //初始化
{
Linklist L;
L=(term*)malloc(sizeof(Linklist));
L->expn=-1;
L->next=NULL;
if(!L)    exit(1);
return L;
}
Status  Creat_Polynomial(Linklist L)         //创建链表
{
Linklist p,q;
p=L;
q=(term*)malloc(sizeof(Linklist));
printf("请按照让指数从小到大的顺序输入一元n次多项式的系数和指数(系数,指数)(当输入0时结束)");
scanf("%f,%d",&q->coef,&q->expn);
while(q&&(q->coef!=0||q->expn!=0))
{
p->next=q;
p=q;
q=(term*)malloc(sizeof(Linklist));
scanf("%f,%d",&q->coef,&q->expn);
}
p->next=NULL;
if(!q) printf("输入不能为空啊");  return Error;
return Ok;
}

Status GetElem_linklist(Linklist L,int i , int *e )           //取多项式中第i项的指数幂
{

Linklist p;   int j;j=0;
p=L->next;
while(p&&(j<i))
{
p=p->next;++j;
}
if (!p||(j>i)) {printf("没有这个数字"); return  Error;}
*e=p->expn;
return (*e);
}

int cmp(int a,int b)            //比较a,b大小    当a<b时 返回-1
{
if(a<b)  return -1;
else
{
if(a==b)  return 0;
else
if(a>b) return   1;
}
}
Status equal(Linklist s, Linklist Lc)       //判断在现有的Lc中 是否有与s具有相同指数幂的项
{
Linklist p;
p=Lc->next;
while(p)
{
if(p->expn==s->expn)
{
return 1;
}
p=p->next;
}
return 0;

}

Status Insert_Polynomial(Linklist s,Linklist Lc)           //将新生成的项加入到lc中
{
if(s->coef==0)  free(s);
else
{
Linklist lc1;
lc1=Lc;
//lc2=Lc->next;
if(lc1->next==NULL)  {lc1->next=s; lc1=lc1->next;  lc1->next=NULL;}
else
{
lc1=lc1->next;
switch(equal(s,Lc))     //判断在现有的Lc中 是否有与s具有相同指数幂的项
{
case 0:   //如果没有,直接找到位置插入
while(s->expn>lc1->expn&&lc1->next!=NULL&&s->expn>lc1->next->expn)
{
lc1=lc1->next;
}
s->next=lc1->next;
lc1->next=s;
lc1=s;
break;
case 1:   //如果有,将两项的常数项相加
while(lc1->expn!=s->expn&&lc1->next!=NULL)
{
lc1=lc1->next;
}
lc1->coef=lc1->coef+s->coef;
break;
}
}
}
return Ok;
}

int Abs(int i)
{
if(i<0)
{
i=-i;
return i;
}
else
return i;
}
Status AddPolyn(Linklist pa,Linklist pb,Linklist pc)         //加法
{
Linklist la,lb,lc;int i,j,a,b; float sum;
Linklist s;
i=0;j=0;

la=pa->next;lb=pb->next;lc=pc;
while(la&&lb)
{
s=(term*)malloc(sizeof(Linklist));
a=GetElem_linklist(pa,i,&a);                //取两项的指数幂分别复制给a,b
b=GetElem_linklist(pb,j,&b);

switch (cmp(a,b))     //比较两个项的指数幂的大小
{
case -1:     //当la中的指数小于lb中的 就将la中的该项插入到lc中
s->coef=la->coef;
s->expn=la->expn;
lc->next=s;
lc=s;
la=la->next;
i++;
break;
case 0:       //当la中的指数等lb中的 就将la和lb中的该项常数项相加 插入到lc中
sum=la->coef+lb->coef;
if(sum!=0)
{
s->coef=sum;
s->expn=la->expn;
lc->next=s;
lc=s;
la=la->next;lb=lb->next;
i++;j++;
}
else{  i++;j++; }
break;
case 1:             //当la中的指数大于lb中的 就将lb中的该项插入到lc中
s->coef=lb->coef;
s->expn=lb->expn;
lc->next=s;
lc=s;
lb=lb->next;
j++;
break;
}
}
if(!la&&lb)         //当la中的项插完而lb中的项还有  将lb中的剩余项全部插入
{
s=(term*)malloc(sizeof(Linklist));
s->coef=lb->coef;
s->expn=lb->expn;
lc->next=s;
lc=s;
lb=lb->next;
lc->next=NULL;
}
else
if(la&&!lb)    //当lb中的项插完而lb中的项还有  将la中的剩余项全部插入
{
s=(term*)malloc(sizeof(Linklist));
s->coef=la->coef;
s->expn=la->expn;
lc->next=s;
lc=s;
la=la->next;
lc->next=NULL;
}
else
return Ok;

}

Status SubtractionPolyn(Linklist pa,Linklist pb,Linklist pc)         //减法
{
Linklist la,lb,lc;int i,j,a,b; float sum;
Linklist s;
i=0;j=0;

la=pa->next;lb=pb->next;lc=pc;
while(la&&lb)
{
s=(term*)malloc(sizeof(Linklist));
a=GetElem_linklist(pa,i,&a);
b=GetElem_linklist(pb,j,&b);              //取两项的指数幂分别复制给a,b

switch (cmp(a,b))
{
case -1:    //同上
s->coef=la->coef;
s->expn=la->expn;
lc->next=s;
lc=s;
la=la->next;
i++;
break;
case 0:
sum=la->coef-lb->coef;
if(sum!=0)
{
s->coef=sum;
s->expn=la->expn;
lc->next=s;
lc=s;
la=la->next;lb=lb->next;
i++;j++;
}
else{  i++;j++; }
break;
case 1:
s->coef=-lb->coef;
s->expn=lb->expn;
lc->next=s;
lc=s;
lb=lb->next;
j++;
break;
}
}
if(!la&&lb)
{
s=(term*)malloc(sizeof(Linklist));
s->coef=-lb->coef;
s->expn=lb->expn;
lc->next=s;
lc=s;
lb=lb->next;
lc->next=NULL;
}
else
if(la&&!lb)
{
s=(term*)malloc(sizeof(Linklist));
s->coef=la->coef;
s->expn=la->expn;
lc->next=s;
lc=s;
la=la->next;
lc->next=NULL;
}
else
return Ok;
}
Linklist MultplyPolynomial(Linklist pa ,Linklist pb,Linklist w)        //乘法运算
{
Linklist qa;Linklist qb,y;
qa=pa->next;qb=pb->next;
while(qa)
{
while(qb)                        //两层嵌套循环  让每一个qa中的项分别和qb中的项相乘
{
y=(term*)malloc(sizeof(Linklist));
y->coef=qa->coef*qb->coef;
y->expn=qa->expn+qb->expn;     //y是qa*qb后的合并项
Insert_Polynomial(y,w);    //将合并的项插入到w中
qb=qb->next;
}
qa=qa->next;
qb=pb->next;
}
return w;
}
Linklist DivisionPolynomial(Linklist pa ,Linklist pb,Linklist w)        //除法运算
{
Linklist qa;Linklist qb,y;
qa=pa->next;qb=pb->next;
while(qa)
{
while(qb)
{
y=(term*)malloc(sizeof(Linklist));
y->coef=qa->coef/qb->coef;
y->expn=qa->expn-qb->expn;
Insert_Polynomial(y,w);
qb=qb->next;
}
qa=qa->next;
qb=pb->next;
}
return w;
}
void Start()
{
printf("***************************************\n");
printf("******欢迎使用一元多次方程计算器*******\n");
printf("*********0.结束运算并退出**************\n");
printf("*********1.进行加法运算****************\n");
printf("*********2.进行减法运算****************\n");
printf("*********3.进行乘法运算****************\n");
printf("*********4.进行除法运算****************\n");
}
void print(Linklist L)
{
Linklist p;
p=L->next;
printf("y=");
while(p!=NULL)
{
if(p->coef!=0)
{	if(p->expn==1)
{
if(p->coef==1)
{
printf("X");
}
else if(p->coef==-1)
{
printf("-x");
}
else
printf("%.1fX",p->coef);
if(p->next!=NULL)
{
if(p->next->coef<0) printf("");
else printf("+");
}
}
else
if(p->expn==0)
{
printf("%.1f",p->coef);
if(p->next!=NULL)
{
if(p->next->coef<0) printf("");
else printf("+");
}
}
else
{
if(p->coef==1)
{
printf("X^%d",p->expn);
}
else if(p->coef==-1)
{
printf("-X^%d",p->expn);
}
else
printf("%.1fX^%d",p->coef,p->expn);
if(p->next!=NULL)
{
if(p->next->coef<0) printf("");
else printf("+");
}
}
}
p=p->next;
}
printf("\n");
printf("\n");
}
void Choose(Linklist pa,Linklist pb,Linklist pc,int i)
{
Linklist p1,p2,p3,p4;
p1=p2=p3=p4=pc;
switch(i)
{
case 1:   //加法
AddPolyn(pa,pb,p1);
printf("您的方程进行加法运算后的方程为:\n");
print(pc);
break;
case 2:   //减法
SubtractionPolyn(pa,pb,p2);
printf("您的方程进行减法运算后的方程为:\n");
print(pc);
break;
case 3:   //乘法
MultplyPolynomial(pa,pb,p3);
printf("您的方程进行乘法运算后的方程为:\n");
print(pc);
break;
case 4:     //除法
DivisionPolynomial(pa,pb,p4);
printf("您的方程进行除法运算后的方程为:\n");
print(pc);
break;
}
}
void main()
{
int i;Linklist pa,pb,pc;
Start();
printf("请选择");
scanf("%d",&i);
while(i!=0)
{
pc=Ini_Polynomial();
pa=Ini_Polynomial();
Creat_Polynomial(pa);
printf("您输入的第一个方程为:\n");
print(pa);
pb=Ini_Polynomial();
Creat_Polynomial(pb);
printf("您输入的第二个方程为:\n");
print(pb);
Choose(pa,pb,pc,i);
Start();
printf("请选择");
scanf("%d",&i);
}
if(i==0)
{
printf("感谢您的使用!!!(按任意键退出)");
}
getchar();
getchar();
}


这个一元n次多项式的四则运算从构思查资料到最后实现应该是用了差不多一个星期的时间,因为当时班里没几个人做(没几个人把这个当事的。。。)然后我做出来了心情happy了一逼啊,

记得当时做出来时第一个马上就分享这快乐的是我的女朋友,虽然她看不太懂,但是跟她分享后我更加开心,总感觉,我离能给她个好的未来更近了一步,可是光阴荏苒,离那一刻不过半年多的时间,已然物是人非了,留在原地的,只是我一个人了

其实这个程序没有什么很多算法,就是简单的将多项式中的每一项的常数项和指数存放在链表中,然后在运算中根据运算原理加减乘除,最后存在一个新的链表中并排序

其中这个程序的出现形式和乘法的算法是参考了网上的一个同学的课程设计中的
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: