手頭有道要求以鏈表與數組兩種形式實現求多項式之和題目作爲某課大作業。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;
}