您的位置:首页 > 编程语言 > C语言/C++

多项式的c语言算法实现(包含加、减、乘。除法还未写好)

2009-10-13 17:16 274 查看
#include<string.h>
#include<stdio.h>
#include<stdlib.h>
typedef struct node
{
float exof;//系数
int expn;//指数
}DataNode;
typedef struct Node
{
DataNode data;
struct Node *next;
}PolyNode,*Polynomial;
typedef enum {error,ok,fail,success}Status;
Status CreatPoly(Polynomial &poly,int n)//正序法创建多项式
{
Polynomial head,tail,current;//定义头、尾和当前节点
float exof;
int expn;
head=(Polynomial)malloc(sizeof(PolyNode));
if(!head) return fail;
head->next=NULL;
poly=head;
tail=head;
printf("请输入多项式的系数和指数!/n");
for(int i=0;i<n;i++)
{

current=(Polynomial)malloc(sizeof(PolyNode));
if(!current) return fail;
current->next=tail->next;//哥曾经犯错误的地方
tail->next=current;
scanf("%f%d",&exof,&expn);
fflush(stdin);
(current->data).exof=exof;
(current->data).expn=expn;
//lush(stdin);
//printf("jajklfs");
tail=current;
}
return success;
}
/*Status CreatbPoly(Polynomial &poly,int n)//正序法创建多项式
{
Polynomial head,tail,current;//定义头、尾和当前节点
float exof;
int expn;
head=(Polynomial)malloc(sizeof(PolyNode));
if(!head) return fail;
head->next=NULL;
poly=head;
tail=head;
printf("请输入多项式的系数和指数!/n");
for(int i=0;i<n;i++)
{

current=(Polynomial)malloc(sizeof(PolyNode));
if(!current) return fail;
current->next=tail->next;//哥曾经犯错误的地方
tail->next=current;
scanf("%f%d",&exof,&expn);
fflush(stdin);
(current->data).exof=exof;
(current->data).expn=expn;
//lush(stdin);
//printf("jajklfs");
tail=current;
}
return success;
}*/
Status InsertPoly(Polynomial &poly,int pos)//插入节点
{
Polynomial newpoly;
int i=0;
newpoly=(Polynomial)malloc(sizeof(PolyNode));
if(!newpoly) return fail;
printf("请输入要插入多项式元素的系数和指数/n");
scanf("%f %d",&(newpoly->data.exof),&(newpoly->data.expn));
while(poly&&i<pos-1)
{
poly=poly->next;
}
newpoly->next=poly->next;
poly->next=newpoly;
return success;
}
Status DeletePoly(Polynomial &poly,int pos)
{
Polynomial tempoly;
int i=0;
//tempoly=(Polynomial)malloc(sizeof(PoluNode));
//if(!newpoly) return fail;
//printf("请输入要插入多项式元素的系数和指数/n");
//scanf("%f %d",&(newpoly->daya.exof),&(newpoly->data.expn));
while(poly&&i<pos-1)
{
poly=poly->next;
}
tempoly=poly->next;
poly->next=tempoly->next;
free(tempoly);
return success;
}
Status ReplacePoly(Polynomial &poly,int pos)
{
Polynomial newpoly,tempoly;
int i=0;
newpoly=(Polynomial)malloc(sizeof(PolyNode));
if(!newpoly) return fail;
printf("请输入要插入多项式元素的系数和指数/n");
scanf("%f %d",&(newpoly->data.exof),&(newpoly->data.expn));
while(poly&&i<pos-1)
{
poly=poly->next;
}
tempoly=poly->next;
newpoly->next=tempoly->next;
poly->next=newpoly;
free(tempoly);
return success;
}
int Compare(Polynomial &pa,Polynomial &pb)//多项式的指数大小比较,pa>pb 返回1;pa=pb 返回0;pa<pb 返回-1;
{
//pa=pa->next;pb=pa->next;
if((pa->data).expn >(pb->data).expn)
{
return 1;
}
else if((pa->data).expn==(pb->data).expn)
{
return 0;
}
else if((pa->data).expn<(pb->data).expn)
{
return -1;
}
else
return -2;

}
void AddPoly(Polynomial &pa,Polynomial &pb)//多项式加法
{
Polynomial heada,headb,priora,priorb;

priora=pa;
priorb=pb;

heada=priora;
headb=priorb;
pa=pa->next;pb=pb->next;
//printf("请输入未知数x的值:/n");
while(pa&&pb)
{

if(Compare(pa,pb)==1)
{
priora->next=pb;
priorb->next=pb->next;
pb->next=pa;

priora=pb;
pb=priorb->next;
}
else if(Compare(pa,pb)==0)
{
pa->data.exof=pa->data.exof+pb->data.exof;
priora=pa;priorb=pb;
pa=pa->next;pb=pb->next;
}
else if(Compare(pa,pb)==-1)
{
priora=pa;
pa=pa->next;
}

}
if(!pa&&pb)
{
priora->next=pb;
priorb=pb->next;
}
pb=headb;
pa=heada;

}
void SubPoly(Polynomial &pa,Polynomial &pb)//多项式减法
{
Polynomial heada,headb,priora,priorb;

priora=pa;
priorb=pb;

heada=priora;
headb=priorb;
pa=pa->next;pb=pb->next;
//printf("请输入未知数x的值:/n");
while(pa&&pb)
{

if(Compare(pa,pb)==1)
{
pb->data.exof=-(pb->data.exof);
priora->next=pb;
priorb->next=pb->next;
pb->next=pa;

priora=pb;
pb=priorb->next;
}
else if(Compare(pa,pb)==0)
{
pa->data.exof=pa->data.exof-pb->data.exof;
priora=pa;priorb=pb;
pa=pa->next;pb=pb->next;
}
else if(Compare(pa,pb)==-1)
{
priora=pa;
pa=pa->next;
}

}
if(!pa&&pb)
{
priora->next=pb;
//priorb=pb->next;
while(pb)
{
pb->data.exof=-(pb->data.exof);
pb=pb->next;
}
}
free(headb);
pa=heada;

}
void MulPoly(Polynomial &pa,Polynomial &pb)//多项式乘法
{
/* pa的第一项乘以pb的每一项,把相乘的结果放到temppa(存放第一次乘法结果)和temppb(从第二次乘法开始的每一次乘法结果都放到temppb中)中,
然后进行相加,每循环一次乘法,temppa与temppb进行加法一次,加法结果放到temppa链表中。

*/
Polynomial heada,headb,priora,priorb,temppa,temppb,tempha,temphb;
float sum=0;
int i=0;
heada=pa;
headb=pb;
priora=pa;priorb=pb;
pa=pa->next;pb=pb->next;//指向第一个节点
tempha=(Polynomial)malloc(sizeof(PolyNode));//新创临时头节点
tempha->next=NULL;
temphb=(Polynomial)malloc(sizeof(PolyNode));//新创临时头节点
temphb->next=NULL;
for(pa;pa!=NULL;pa=pa->next)
{
for(pb=priorb->next;pb!=NULL;pb=pb->next)
{
if(i<1)
{
temppa=(Polynomial)malloc(sizeof(PolyNode));
temppa->data.exof=(pa->data.exof)*(pb->data.exof);
temppa->data.expn=(pa->data.expn)+(pb->data.expn);
temppa->next=tempha->next;
tempha->next=temppa;

}
else
{
temppb=(Polynomial)malloc(sizeof(PolyNode));
temppb->data.exof=pa->data.exof*pb->data.exof;
temppb->data.expn=pa->data.expn+pb->data.expn;
temppb->next=temphb->next;
temphb->next=temppb;
AddPoly(tempha,temphb);
temphb->next=NULL;
/* Polynomial tphb,temp;
tphb=temphb;
temphb=temphb->next;
while(temphb)
{
temp=temphb;
free(temp);
temphb=temphb->next;
}
temphb=tphb;
*/
}

}

i++;
}
pa=tempha;
}
void DivPoly(Polynomial &pa,Polynomial &pb)//多项式除法
{

}
float PrintResult(Polynomial &pa,float x)//输出结果
{
float sum=1.0,totalsum=0.0;
Polynomial head;
head=pa;
pa=pa->next;//指向第一个节点
while(pa)
{
for(int i=0;i<(pa->data).expn;i++)
{
sum=sum*x;
}
sum=sum*(pa->data).exof;
totalsum+=sum;
pa=pa->next;
sum=1.0;

}
pa=head;
return totalsum;
}
void main()
{
Polynomial polya,polyb;//定义两个多项式
int flag0,flag1;//循环标志
int na,nb;//多项式的元素个数
int posa,posb;//修改操作多项式元素的位置
char cflag='/0',coflag='/0';//修改多项式标志
Status sacflag=fail,sbcflag=fail;//创建多项式结果标志
Status siflag=fail,sdflag=fail,srflag=fail;//插入返回标志、删除返回标志、替换返回标志
float fsumresult;//运算结果
float x;
printf(" 线性表的应用——多项式/n");
while(flag0!=0)//交互界面循环
{
printf("请选择操作:/n");
printf("1 创建多项式 2 多项式加法/n");
printf("3 修改多项式 4 多项式减法/n");
printf("5 多项式乘法 6 多项式除法/n");
printf("0 退出操作/n");
scanf("%d",&flag1);
switch(flag1)
{ //操作选择控制
case 1:
printf("请输入要创建的多项式a元素个数/n");
scanf("%d",&na);
sacflag=CreatPoly(polya,na);
if(sacflag==success)
printf("创建多项式a成功!/n");
else if(sacflag==fail)
printf("创建多项a失败!/n");
printf("请输入要创建的多项式b元素个数/n");
scanf("%d",&nb);
sbcflag=CreatPoly(polyb,nb);
if(sbcflag==success)
printf("创建多项式b成功!/n");
else if(sbcflag==fail)
printf("创建多项式b失败!/n");
break;
case 2:
if(sacflag!=success||sbcflag!=success)
printf("请先创建多项式/n");
else
{
// printf("请输入未知数x的值:/n");
AddPoly(polya,polyb);
printf("请输入未知数x的值:/n");
scanf("%f",&x);
printf("加法运算结果为:/n");
fsumresult=PrintResult(polya,x);
printf("%f/n",fsumresult);
}
break;
case 3:
if(sacflag!=success||sbcflag!=success)
printf("请先创建多项式/n");
else
{
printf("请选择要修改的多项式:/n");
printf("a 修改多项式polya b 修改多项式polyb/n");
printf("请输入要修改的对象:/n");
fflush(stdin);
cflag=(char)getchar();
//scanf("%c",&cflag);
fflush(stdin);//哥在这里犯过错误
//printf("请输入要修改的对象:/n");
switch(cflag)
{
case 'a':
printf("请输入要修改多项式的操作:/n");
printf("a 添加多项式的元素项 d 删除多项式的元素项/n");
printf("r 替换多项式的元素项/n");
coflag=getchar();
switch(coflag)
{
case 'a':
printf("请输入要添加的多项式元素位置posa/n");
scanf("%d",&posa);
siflag=InsertPoly(polya,posa);
if(siflag==success)
printf("添加多项式元素成功!/n");
else if(siflag==fail)
printf("添加多项式元素失败!/n");
break;
case 'd':
printf("请输入要删除的多项式元素位置posa/n");
scanf("%d",&posa);
siflag=DeletePoly(polya,posa);
if(siflag==success)
printf("删除多项式元素成功!/n");
else if(siflag==fail)
printf("删除多项式元素失败!/n");
break;
case 'r':
printf("请输入要替换的多项式元素位置posa/n");
scanf("%d",&posa);
siflag=ReplacePoly(polya,posa);
if(siflag==success)
printf("替换多项式元素成功!/n");
else if(siflag==fail)
printf("替换多项式元素失败!/n");
break;
}
break;
case 'b':
printf("请输入要修改多项式的操作:/n");
printf("a 添加多项式的元素项 d 删除多项式的元素项/n");
printf("r 替换多项式的元素项/n");
coflag=getchar();
switch(coflag)
{
case 'a':
printf("请输入要添加的多项式元素位置posb/n");
scanf("%d",&posb);
siflag=InsertPoly(polyb,posb);
if(siflag==success)
printf("添加多项式元素成功!/n");
else if(siflag==fail)
printf("添加多项式元素失败!/n");
break;
case 'd':
printf("请输入要删除的多项式元素位置posb/n");
scanf("%d",&posb);
siflag=DeletePoly(polyb,posb);
if(siflag==success)
printf("删除多项式元素成功!/n");
else if(siflag==fail)
printf("删除多项式元素失败!/n");
break;
case 'r':
printf("请输入要替换的多项式元素位置posb/n");
scanf("%d",&posb);
siflag=ReplacePoly(polyb,posb);
if(siflag==success)
printf("替换多项式元素成功!/n");
else if(siflag==fail)
printf("替换多项式元素失败!/n");
break;
}
default:
break;
}
}
break;
case 4:
if(sacflag!=success||sbcflag!=success)
printf("请先创建多项式/n");
else
{
SubPoly(polya,polyb);
printf("请输入未知数x的值:/n");
scanf("%f",&x);
printf("减法运算结果为:/n");
fsumresult=PrintResult(polya,x);
printf("%f/n",fsumresult);
}
break;
case 5:
if(sacflag!=success||sbcflag!=success)
printf("请先创建多项式/n");
else
{
MulPoly(polya,polyb);
printf("请输入未知数x的值:/n");
scanf("%f",&x);
printf("乘法运算结果为:/n");
fsumresult=PrintResult(polya,x);
printf("%f/n",fsumresult);
}
break;
case 6:
if(sacflag!=success||sbcflag!=success)
printf("请先创建多项式/n");
else
{
DivPoly(polya,polyb);
printf("请输入未知数x的值:/n");
scanf("%f",&x);
printf("除法运算结果为:/n");
fsumresult=PrintResult(polya,x);
printf("%f",fsumresult);
}
break;
case 0:
flag0=0;
break;
default :
break;

}
}
}

//请高手多多指点,在次谢过。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐