📄 一元稀疏多项式计算器.cpp
字号:
#include "stdio.h"
#include "conio.h"
#include "stdlib.h"
#include "string.h"
#include "iostream.h"
#include "math.h"
#include "stdlib.h"
#define TRUE 1
#define FALSE 0
typedef int status;
typedef struct NodeType
{
float coef; //系数
int expn; //指数
struct NodeType *next;
} NodeType, *LinkType;
typedef LinkType polynomail; //用带头结点的有序链表表示多项式
void InitPolyn( polynomail &P)
//构造一个多项式
{
P=(NodeType *)malloc(sizeof(NodeType));
P->coef=0;P->expn=0;P->next=NULL;
//初始化带头结点的单链表
}
void ClearPolyn( polynomail &P)
//将单链表清空,并释放原链表的结点空间
{ LinkType q;
q=P->next;
while(q!=NULL) //释放原链表的结点空间
{P->next=q->next;free(q);q=P->next;}
}
void DestroyPolyn( polynomail &P)
//销毁一元多项式P
{LinkType q=P;
while(q!=NULL)
{q=P->next;free(P);}//释放所有结点空间
}
void DelZeroNode(polynomail &Pn)
//释放无用结点,即系数为0项
{ LinkType p,q;
p=Pn->next; q=Pn;
while(p!=NULL)
{ if(p->coef==0)
{q->next=p->next;
free(p);
p=q->next;
}
else
{q=p;p=p->next;}
}
}
void MergePolynCoef(polynomail &Pn)
//在序链表中,合并同类项
{ LinkType p,p1,p2;
p=Pn->next;
while(p!=NULL)
{p1=p;p2=p->next;
while(p2!=NULL) //合并指数相同项
{ if(p->expn==p2->expn)
{p->coef+=p2->coef;
p1->next=p2->next;
free(p2);
p2=p1->next;
}
else {p1=p2;p2=p1->next;}
}
p=p->next;
}
DelZeroNode(Pn);//删除合并后系数为0的结点
}
void SortPolyn(polynomail &Pn)
//根据链表的expn指数域,对链表进行升序排序
{
MergePolynCoef(Pn);//先合并同类项
LinkType p,q,r;
q=Pn->next;Pn->next=NULL;
while(q!=NULL) //插入法排序
{ p=Pn;
while(p->next!=NULL&&p->next->expn<q->expn)
p=p->next;
r=q->next;
q->next=p->next;
p->next=q;
q=r;
}
}
void CreatPolyn( polynomail &P,int m)
//输入m项的系数和指数,建立表示一元多项式的有序链表P
{ float fcoef;
int fexpn;
NodeType *s,*q;
q=P;
for(int i=1;i<=m;i++)
{
cout<<"请输入第"<<i<<"项式系数 指数:";
cin>>fcoef>>fexpn;
s=(NodeType *)malloc(sizeof(NodeType));
s->coef=fcoef;s->expn=fexpn;s->next=NULL;
q->next=s;q=s;q->next=NULL;
}
MergePolynCoef(P); //合并指数相同项
DelZeroNode(P); //删除系数为0的结点
SortPolyn(P); //按指数域,对链表进行升序排序
}
void PrintPolyn(polynomail P)
//打印输出一元多项式P
{ LinkType q;
q=P->next;
if(P->next==NULL) cout<<"0";
else{
while(q!=NULL)
{
if(q->coef>1||q->coef<-1)
cout<<q->coef;
if(q->expn==0&&(q->coef==1||q->coef==-1))cout<<q->coef;
else if(q->coef==-1&&q->expn!=0) cout<<"-";
if(q->expn<0) cout<<"x^"<<"("<<q->expn<<")";
else if(q->expn==1) cout<<"x";
else if(q->expn>0) cout<<"x^"<<q->expn;
if(q->next!=NULL&&q->next->coef>0)cout<<"+";
q=q->next;
}
}//else
}
int PolynLength( polynomail P)
//返回一元多项式P中的项数
{ int i=0;
LinkType q;
q=P->next;
while(q!=NULL) {q=q->next;i++;}
return i;
}
void Difference(polynomail &pa)
// 稀疏多项式pa 以链表作存储结构,
// 将此链表修改成它的导函数,并释放无用结点
{
LinkType p,q;
p=pa->next;
q=pa;
while(p!=NULL)
{
if(p->expn==0) {q->next=p->next;free(p);p=q->next;}
//常数项,导数为零,释放结点
else
{
p->coef=p->coef*p->expn; //系数=原系数* 指数
(p->expn )--; //指数减1
q=q->next;
p=p->next;
}
}
}
void AddPolyn(polynomail Pa,polynomail Pb,polynomail &Pc)
//完成多项式相加运算,即:Pc=Pa+Pb
{ float x;
LinkType p,q,r;
NodeType *s;
p=Pa->next;
q=Pb->next;
r=Pc;
while(p!=NULL&&q!=NULL)
{ if(p->expn==q->expn)//指数相同
{ x=p->coef+q->coef ;
if(x!=0) //指数相同,若系数相加不等于0,插入表中
{s=(NodeType *)malloc(sizeof(NodeType));
s->coef=x;s->expn=q->expn;s->next=NULL;
r->next=s;r=r->next;
}
p=p->next;q=q->next;
}
else if(q->expn<p->expn) //指数小的插入表中
{ s=(NodeType *)malloc(sizeof(NodeType));
s->coef=q->coef;s->expn=q->expn;s->next=NULL;
r->next=s;r=r->next;
q=q->next;
}
else
{ s=(NodeType *)malloc(sizeof(NodeType));
s->coef=p->coef;s->expn=p->expn;s->next=NULL;
r->next=s;r=r->next;
p=p->next;
}
}
//加入余下的多项式
while(p!=NULL)
{ s=(NodeType *)malloc(sizeof(NodeType));
s->coef=p->coef;s->expn=p->expn;s->next=NULL;
r->next=s;r=r->next;
p=p->next;
}
while(q!=NULL)
{ s=(NodeType *)malloc(sizeof(NodeType));
s->coef=q->coef;s->expn=q->expn;s->next=NULL;
r->next=s;r=r->next;
q=q->next;
}
}
void SubtractPolyn( polynomail Pa,polynomail Pb,polynomail &Pc)
//完成多项式相减运算,即:Pc=Pa-Pb
{ float x;
LinkType p,q,r;
NodeType *s;
p=Pa->next;
q=Pb->next;
r=Pc;
while(p!=NULL&&q!=NULL)
{ if(p->expn==q->expn)//指数相同
{ x=p->coef-q->coef;
if(x!=0) //指数相同,若系数相减不等于0,插入表中
{s=(NodeType *)malloc(sizeof(NodeType));
s->coef=x;s->expn=q->expn;s->next=NULL;
r->next=s;r=r->next;
}
p=p->next;q=q->next;
}
else if(q->expn<p->expn) //指数小的插入表中
{ s=(NodeType *)malloc(sizeof(NodeType));
s->coef=-q->coef; //减数的系数变为相反数
s->expn=q->expn;s->next=NULL;
r->next=s;r=r->next;
q=q->next;
}
else
{ s=(NodeType *)malloc(sizeof(NodeType));
s->coef=p->coef;s->expn=p->expn;s->next=NULL;
r->next=s;r=r->next;
p=p->next;
}
}
//加入余下的多项式,减数的系数变为相反数
while(p!=NULL)
{ s=(NodeType *)malloc(sizeof(NodeType));
s->coef=p->coef;s->expn=p->expn;s->next=NULL;
r->next=s;r=r->next;
p=p->next;
}
while(q!=NULL)
{ s=(NodeType *)malloc(sizeof(NodeType));
s->coef=-q->coef;s->expn=q->expn;s->next=NULL;
r->next=s;r=r->next;
q=q->next;
}
}
void MultiplyPolyn( polynomail Pa,polynomail Pb,polynomail &Pc)
//完成多项式相乘运算,即:Pc=Pa×Pb
{ LinkType p,q,r;
NodeType *s;
p=Pa->next;
r=Pc;
while(p!=NULL)
{q=Pb->next;
while(q!=NULL)
{ s=(NodeType *)malloc(sizeof(NodeType));
s->coef=p->coef*q->coef;
s->expn=p->expn+q->expn;
s->next=NULL;
r->next=s;r=r->next;
q=q->next;
}
p=p->next;
}
MergePolynCoef(Pc);//合并指数相同项
DelZeroNode(Pc); //删除系数为0的结点
SortPolyn(Pc); //按指数域,对链表进行升序排序
}
void main()//主程序
{
LinkType pa,pb,pc;
InitPolyn(pa);
InitPolyn(pb);
InitPolyn(pc);
int num1,num2;
open: while(1)
{system("cls");
cout<<endl;
cout<<" 一元稀疏多项式计算器 "<<endl;
cout<<" **************************************************************************"<<endl;
cout<<" 班级:0312 姓名:张明琪 学号:031207 "<<endl;
cout<<" --------------------------------------------------------------------------"<<endl;
cout<<" 加法--1 减法--2 乘法--3 求导--4 退出--0 "<<endl;
cout<<" **************************************************************************"<<endl;
char choice;
cout<<endl<<" 请选择操作(0-4):";
cin>>choice;
cout<<endl;
switch(choice)
{
case '1': cout<<"多项式加法C=A+B"<<endl;
cout<<"输入多项式A的项数:";
cin>>num1;
CreatPolyn(pa,num1);
cout<<"多项式A为:";
PrintPolyn(pa);
cout<<endl<<endl;
cout<<"输入多项式B的项数:";
cin>>num2;
CreatPolyn(pb,num2);
cout<<"多项式B为:";
PrintPolyn(pb);
cout<<endl<<endl;
AddPolyn(pa,pb,pc);
cout<<"多项式C=A+B: (";
PrintPolyn(pa);
cout<<")+(";
PrintPolyn(pb);
cout<<")=";
PrintPolyn(pc);
ClearPolyn(pa);
ClearPolyn(pb);
ClearPolyn(pc);
cout<<"\n按任意键返回初始界面!"<<endl;
getche();system("cls");goto open;
case '2': cout<<"多项式减法C=A-B"<<endl;
cout<<"输入多项式A的项数:";
cin>>num1;
CreatPolyn(pa,num1);
cout<<"多项式A为:";
PrintPolyn(pa);
cout<<endl<<endl;
cout<<"输入多项式B的项数:";
cin>>num2;
CreatPolyn(pb,num2);
cout<<"多项式B为:";
PrintPolyn(pb);
cout<<endl<<endl;
SubtractPolyn(pa,pb,pc);
cout<<"多项式C=A-B: (";
PrintPolyn(pa);
cout<<")-(";
PrintPolyn(pb);
cout<<")=";
PrintPolyn(pc);
ClearPolyn(pa);
ClearPolyn(pb);
ClearPolyn(pc);
cout<<"\n按任意键返回初始界面!"<<endl;
getche();system("cls");goto open;
case '3': cout<<"多项式乘法C=A×B"<<endl;
cout<<"输入多项式A的项数:";
cin>>num1;
CreatPolyn(pa,num1);
cout<<"多项式A为:";
PrintPolyn(pa);
cout<<endl<<endl;
cout<<"输入多项式B的项数:";
cin>>num2;
CreatPolyn(pb,num2);
cout<<"多项式B为:";
PrintPolyn(pb);
cout<<endl<<endl;
MultiplyPolyn(pa,pb,pc);
cout<<"多项式C=A×B: (";
PrintPolyn(pa);
cout<<")×(";
PrintPolyn(pb);
cout<<")=";
PrintPolyn(pc);
ClearPolyn(pa);
ClearPolyn(pb);
ClearPolyn(pc);
cout<<"\n按任意键返回初始界面!"<<endl;
getche();system("cls");goto open;
case '4': cout<<"求多项式的导数"<<endl;
cout<<"输入多项式的项数:";
cin>>num1;
CreatPolyn(pa,num1);
cout<<"多项式为:";
PrintPolyn(pa);
cout<<endl<<endl;
cout<<"多项式的导数: (";
PrintPolyn(pa);
cout<<")’= ";
Difference(pa);
PrintPolyn(pa);
ClearPolyn(pa);
cout<<"\n按任意键返回初始界面!"<<endl;
getche();system("cls");goto open;
case '0': cout<<"谢谢使用!再见!"<<endl<<endl;
return ;
default: cout<<"错误命令!"<<endl;
cout<<"按任意键返回初始界面"<<endl;
getche();system("cls");goto open;
}//switch
}//whlie(1)
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -