一、实验要求
用户根据自己的需求输入两个一元多项式,要求能够显示输入的一元多项式,再将这两个一元多项式相加,输出结果。
二、代码实现
#include
#include
#include
#include
#include
using namespace std;
typedef struct PLNODE{
double dbCoef;//系数域
int nExpn; //指数域
struct PLNODE *next;
}PLNODE;
typedef PLNODE *PLinkList;
void CreatePolyn(PLinkList &sPolyn)//创建空链表
{
sPolyn=(PLinkList)malloc(sizeof(PLNODE));//为头结点开辟空间
if(!sPolyn)
return;//判断sPolyn是否为空,是就退出
sPolyn->next=NULL;
}
void ListInsert(PLinkList sPolyn,PLNODE sNewNode)
{
PLinkList sTemp=sPolyn;
PLinkList psNewNode=(PLinkList)malloc(sizeof(PLNODE));
if(!psNewNode)
return;//判断是否为空
*psNewNode=sNewNode;//将指针所指对象的值修改为sNewNode
while(sTemp->next!=NULL)
sTemp=sTemp->next;
sTemp->next=psNewNode;//将结点插入链表尾部
psNewNode->next=NULL;//将尾结点的指向置为空
}
bool GetInt(int &value)
{
char str[256]={0};
fflush(stdin);//清空缓冲区
gets(str);//等待输入数据,并将数据存到str中
unsigned int index=1;
int nTemp=0;
if(str[0]=='-')//判断是否为负数
nTemp=1;
for(index=nTemp;index<strlen(str);index++)
{
if(str[index]<'0'||str[index]>'9')
return false;
}//判断输入的字符串是否合理
value=atoi(str);//将字符串转化为整数
return true;
}
void PrintPoly(PLNODE sPTemp)
{
if(sPTemp.nExpn==0)//指数为0,直接输出系数
cout<<sPTemp.dbCoef;
else if(sPTemp.dbCoef==1)//系数为1时
{
if(sPTemp.nExpn==1)
cout<<"x";
else
cout<<"x^"<<sPTemp.nExpn;
}
else if(sPTemp.dbCoef==-1)//系数为-1时
{
if(sPTemp.nExpn==1)
cout<<"-x";
else
cout<<"-x^"<<sPTemp.nExpn;
}
else
{
if(sPTemp.nExpn==1)
cout<<sPTemp.dbCoef<<"x";
else
cout<<sPTemp.dbCoef<<"x^"<<sPTemp.nExpn;
}
}
void PrintPolyn(PLinkList sPolyn)
{
int nIndex=0;
PLinkList sPTemp=sPolyn->next;//sPTemp指向第一个项数
if(!sPTemp)
printf("0");//多项式之和为0时,输出0
while(sPTemp!=NULL)
{
nIndex++;
if(nIndex==1)//直接输出第一项
PrintPoly(*sPTemp);
else if(sPTemp->dbCoef>0)//系数大于0,先输出+号
{
cout<<"+";
PrintPoly(*sPTemp);
}
else
PrintPoly(*sPTemp);
sPTemp=sPTemp->next;
}
}
//多项式按指数从小到大排序
PLinkList ListSort(PLinkList sPolyn)
{
sPolyn = sPolyn->next;//注意指向第一个结点
PLinkList sTemp1,sTemp2;//这两个变量表示冒泡排序的两个遍历节点变量
int nTemp=0;//中间变量
double dbTemp=0.0;//中间变量
for(sTemp1=sPolyn;sTemp1!=NULL;sTemp1=sTemp1->next)
{
for(sTemp2=sTemp1->next;sTemp2!=NULL;sTemp2=sTemp2->next)
{
if(sTemp1->nExpn>sTemp2->nExpn)
{
//如果sTemp1结点的指数值大,则交换两个结点的指数
nTemp=sTemp2->nExpn;
sTemp2->nExpn=sTemp1->nExpn;
sTemp1->nExpn=nTemp;
dbTemp=sTemp2->dbCoef;
sTemp2->dbCoef=sTemp1->dbCoef;
sTemp1->dbCoef=dbTemp;
}
}
}
return sPolyn;
}
void InputData(int nOrder,PLinkList &sPolyn)
{
CreatePolyn(sPolyn);//创建空链表
int n;
do{
GetInt(n);
if(n<0)
cout<<"输入项数为负,重新输入"<<endl;
}while(n<0);
PLNODE sNewNode;//定义新结点
double dbCoef;
int nExpn;
int Expn[n];
for(int i=0;i<n;i++)
{
do{
cout<<"请输入第"<<i+1<<"项的系数:";
cin>>dbCoef;
if(cin.fail()||dbCoef==0)
cout<<"输入系数不合法"<<endl;
}while(cin.fail()||dbCoef==0);
cout<<"请输入第"<<i+1<<"项的指数:";
GetInt(nExpn);
//cout<
int Expn[n];//
Expn[i]=nExpn;//使用数组记录之前输入的指数
for(int j=0;j<i-1;j++)
if(nExpn==Expn[j])
{
cout<<"指数输入重复"<<endl;
return;
}//当前指数是否已输入过,是则报错
sNewNode.dbCoef=dbCoef;//存入数据
sNewNode.nExpn=nExpn;
ListInsert(sPolyn,sNewNode);//将新结点插入多项式链表的尾部
}
}
PLinkList AddPolyn(PLinkList sPolyn1,PLinkList sPolyn2)
{
PLinkList sPolynAdd;//要生成的多项式之和链表
CreatePolyn(sPolynAdd);//创建空链表,sPolynAdd为头指针
PLinkList sPolyn1Temp=sPolyn1->next;//指向第一个多项式的第一项
PLinkList sPolyn2Temp=sPolyn2->next;//指向第二个多项式的第一项
PLNODE sNewNode;//要插入和多项式中的结点
while((sPolyn1Temp!=NULL)&&(sPolyn2Temp!=NULL))
{
int nEx=sPolyn1Temp->nExpn-sPolyn2Temp->nExpn;//计算指数差
if(nEx<0)//多项式sPolyn1当前节点的指数值小
{
sNewNode.nExpn=sPolyn1Temp->nExpn;
sNewNode.dbCoef=sPolyn1Temp->dbCoef;
ListInsert(sPolynAdd,sNewNode);//将提取出来的项存入和链表中
sPolyn1Temp=sPolyn1Temp->next;//移动sPolyn1Temp的结点
}
else if(nEx==0)//当前结点的指数相同
{
double dbCo=sPolyn1Temp->dbCoef+sPolyn2Temp->dbCoef;
if(dbCo!=0.0)//当前相同指数的项的系数之和不为0
{
sNewNode.nExpn=sPolyn1Temp->nExpn;
sNewNode.dbCoef=dbCo;
ListInsert(sPolynAdd,sNewNode);//将提取出来的项存入和链表中
}
sPolyn1Temp=sPolyn1Temp->next;
sPolyn2Temp=sPolyn2Temp->next;//移动结点
}
else
{
sNewNode.nExpn=sPolyn2Temp->nExpn;
sNewNode.dbCoef=sPolyn2Temp->dbCoef;
ListInsert(sPolynAdd,sNewNode);
sPolyn2Temp=sPolyn2Temp->next;
}
}
PLinkList sPolynTemp;
CreatePolyn(sPolynTemp);
if(sPolyn1Temp)
sPolynTemp=sPolyn1Temp;
else
sPolynTemp=sPolyn2Temp;
while(sPolynTemp)//链接剩余结点到和链表中
{
sNewNode.nExpn=sPolynTemp->nExpn;
sNewNode.dbCoef=sPolynTemp->dbCoef;
ListInsert(sPolynAdd,sNewNode);
sPolynTemp=sPolynTemp->next;
}
return sPolynAdd;
}
void FreePolyn(PLinkList sPolyn)
{
PLinkList sTemp=sPolyn;
while(sPolyn!=NULL)
{
sPolyn=sPolyn->next;
free(sTemp);
sTemp=sPolyn;
}
}
int main()
{
cout<<"/*注意:系数为浮点类型,指数为整数(可为负)类型。\n";
cout<<"请按指数从小到大的顺序输入多项式。*\n\n";
PLinkList A,B,C;
int m,n;
cout<<"请输入第1个多项式的项数:";
InputData(m,A);
ListSort(A);
cout<<"第1个多项式:";
PrintPolyn(A);
cout<<endl<<endl;
cout<<"请输入第2个多项式的项数:";
InputData(n,B);
ListSort(B);
cout<<"第2个多项式:";
PrintPolyn(B);
cout<<endl<<endl;
cout<<"多项式之和为:";
C=AddPolyn(A,B);
ListSort(C);
PrintPolyn(C); cout<<endl;
cout<<"第1个多项式:";
PrintPolyn(A); cout<<endl;
cout<<"第2个多项式:";
PrintPolyn(B);
//释放链表
FreePolyn(A);
FreePolyn(B);
FreePolyn(C);
return 0;
}