手头有道要求以链表与数组两种形式实现求多项式之和题目作为某课大作业。PS.助教若见别算抄袭!!!本菜鸟在博客留个档!!!
原题
输入: 对每一项输入系数和指数。按指数从高到低的顺序输入。系数和指数的大小都在【-100,+100】之间。 输入-9999时一个多项式结束。
输出:先输出2个多项式,再输出求和后的多项式。每个式子占据一行。 样例输入: 1 3 2 2 -8 0 -9999 1 10 2 3 6 0
-9999 样例输出:
按要求可采用如下两种方式存储系数与指数:
代码如下:
#include<iostream>
using namespace std;
struct ListNode//建立链表结构体
{
int e;//指数
int c;//系数
ListNode *next;
};
int index()//输出文字说明并返回用户输入
{
int n;
cout<<"一元多项式加法运算"<<endl;
cout<<"1.顺序存储"<<endl;
cout<<"2.链式存储"<<endl;
cout<<"请选择存储方式:";
cin>>n;
return n;
}
void printit(int c,int e,int i)//输出函数
{
if(i>0&&c>=0)//利用i与c控制输出形式
cout<<'+';
if(e!=0&&c!=1)
cout<<c<<"X^"<<e;
else if(e==0)
cout<<c;
else if(c==1)
cout<<"X^"<<e;
}
ListNode* add(int c,int e,ListNode* a)//为链表增加新元素
{
ListNode* h=new ListNode;
h->c=c;
h->e=e;
a->next=h;
return h;
}
void save1(int ca[],int cb[],int ea[],int eb[])//顺序输入并存储各项
{
cout<<"将采用顺序储存!"<<endl;
int a,b;
int i=0;
cout<<"请输入式A的系数与指数(按指数从高到低):"<<endl;
while(1)
{
cin>>a;
if(a==-9999)
{
cout<<endl;
break;
}
ca[i]=a;//输入相关项
cin>>b;
ea[i]=b;//存入数组
if(i==0)
cout<<"A:";
printit(a,b,i);//输出当前输入的项
i++;
}
ea[i]=-9999;//对末尾进行标记
cout<<"请输入式B的系数与指数(按指数从高到低):"<<endl;
i=0;
while(1)
{
cin>>a;
if(a==-9999)
{
cout<<endl;
break;
}
cb[i]=a;
cin>>b;
eb[i]=b;
if(i==0)
cout<<"B:";
printit(a,b,i);
i++;
}
eb[i]=-9999;
}
void save2(ListNode *ahead,ListNode *bhead)
{
ListNode* al=new ListNode;
ListNode* bl=new ListNode;
cout<<"将采用链式储存!"<<endl;
int a,b;
int i=0;
cout<<"请输入式A的系数与指数(按指数从高到低):"<<endl;
while(1)
{
cin>>a;
if(a==-9999)
{
cout<<endl;
break;
}
cin>>b;
if(i==0)
al=add(a,b,ahead);//利用函数将新元素储存
else
al=add(a,b,al);
if(i==0)
cout<<"A:";
printit(a,b,i);
i++;
}
al=add(0,-9999,al);
cout<<"请输入式B的系数与指数(按指数从高到低):"<<endl;
i=0;
while(1)
{
cin>>a;
if(a==-9999)
{
cout<<endl;
break;
}
cin>>b;
if(i==0)
bl=add(a,b,bhead);
else
bl=add(a,b,bl);
if(i==0)
cout<<"B:";
printit(a,b,i);
i++;
}
bl=add(0,-9999,bl);
}
void deal1(int ca[],int cb[],int ea[],int eb[])
{
int i=0,j=0;
cout<<"A+B:";
while(ea[i]!=-9999||eb[i]!=-9999)//在均到末尾时结束循环
{
if(ea[i]>eb[j])//采用比较指数大小的策略决定哪一项先输出
{
if(j>0)
printit(ca[i],ea[i],i+1);
else
printit(ca[i],ea[i],i);
i++;
}
else if(ea[i]<eb[j])
{
if(i>0)
printit(cb[j],eb[j],j+1);
else
printit(cb[j],eb[j],j);
j++;
}
else if(ea[i]==eb[j])
{
if(j>0)
printit(ca[i]+cb[j],ea[i],i+1);
else
printit(ca[i]+cb[j],ea[i],i);
i++;
j++;
}
}
}
void deal2(ListNode* ahead,ListNode* bhead)
{
ListNode* a=ahead->next;
ListNode* b=bhead->next;
int i=0;
cout<<"A+B:";
while(a->e!=-9999||b->e!=-9999)
{
if(a->e>b->e)
{
printit(a->c,a->e,i);
a=a->next;
i++;
}
else if(a->e<b->e)
{
printit(b->c,b->e,i);
b=b->next;
i++;
}
else if(a->e==b->e)
{
printit(a->c+b->c,a->e,i);
a=a->next;
b=b->next;
i++;
}
}
}
int main()
{
int ca[10000];
int cb[10000];
int ea[10000];
int eb[10000];
int n;
ListNode* ahead=new ListNode;//创建头指针
ListNode* bhead=new ListNode;
ahead->next=NULL;
bhead->next=NULL;
n=index();
if(n==1)
{
save1(ca,cb,ea,eb);//调用函数保存多项式A,B
deal1(ca,cb,ea,eb);//将多项式相加并输出
}
else if(n==2)
{
save2(ahead,bhead);
deal2(ahead,bhead);
}
else
{
cout<<"ERROR!"<<endl;//用户输入其他数字则报错。
}
return 0;
}