问题描述
能够按照指数降序排列建立并输出多项式;能够完成两个多项式的相加、相减,并将结果输出;
算法思想
构建一个式子的结构体,包括系数,指数和指针域。分别输入各项的系数和指数,按照指数降序的方式存入到结构体链表中;输出多项式时,多项式为0,系数为1或是负数和指数为0或1,还有是否是最后一个式子的情况,都需要分别讨论;多项式相加即是若指数相等,则系数直接相加,不等则考虑将指数较大的一个式子存入和链表中。多项式相减与相加方法类似,但是要考虑指数较大的式子是被减数还是减数来决定是加号还是减号。
算法设计
1、菜单显示void menu()——供用户选择的功能菜单。
2、输出多项式void PrintfPolyn(Polynimial P)——输出多项式时,多项式为0,系数为1或是负数和指数为0或1,还有是否是最后一个式子的情况,都需要分别讨论。
3、建立多项式void CreatePolyn(Polynimial &P)——分别输入各项的系数和指数,按照指数降序的方式存入到结构体链表中。
4、多项式相加void AddPolyn(Polynimial P1,Polynimial P2)——则系数直接相加,不等则考虑将指数较大的一个式子存入和链表中。
5、多项式相减void MinusPolyn(Polynimial P1,Polynimial P2)——多项式相减与相加方法类似,但是要考虑指数较大的式子是被减数还是减数来决定是加号还是减号。
6、主函数int main()——使用while循环和switch对功能进行调用,使用清屏函数,使界面更美观。
代码实现
#include<stdio.h>//一元稀疏多项式的计算
#include<iostream>
#include<stdlib.h>
using namespace std;
typedef struct PNode
{
float coef;//系数
int expn;//指数
struct PNode *next;//指针域
}PNode,*Polynimial;
void menu(){
cout<<"***************一元稀疏多项式的计算***************"<<endl;
cout<<" 1、建立并输出多项式"<<endl;
cout<<" 2、多项式相加"<<endl;
cout<<" 3、多项式相减"<<endl;
cout<<" 4、退出"<<endl;
cout<<"**************************************************"<<endl;
cout<<"请选择..."<<endl;
}
void PrintfPolyn(Polynimial P){//输出多项式
Polynimial t;
t=P->next;
if(t==NULL)
{
cout<<"0"<<endl;
return;
}
while(t->next){
if(t->expn!=0)
{
if(t->coef!=1&&t->coef!=-1)
cout<<t->coef<<"x";
else if(t->coef==1)
cout<<"x";
else
cout<<"-x";
if(t->next->coef>0)
cout<<"^"<<t->expn<<"+";
else
cout<<"^";
}
else
cout<<t->coef;
t=t->next;
}
if(t->expn!=0)
{
if(t->coef!=1&&t->coef!=-1)
cout<<t->coef<<"x";
else if(t->coef==1)
cout<<"x";
else
cout<<"-x";
if(t->expn!=1)
cout<<"^"<<t->expn;
}
else
cout<<t->coef;
cout<<endl;
}
void CreatePolyn(Polynimial &P){//建立多项式
P=new PNode;
P->next=NULL;
cout<<"该多项式的项数为:";
int n;
scanf("%d",&n);
cout<<"请依次输入各项的系数及指数(中间用空格隔开)"<<endl;
for(int i=1;i<=n;++i){
Polynimial s=new PNode;
cin>>s->coef>>s->expn;
Polynimial pre=P;
Polynimial q=P->next;
while(q&&q->expn>s->expn){
pre=q;
q=q->next;
}
s->next=q;
pre->next=s;
}
}
void AddPolyn(Polynimial P1,Polynimial P2){//多项式相加
Polynimial pa,pb,pc;
pa=P1->next;
pb=P2->next;
pc=P1;
while(pa&&pb){
if(pa->expn==pb->expn)
{
int sum=pa->coef+pb->coef;
if(sum!=0){
pa->coef=sum;
pc->next=pa;
pc=pa;
pa=pa->next;
Polynimial r=pb;
pb=pb->next;
delete r;
}
else
{
Polynimial r;
r=pa;pa=pa->next;delete r;
r=pb;pb=pb->next;delete r;
}
}
else if(pa->expn>pb->expn){
pc->next=pa;
pc=pa;
pa=pa->next;
}
else
{
pc->next=pb;
pc=pb;
pb=pb->next;
}
}
pc->next=pa?pa:pb;
delete P2;
cout<<"多项式之和为:";
PrintfPolyn(P1);
}
void MinusPolyn(Polynimial P1,Polynimial P2){//多项式相减
Polynimial pa,pb,pc;
pa=P1->next;
pb=P2->next;
pc=P1;
while(pa&&pb){
if(pa->expn==pb->expn)
{
int sum=pa->coef-pb->coef;
if(sum!=0){
pa->coef=sum;
pc->next=pa;
pc=pa;
pa=pa->next;
Polynimial r=pb;
pb=pb->next;
delete r;
}
else
{
Polynimial r;
r=pa;pa=pa->next;delete r;
r=pb;pb=pb->next;delete r;
}
}
else if(pa->expn>pb->expn){
pc->next=pa;
pc=pa;
pa=pa->next;
}
else
{
pc->next=pb;
pc=pb;
pc->coef=-pc->coef;
pb=pb->next;
}
}
pc->next=pa?pa:pb;
delete P2;
cout<<"多项式之差为:";
PrintfPolyn(P1);
}
int main(){
Polynimial P1,P2;
int m;
while(m!=4){
menu();
cin>>m;
switch(m){
case 1:
CreatePolyn(P1);
PrintfPolyn(P1);
break;
case 2:
cout<<"请按要求输入要计算的两个多项式:"<<endl;
CreatePolyn(P1);
CreatePolyn(P2);
AddPolyn(P1,P2);
break;
case 3:
cout<<"请按要求输入要计算的两个多项式:"<<endl;
CreatePolyn(P1);
CreatePolyn(P2);
MinusPolyn(P1,P2);
break;
case 4:
cout<<"感谢使用!"<<endl;
break;
default:
cout<<"没有该选项!"<<endl;
break;
}
system("pause");
system("cls");
}
return 0;
}