线性表ADT应用:一元多项式的处理
符号处理是一类非数值性问题,一元多项式就是符号处理的一类实例。一个一元n次多项式的一般形式如下:
Pn(x) = p1Xe1 + p2Xe2 +…+ pmXem
其中 p1,p2,…, pm为各项的系数,非零;
e1,e2,…, em 为各项的指数,满足0<e1 <e2 <… <em,即按指数升序
现要求在计算机中存储这样的多项式,并能对它们进行处理。除了输入、输出外,还应包括加法、减法、乘法等等操作。
注:存储结构可以采用顺序存储结构(只存储系数方式、存储系数和指数方式)、链式存储结构(单链、循环单链、双链、循环双链),自己确定存储方案并在代码的前面用注释说明。
程序实现时采用菜单控制,通过菜单符号选择要执行的操作。
-
创建多项式C :分别创建两个多项式A(x)和B(x),其中 输入时按照 指数的升序顺序输入多项式每一项的系数和指数,系数为0表示多项式结束。
例如:输入 :
1 2 3 4 5 6 7 8 0
2 3 4 5 6 7 0
则创建多项式分别为:
A(x)=x2+3x4+5x6+7x8
B(x)=2x3+4x5+6x^7
-
多项式加法P:计算C(x) = A(x) + B(x),并输出C(x)
-
多项式减法S: 计算C(x) = A(x) - B(x),并输出C(x)
-
多项式乘法M: 计算C(x) = A(x) * B(x),并输出C(x)
-
求导数D: 计算C(x) = A’(x),并输出C(x)
-
求值V:计算x=x0时 多项式的值 A(x0),并输出(保留两位小数)。其中x0是输入的一个 float型数
-
多项式置空F:清空A(x)、B(x)、C(x)三个多项式,释放空间
-
退出X: 结束操作
测试用例
#include "stdlib.h"
#include "iostream"
#include <cmath>
#include <iomanip>
using namespace std ;
class List; //前视定义,否则友元无法定义
struct xiang
{
int zhi;
int xi;
};
class LinkNode
{
friend List; //链表结点类的定义
public:
LinkNode *link;
int data;
int zhishu;
LinkNode(const int & item,const int & item2, LinkNode *ptr = NULL)
{
data=item;
zhishu=item2;
link=ptr;
}
LinkNode (LinkNode *ptr = NULL)
{
link=ptr;
}
~LinkNode() {};
};
class List
{
//单链表类的定义
public:
LinkNode *first; //指向首结点的指针
List ()
{
first = new LinkNode (); // 带头结点
}
~List ()
{
MakeEmpty(); //析构函数
}
void MakeEmpty ( ); //链表置空
void input(int endtag);
void output();
//static void plusit(List A,List B,List* C); //+
static void jianfa(List A,List B,List* C);
};
void List:: MakeEmpty ( )
{
LinkNode *q;
while ( first->link != NULL )
{
q = first->link;
first->link = q->link;
delete q;
}
};
//输入
void List::input(int endtag)
{
LinkNode *newnode,*r;
int val1,val2;
first=new LinkNode();
if(first==NULL)
{
cerr<<"存储分配错误!"<<endl;
exit(1);
}
cin>>val1; //读入元素
r=first; //r总指向目前链表的最后一个节点
while(val1!=endtag)
{
cin>>val2;
newnode=new LinkNode(val1,val2);
r->link=newnode;
r=newnode;
cin>>val1;
}
r->link=NULL;
}
void List ::output()
{
LinkNode *q = first->link;
int flag=0;
while(q != NULL)
{
if(q== first->link) //第一个数字的系数不需要加符号
{
if(q->data==1) //-----如果第一个系数是1
{
if(q->zhishu==0) //指数为0时,只输出这个1
{
cout<<"1";
flag=1;
}
else
{
cout<<"x^"<<q->zhishu;
flag=1;
q = q->link;
continue;
}
}
if(q->data==0) //----如果系数是零,不用输出
{
}
else //----不是零也不是1的,正常输出
{
if(q->zhishu==0)
{
cout<<q->data;
flag=1;
}
else
{
cout<<q->data<<"x^"<<q->zhishu;
flag=1;
q = q->link;
continue;
}
}
}
else
{
if(q->data>0) //出了第一项的,其他的要加符号
{
if(q->data==1) //---第一项是1
{
cout<<"+x^"<<q->zhishu;
flag=1;
}
else
{
cout<<"+"<<q->data<<"x^"<<q->zhishu;
flag=1;
}
}
else if(q->data<0)
{
cout<<q->data<<"x^"<<q->zhishu;
flag=1;
}
else if(q->data==0)
{
}
}
q = q->link;
}
if(flag==0)
cout<<"0";
cout<<endl;
}
int main()
{
int endtag=0;
List A,B;
List C,D,E,F;
char v;
cin>>v;
if(v=='C')
{
A.input(endtag);
B.input(endtag);
//A.output();
// B.output();
}
while(1)
{
cin>>v;
if(v=='X')
{
break;
}
if(v=='P') //加法
{
LinkNode *newnode;
LinkNode *p2,*q2,*j;
p2=A.first->link;
q2=B.first->link;
j=C.first;
while(p2!=NULL || q2!=NULL)
{
if(p2!=NULL && q2!=NULL)
{
if(p2->zhishu==q2->zhishu)
{
newnode=new LinkNode();
newnode->zhishu=p2->zhishu;
newnode->data=(p2->data)+(q2->data);
j->link=newnode;
j=newnode;
p2=p2->link;
q2=q2->link;
continue;
}
if(p2->zhishu>q2->zhishu)
{
newnode=new LinkNode();
newnode->zhishu=q2->zhishu;
newnode->data=q2->data;
j->link=newnode;
j=newnode;
q2=q2->link;
continue;
}
if(p2->zhishu<q2->zhishu)
{
newnode=new LinkNode();
newnode->zhishu=p2->zhishu;
newnode->data=p2->data;
j->link=newnode;
j=newnode;
p2=p2->link;
continue;
}
}
else if(p2==NULL)
{
newnode=new LinkNode();
newnode->zhishu=q2->zhishu;
newnode->data=q2->data;
j->link=newnode;
j=newnode;
q2=q2->link;
continue;
}
else if(q2==NULL)
{
newnode=new LinkNode();
newnode->zhishu=p2->zhishu;
newnode->data=p2->data;
j->link=newnode;
j=newnode;
p2=p2->link;
continue;
}
}
cout<<"C(x)=";
C.output();
free(p2);
free(q2);
}
if(v=='S')
{
LinkNode *newnode;
LinkNode *p,*q,*j;
p=A.first->link;
q=B.first->link;
j=D.first;
while(p!=NULL || q!=NULL)
{
if(p!=NULL && q!=NULL)
{
if(p->zhishu==q->zhishu)
{
newnode=new LinkNode();
newnode->zhishu=p->zhishu;
newnode->data=(p->data)-(q->data);
j->link=newnode;
j=newnode;
p=p->link;
q=q->link;
continue;
}
if(p->zhishu>q->zhishu)
{
newnode=new LinkNode();
newnode->zhishu=q->zhishu;
newnode->data=-(q->data);
j->link=newnode;
j=newnode;
q=q->link;
continue;
}
if(p->zhishu<q->zhishu)
{
newnode=new LinkNode();
newnode->zhishu=p->zhishu;
newnode->data=p->data;
j->link=newnode;
j=newnode;
p=p->link;
continue;
}
}
else if(p==NULL)
{
newnode=new LinkNode();
newnode->zhishu=q->zhishu;
newnode->data=-(q->data);
j->link=newnode;
j=newnode;
q=q->link;
continue;
}
else if(q==NULL)
{
newnode=new LinkNode();
newnode->zhishu=p->zhishu;
newnode->data=p->data;
j->link=newnode;
j=newnode;
p=p->link;
continue;
}
}
cout<<"C(x)=";
D.output();
free(p);
free(q);
}
if(v=='M')
{
int is0=0;
xiang xiangshu[100];
int k=0,flag=-1;
LinkNode *p3,*q3;
p3=A.first->link;
q3=B.first->link;
while(p3!=NULL)
{
q3=B.first->link;
while(q3!=NULL)
{
flag=-1;
for(int i=0; i<k; i++)
{
if(xiangshu[i].zhi==(p3->zhishu)+(q3->zhishu))
{
xiangshu[i].xi=xiangshu[i].xi+((p3->data)*(q3->data));
flag=1;
break;
}
}
if(flag==-1)
{
xiangshu[k].xi=(p3->data)*(q3->data);
xiangshu[k].zhi=(p3->zhishu)+(q3->zhishu);
k++;
}
q3=q3->link;
}
p3=p3->link;
}
//排序
xiang t;
for(int i=0; i<k; i++)
{
for(int j=i+1; j<k; j++)
{
if(xiangshu[i].zhi>xiangshu[j].zhi)
{
t=xiangshu[i];
xiangshu[i]=xiangshu[j];
xiangshu[j]=t;
}
}
}
cout<<"C(x)=";
for(int i=0; i<k; i++)
{
if(i==0)
{
if(xiangshu[i].xi==1)
{
if(xiangshu[i].zhi==1)
{
cout<<"x";
is0=1;
}
else
{
cout<<"x^"<<xiangshu[i].zhi;
is0=1;
}
}
else
{
if(xiangshu[i].zhi==1)
{
cout<<xiangshu[i].xi<<"x";
is0=1;
}
else
{
cout<<xiangshu[i].xi<<"x^"<<xiangshu[i].zhi;
is0=1;
}
}
}
else
{
if(xiangshu[i].xi>0)
{
if(xiangshu[i].xi==1)
{
if(xiangshu[i].zhi==1)
{
cout<<"+x";
is0=1;
}
else
{
cout<<"+x^"<<xiangshu[i].zhi;
is0=1;
}
}
else
{
if(xiangshu[i].zhi==1)
{
cout<<"+"<<xiangshu[i].xi<<"x";
is0=1;
}
else
{
cout<<"+"<<xiangshu[i].xi<<"x^"<<xiangshu[i].zhi;
is0=1;
}
}
}
else if(xiangshu[i].xi<0)
{
if(xiangshu[i].zhi==1)
{
cout<<xiangshu[i].xi<<"x";
is0=1;
}
else
{
cout<<xiangshu[i].xi<<"x^"<<xiangshu[i].zhi;
is0=1;
}
}
}
}
if(is0==0)
cout<<"0"; cout<<endl;
}
if(v=='D')
{
int is00=0;
int jishu=0;
xiang qiudao[100];
LinkNode *p4;
p4=A.first->link;
while(p4!=NULL)
{
if(p4->zhishu==0)
{
p4=p4->link;
}
else
{
qiudao[jishu].xi=(p4->data)*(p4->zhishu);
qiudao[jishu].zhi=(p4->zhishu)-1;
jishu++;
p4=p4->link;
}
}
cout<<"C(x)=";
for(int i=0; i<jishu; i++)
{
if(i==0)
{
if(qiudao[i].xi==1)
{
if(qiudao[i].zhi==1)
{
cout<<"x";
is00=1;
}
else if(qiudao[i].zhi==0)
{
cout<<"1";
is00=1;
}
else
{
cout<<"x^"<<qiudao[i].zhi;
is00=1;
}
}
else if(qiudao[i].xi==0)
{
}
else
{
if(qiudao[i].zhi==1)
{
cout<<qiudao[i].xi<<"x";
is00=1;
}
else if(qiudao[i].zhi==0)
{
cout<<qiudao[i].xi;
is00=1;
}
else
{
cout<<qiudao[i].xi<<"x^"<<qiudao[i].zhi;
is00=1;
}
}
}
else
{
if(qiudao[i].xi>0)
{
if(qiudao[i].xi==1)
{
if(qiudao[i].zhi==1)
{
cout<<"+x";
is00=1;
}
else if(qiudao[i].zhi==0)
{
cout<<"1";
is00=1;
}
else
{
cout<<"+x^"<<qiudao[i].zhi;
is00=1;
}
}
else
{
if(qiudao[i].zhi==1)
{
cout<<"+"<<qiudao[i].xi<<"x";
is00=1;
}
else if(qiudao[i].zhi==0)
{
cout<<"+"<<qiudao[i].xi;
is00=1;
}
else
{
cout<<"+"<<qiudao[i].xi<<"x^"<<qiudao[i].zhi;
is00=1;
}
}
}
else if(qiudao[i].xi<0)
{
if(qiudao[i].zhi==1)
{
cout<<qiudao[i].xi<<"x";
is00=1;
}
else if(qiudao[i].zhi==0)
{
cout<<qiudao[i].xi;
is00=1;
}
else
{
cout<<qiudao[i].xi<<"x^"<<qiudao[i].zhi;
is00=1;
}
}
else if(qiudao[i].xi==0)
{
}
}
}
if(is00==0)
cout<<"0";
cout<<endl;
}
if(v=='V')
{
float com,sum=0;
cin>>com;
LinkNode *p5;
p5=A.first->link;
while(p5!=NULL)
{
sum=sum+(p5->data)*pow(com,p5->zhishu);
p5 = p5->link;
}
cout<<fixed<<setprecision(2)<<sum<<endl;
}
if(v=='C')
{
A.MakeEmpty();
B.MakeEmpty();
C.MakeEmpty();
D.MakeEmpty();
}
}
return 0;
}