当前位置:文档之家› 数据结构 语言 一元多项式的计算(加减法的运算)

数据结构 语言 一元多项式的计算(加减法的运算)

#include
#include
#include
#include
/*建立结构体*/
typedef struct pnode
{
float coef; /*系数*/
int zhishu; /*指数*/
struct pnode *next; /*下一个指针*/
}pnode;
/*用头插法生成一个多项式,系数和指数输入0时退出输入*/
pnode * creat()
{
int m;
float n;
pnode *head,*rear,*s; /*head为头指针,rear和s为临时指针*/
head=(pnode *)malloc(sizeof(pnode));
rear=head; /*指向头*/
scanf("%f",&n); /*系数*/
scanf("%d",&m); /*输入指数*/
while(n!=0) /*输入0退出*/
{

s=(pnode *)malloc(sizeof(pnode));
s->coef=n;
s->zhishu=m;
s->next=NULL;
rear->next=s; /*头插法*/
rear=s;
scanf("%f",&n); /* 输入系数*/
scanf("%d",&m); /*输入指数*/

}
/*************/

head=head->next; /*第一个头没有用到*/
return head;
} /*调整多项式*/
void tiaozhen(pnode *head)
{
pnode *p,*q,*t;
float temp;
p=head;
while(p!=NULL)
{
q=p;
t=q->next;
while(t!=NULL)
{
if(t->zhishu>q->zhishu)
q=t;
t=t->next;
}

temp=p->coef;p->coef=q->coef;q->coef=temp;
temp=p->zhishu;p->zhishu=q->zhishu;q->zhishu=temp;
p=p->next;
}
}
/*显示一个多项式*/
void shuchu(pnode *head)
{
pnode *p;
int one_time=1;
p=head;
while(p!=NULL) /*如果不为空*/
{
if(one_time==1)
{
if(p->zhishu==0) /*如果指数为0的话,直接输出系数*/
printf("%5.2f",p->coef); /*如果系数是正的话前面就要加+号*/
else if(p->coef==1||p->coef==-1)
printf("X^%d",p->zhishu); /*如果系数是1的话就直接输出+x*/
/*如果系数是-1的话就直接输出-x号*/

//***************

else if(p->coef>0) /*如果系数是大于0的话就输出+系数x^指数的形式*/
printf("%5.2fX^%d",p->coef,p->zhishu);
else if(p->coef<0) /*如果系数是小于0的话就输出系数x^指数的形式*/
printf("%5.2fX^%d",p->coef,p->zhishu);
one_time=0;
}
else{
if(p->zhishu==0) /*如果指数为0的话,直接输出系数*/
{
if(p->coef>0)
printf("+%5.2f",p->coef); /*如果系数是正的话前面就要加+号*/
}
else if(p->coef==1) /*如果系数是1的话就直接输出+x号*/
printf("+X^%d",p->zhishu);
else if(p->coef==-1) /*如果系数是-1的话就直接输出-x号*/
printf("X^%d",p->zhishu);
else if(p->coef>0) /*如果系数是大于0的话就输出+系数x^指数的形式*/
printf("+%5.2fX^%d",p->coef,p->zhishu);
else if(p->coef<0) /*如果系数是小于0的话就输出系数x^指数的形式*/
printf("%5.2fX^%d",p->coef,p->zhishu);
}
p=p->next; /*指向下一个指针*/
}
printf("\n");
}
/*两个多项式的加法运算*/
pnode * add(pnode *heada,pnode *headb)
{
pnode *headc,*p,*q,*s,*r; /*headc为头指针,r,s为临时指针,p指向

第1个多项式并向右移动,q指向第2个多项式并向右移动*/
float x; /*x为系数的求和*/
p=heada; /*指向第一个多项式的头*/
q=headb; /*指向第二个多项式的头*/
headc=(pnode *)malloc(sizeof(pnode)); /*开辟空间*/
r=headc;
while(p!=NULL&&q!=NULL) /*2个多项式的某一项都不为空时*/
{
if(p->zhishu==q->zhishu) /*指数相等的话*/
{
x=p->coef+q->coef; /*系数就应该相加*/
if(x!=0) /*相加的和不为0的话*/
//*******************
{
s=(pnode *)malloc(sizeof(pnode)); /*用头插法建立一个新的节点*/
s->coef=x;
s->zhishu=p->zhishu;
r->next=s;
r=s;
}
q=q->next;p=p->next; /*2个多项式都向右移*/
}
else if(p->zhishuzhishu) /*p的系数小于q的系数的话,就应该复制q节点到多项式中*/
{
s=(pnode *)malloc(sizeof(pnode));
s->coef=q->coef;
s->zhishu=q->zhishu;
r->next=s;
r=s;
q=q->next; /*q向右移动*/
}
else/*p的系数大于q的系数的话,就应该复制p节点到多项式中*/
{
s=(pnode *)malloc(sizeof(pnode));
s->coef=p->coef;
s->zhishu=p->zhishu;
r->next=s;
r=s;
p=p->next; /*p向右移动*/


}

}

/*当第2个多项式空,第1个数不为空时,将第一个数剩下的全用新节点产生*/
while(p!=NULL)
{
s=(pnode *)malloc(sizeof(pnode));
s->coef=p->coef;
s->zhishu=p->zhishu;
r->next=s;
r=s;
p=p->next;
}

/*当第1个多项式空,第1个数不为空时,将第2个数剩下的全用新节点产生*/
while(q!=NULL)
{
s=(pnode *)malloc(sizeof(pnode));
//**********
s->coef=q->coef;
s->zhishu=q->zhishu;
r->next=s;
r=s;
q=q->next;
}
r->next=NULL; /*最后指向空*/
headc=headc->next; /*第一个头没有用到*/
return headc; /*返回头接点*/
}

/*两个多项式的减法运算*/
pnode * sub(pnode *heada,pnode *headb)
{
pnode *headc,*p,*q,*s,*r;
float x; /*x为系数相减*/
p=heada; /*指向第一个多项式的头*/
q=headb; /*指向第二个多项式的头*/
headc=(pnode *)malloc(sizeof(pnode)); /*开辟空间*/
r=headc;
while(p!=NULL&&q!=NULL) /*两个多项式的某一项都不为空时*/
{
if(p->zhishu==q->zhishu) /*指数相等的话*/
{
x=p->coef-q->coef; /*系数相减*/
if(x!=0) /*相减的差不为0的话*/
{
s=(pnode *)malloc(sizeof(pnode)); /*用头插法建立一个新的节点*/
s->coef=x;
s->zhishu=p->zhishu;
r->next=s;
r=s;
}
q=q->next;p=p->next; /*2个多项式都向右移*/
}
else if(p->zhishuzhishu) /*p的系数小于q的系数的话*/
{
s=(pnode *)malloc(sizeof(pnode));
s->coef=-q->coef; /*建立的节点的系数为原来的相反数*/
s->zhishu=q->zhishu;
r->next=s;
//*******************

r=s;
q=q->next;
}
else
{
s=(pnode *)malloc(sizeof(pnode));
s->coef=p->coef;
s->zhishu=p->zhishu;
r->next=s;
r=s;
p=p->next; /*p向右移动*/
}
}
while(p!=NULL) /*当第2个多项式空,第1个数不为空时,将第一个数剩下的全用新节点产生*/
{
s=(pnode *)malloc(sizeof(pnode));
s->coef=p->coef;
s->zhishu=p->zhishu;
r->next=s;
r=s;
p=p->next;
}

while(q!=NULL) /*当第1个多项式空,第1个数不为空时,将第2个数剩下的全用新节点产生*/
{
s=(pnode *)malloc(sizeof(pnode));
s->coef=-q->coef; /*建立的节点的系数为原来的相反数*/
s->zhishu=q->zhishu;
r->next=s;
r=s;
q=q->next;
}
r->next=NULL; /*最后指向空*/
headc=headc->next; /*第一个头没有用到*/
return headc; /*返回头接点*/
}
void add_main()
{
pnode * a,*b,*c;
printf("\n输入第一个一元多项式:\n系数指数\n");
a=creat();
tiaozhen(a);

//*************************
printf("\n输入第二个一元多项式:\n系数指数\n");
b=creat();
tiaozhen(b);
c=add(a,b);
printf("第一个一元多项式如下:");
shuchu(a);
printf("第二个一元多项式如下:");
shuchu(b);
printf("两式相加如下:");shuchu(c);
}
void sub_main()
{
pnode * a,*b,*c;
printf("\n输入第一个一元多项式:\n系数 指数\n");
a=creat();
tiaozhen(a);
printf("\n输入第二个一元多项式:\n系数指数\n");
b=creat();
tiaozhen(b);
c=sub(a,b);
printf("第一个一元多项式如下:");
shuchu(a);
printf("第二个一元多项式如下:");
shuchu(b);
printf("两式相减如下:");
shuchu(c);
}
void open()
{
printf("\n ****************************************************\n");
printf(" 功能项: * 1 两个一元多项式相加;2 两个一元多项式相减;0 退出*\n");
printf(" ****************************************************\n\n请选择操作: ");
}
void main()
{
int choose;
open();
//******
while(choose!=0)
{
scanf("%d",&choose);
getchar();
switch(choose)
{
case 0:return;
case 1:
printf("\n 两个一元多项式相加\n");
add_main();choose=-1;open();break;
case 2:
printf("\n 两个一元多项式相减\n");
sub_main();choose=-1;open();break;
default:
printf("没有该选项!请重新选择操作!\n\n");
open();
}
}
}

相关主题
文本预览
相关文档 最新文档