#include <iostream>
using namespace std;
struct Node//定义双向链表,方便降幂输出
{
int C;
int index;
struct Node*prior;
struct Node*next;
};
void init(struct Node* &List)
{
List=(struct Node*)malloc(sizeof(struct Node));
List->next=NULL;
}
void Sort(struct Node* List,struct Node*p)//链表幂从小到大排序,进来一个排一个
{
struct Node*p1,*p2;
int flag=0;
if(List->next==NULL)
{
p->next=List->next;
List->next=p;
}
else
{
p1=List;
p2=List->next;
while(p2!=NULL)
{
if(p->index<p2->index)
{
p1->next=p;
p->next=p2;
flag=1;
break;
}
else if(p->index==p2->index)
{
p2->C+=p->C;
flag=1;
break;
}
else
{
p1=p2;
p2=p2->next;
}
}
if(flag==0)
{
p1->next=p;
p->next=NULL;
}
}
}
void Addition(struct Node*List1,struct Node*List2,struct Node*List3)//链表相加
{
struct Node*p1,*p2,*p3,*p;
p1=List1->next;
p2=List2->next;
p3=List3;//有意思
List3->next=NULL;//避免运行加减函数互相影响
while(p1!=NULL&&p2!=NULL)
{
p=(struct Node*)malloc(sizeof(struct Node));
p->next=NULL;
if(p1->index==p2->index)
{
if(p1->C+p2->C!=0)//链表相加为0,直接不录入
{
p->C=p1->C+p2->C;
p->index=p1->index;
p3->next=p;
p3=p;
}
p1=p1->next;
p2=p2->next;
}
else if(p1->index<p2->index)
{
p->C=p1->C;
p->index=p1->index;
p3->next=p;
p3=p;
p1=p1->next;
}
else
{
p->C=p2->C;
p->index=p2->index;
p3->next=p;
p3=p;
p2=p2->next;
}
}
if(p1==NULL)
{
while(p2!=NULL)
{
p=(struct Node*)malloc(sizeof(struct Node));
p->next=NULL;
p->C=p2->C;
p->index=p2->index;
p3->next=p;
p3=p;
p2=p2->next;
}
}
else
{
while(p1!=NULL)
{
p=(struct Node*)malloc(sizeof(struct Node));
p->next=NULL;
p->C=p1->C;
p->index=p1->index;
p3->next=p;
p3=p;
p1=p1->next;
}
}
}
void Subtraction (struct Node*List1,struct Node*List2,struct Node*List3)//链表相减,只需在加的基础上改+为-
{
struct Node*p1,*p2,*p3,*p;
p1=List1->next;
p2=List2->next;
p3=List3;//有意思
List3->next=NULL;//重要
while(p1!=NULL&&p2!=NULL)
{
p=(struct Node*)malloc(sizeof(struct Node));
p->next=NULL;
if(p1->index==p2->index)
{
if(p1->C-p2->C!=0)
{
p->C=p1->C-p2->C;
p->index=p1->index;
p3->next=p;
p3=p;
}
p1=p1->next;
p2=p2->next;
}
else if(p1->index<p2->index)
{
p->C=-p1->C;
p->index=p1->index;
p3->next=p;
p3=p;
p1=p1->next;
}
else
{
p->C=-p2->C;
p->index=p2->index;
p3->next=p;
p3=p;
p2=p2->next;
}
}
if(p1==NULL)
{
while(p2!=NULL)
{
p=(struct Node*)malloc(sizeof(struct Node));
p->next=NULL;
p->C=-p2->C;
p->index=p2->index;
p3->next=p;
p3=p;
p2=p2->next;
}
}
else
{
while(p1!=NULL)
{
p=(struct Node*)malloc(sizeof(struct Node));
p->next=NULL;
p->C=-p1->C;
p->index=p1->index;
p3->next=p;
p3=p;
p1=p1->next;
}
}
}
void print(struct Node* List3,struct Node*p,struct Node*p3,int flag){
cout<<"升幂:";
p=List3->next;
p3=List3;
while(p)
{
cout<<p->C<<"*x^"<<p->index<<" ";
p->prior=p3;
p3=p;
p=p->next;
flag=1;
}
if(flag==0)
cout<<"0";
cout<<endl;
cout<<"降幂:";
while(p3!=List3)
{
cout<<p3->C<<"*x^"<<p3->index<<" ";
p3=p3->prior;
}
if(flag==0)
cout<<"0";
cout<<endl;}
void main()
{
int n1,n2,e,f,sum1,flag;
char d;
struct Node *List1,*List2,*p,*List3,*List4,*List5,*p1,*p2,*p3;
init(List1);
init(List2);
init(List3);
init(List4);
init(List5);
cout<<"20-8软工2-9-115"<<endl;
cout<<"请输入第一个表达式的项个数"<<endl;
cin>>n1;
while(n1<=0)
{
cout<<"请重新输入,输入值需大于0"<<endl;
cin>>n1;
}
cout<<"输入成功"<<endl;
cout<<"请输入第一个表达式,每个项的系数和指数以','分隔,项与项之间以空格或回车分隔"<<endl;
for(int i=0; i<n1; i++)
{
cin>>e>>d>>f;
p=(struct Node*)malloc(sizeof(struct Node));
if(e!=0)
{
p->C=e;
p->index=f;
Sort(List1,p);
}
}
cout<<"请输入第二个表达式的项个数"<<endl;
cin>>n2;
while(n2<=0)
{
cout<<"请重新输入,输入值需大于0"<<endl;
cin>>n2;
}
cout<<"输入成功"<<endl;
cout<<"请输入第二个表达式,每个项的系数和指数以','分隔,项与项之间以空格或回车分隔"<<endl;
p1=List5;
for(i=0; i<n2; i++)
{
cin>>e>>d>>f;
p=(struct Node*)malloc(sizeof(struct Node));
if(e!=0)
{
p->C=e;
p->index=f;
p2=(struct Node*)malloc(sizeof(struct Node));
p2->next=NULL;
p1->next=p2;
p1=p2;
Sort(List2,p);
}
}
cout<<"输入1表示相加,输入2表示相减"<<endl;
cin>>sum1;
while(sum1!=1&&sum1!=2&&sum1!=3)
{
cout<<"输入错误,请重新输入"<<endl;
cin>>sum1;
}
cout<<"输入成功"<<endl;
while(1)
{
flag=0;
if(sum1==1)
{
Addition(List1,List2,List3);
print(List3,p,p3,flag);
}
if(sum1==2)
{
Subtraction (List1,List2,List3);
print(List3,p,p3,flag);
}
cout<<"输入1表示相加,输入2表示相减,输入0结束"<<endl;
cin>>sum1;
while(sum1!=1&&sum1!=2&&sum1!=3&&sum1!=0)
{
cout<<"输入错误,请重新输入";
cin>>sum1;
}
if(sum1==0)
{
cout<<"结束"<<endl;
break;
}
}
}