帮别人写的,多C++不熟悉,估计写的比较垃圾,但是花了好几个小时,还是记录下。
#include <iostream>
#include <string>
using namespace std;
//节点
struct Node
{
int coefficient;//因数
int exponent;//指数
Node * next;//下一个节点指针
};
Node * head;//创建链表时的临时头节点指针
Node * nail;//创建链表时的临时尾节点指针
Node * head1;//多项式1链表头节点指针
Node * head2;//多项式2链表头节点指针
Node * p;//释放空间的临时指针
string s1,s2;//存放用户输入的临时字符串
char string1[100];//存放用户输入的多项式1
char string2[100];//存放用户输入的多项式2
int number1[100];//以整数数组形式存放的多项式1,形式为一个系数一个指数,一个系数一个指数
int number2[100];//以整数数组形式存放的多项式2,形式为一个系数一个指数,一个系数一个指数
int sz[2][100]={0};//结果存放数组,第一行指数,第二行系数
//创建节点,参数coefficient,exponent
Node * createNode(int c, int e)
{
Node * x=new Node();
x->coefficient=c;
x->exponent=e;
return x;
}
//取得数组存放系数指数一共用去的长度
int getLength(int * a)
{
for(int i=0;i<100;i+=2)
{
if(*(a+i)==0&&*(a+i+1)==0)
return i;
}
return 0;
}
//产生链表
Node * createLink(int * a)
{
int c,e;
int l=getLength(a);
//产生链表头
c=a[0];
e=a[1];
head=nail=createNode(c,e);
//产生其他节点
for(int i=2;i<l;i+=2)
{
c=a[i];
e=a[i+1];
nail->next=createNode(c,e);
nail=nail->next;
}
return head;
}
//查找字符串种某个字符的位置
char * positionOf(char * start, char * end, char c)
{
char *p=start;
while(p<=end)
{
if(*p==c)
return p;
p++;
}
return NULL;
}
//将输入多项式转化为int数组,形式为一个系数一个指数,一个系数一个指数
void convert(char * c, int * i)
{
//以加减号作为分隔符,分输入数据为节,start节开始,end为节结束
char * start;
char * end;
int n=0;//数组项目编号
start=end=c;
while(*end!='/0')
{
//start指针指向第一次出现符号的位置
while(*start!='+'&&*start!='-'&&*start!='/0')
{
if(*(start+1)!='/0')
start++;
}
if(*(end+1)!='/0')
end++;
while(*end!='+'&&*end!='-'&&*end!='/0')
end++;
//取系数,系数为0表示以x,+,-打头
//字符串转整数,从+,-或者数字打头开始转换,非法的则转成0
int coe=0;
if(*start=='x'||*start=='X')
coe=1;
else if(*start=='-')
atoi(start+1)==0?coe=-1:coe=-atoi(start+1);
else if(*start=='+')
atoi(start+1)==0?coe=1:coe=atoi(start+1);
if(*(start+1)=='0')
coe=0;
i[n]=coe;
if(positionOf(start,end,'X')==NULL&&positionOf(start,end,'x')==NULL)//无x或X,则指数为0
{
i[n+1]=0;
}
else//有x
{
char * p=positionOf(start,end,'^');
if(p==NULL)
i[n+1]=1;
else
i[n+1]=atoi(p+1);
}
start=end;
end++;
n+=2;//一个系数一个指数,每个节占两个位置
}
}
//读取用户输入
void readInput()
{
cout<<"请输入多项式1:"<<endl;
cin>>s1;
cout<<"请输入多项式2:"<<endl;
cin>>s2;
//非负数开头则加上正号,便于后面处理
if(s1.substr(0,1)!="-"&&s1.substr(0,1)!="+")
s1="+"+s1;
strcpy(string1,s1.c_str());
if(s2.substr(0,1)!="-"&&s2.substr(0,1)!="+")
s2="+"+s2;
strcpy(string2,s2.c_str());
//将输入转化为int数组、
convert(string1, number1);
convert(string2, number2);
}
//相加
void add()
{
Node * p1=head1;
Node * p2=head2;
int c,e;//c系数,e指数
//遍历第一个链表,将指数,系数存入数组
while(p1!=NULL)
{
c=p1->coefficient;
e=p1->exponent;
sz[0][e]=e;
sz[1][e]+=c;
p1=p1->next;
}
//遍历第二个链表,将指数,系数存入数组
while(p2!=NULL)
{
e=p2->exponent;
c=p2->coefficient;
sz[0][e]=e;
sz[1][e]+=c;
p2=p2->next;
}
}
//打印结果
void printResult()
{
cout<<endl<<"相加结果:"<<endl;
int flag=0;//判定是否有输出
//遍历结果数组
for(int j=99;j>=0;j--)
{
if(sz[1][j]!=0)
{
//系数
if(sz[1][j]>=1)
cout<<"+"<<sz[1][j];//大于+1则全部输出
if(sz[1][j]<-1)
cout<<sz[1][j];
if(sz[1][j]==-1)//-1则只保留负号
cout<<"-";
//指数
if(sz[0][j]>1)
cout<<"X^"<<sz[0][j];
else if(sz[0][j]==1)
cout<<"X";
flag=1;//已经有输出
}
}
//结果是0则前面不会输出,这里输出结果为0
if(!flag)
cout<<0;
cout<<endl<<endl<<endl;
}
//释放空间,还原变量
void release()
{
while(head1!=NULL)
{
p=head1;
head1=head1->next;
free(p);
}
while(head2!=NULL)
{
p=head2;
head2=head2->next;
free(p);
}
for(int i=0;i<100;i++)
{
number1[i]=0;
number2[i]=0;
}
for(int i=0;i<2;i++)
{
for(int j=0;j<100;j++)
sz[i][j]=0;
}
s1=s2="";
for(int i=0;i<100;i++)
string1[i]=string2[i]='/0';
}
//程序入口
void main()
{
cout<<"**********************************************************"<<endl;
cout<<"@@多项式加法程序@@"<<endl<<endl;
cout<<"说明:请确保输入的多项式为-3X^2+2X-3,x大小写不限,"<<endl;
cout<<" 每个多项式长度不超过100个字符,否则结果会出错。"<<endl;
cout<<"**********************************************************"<<endl<<endl;
while(1)
{
//读取用户输入
readInput();
//创建链表1
head1=createLink(number1);
//创建链表2
head2=createLink(number2);
//两式表相加
add();
//打印结果
printResult();
//释放空间
release();
}
}