用鏈表實現多項式相加的優點(相比於順序表實現):
- 無需分配額外的空間,空間複雜度低
- 插入和刪除操作方便
用鏈表實現多項式相加的具體代碼如下:
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
using namespace std;
typedef int ElemType;
typedef int Status;
#define OK 1
#define ERROR 0
typedef struct PNode{
float coef;//多項式係數
int index;//多項式指數
struct PNode *next;
}PNode,*Polynomial;
//初始化多項式
Status InitPolyn(Polynomial &p){
p=new PNode;
if(!p) return ERROR;
p->next=NULL;
return OK;
}
//創建多項式(尾插法)
void CreatePolyn(Polynomial &p,int n){
PNode *l=p;
for(int i=0;i<n;i++){
PNode *q=new PNode;
q->next=NULL;
cout<<"請輸入多項式係數:";
cin>>q->coef;
cout<<"請輸入多項式指數:";
cin>>q->index;
l->next=q;
l=q;
}
}
//多項式相加(以La作爲相加後的多項式鏈表的頭節點)
void AddPolyn(Polynomial &La,Polynomial &Lb){
PNode *pa=La->next;
PNode *pb=Lb->next;
PNode *pc=La;
PNode *temp_pa=NULL;
PNode *temp_pb=NULL;
while(pa&&pb){
//當指數相等時,比較係數
if(pa->index==pb->index){
//若係數相加爲0,則將pa,pb均後移一位,並銷燬它們之前指向的節點,pc保持不變
if(!(pa->coef+pb->coef)){
temp_pa=pa;
temp_pb=pb;
pa=pa->next;
pb=pb->next;
delete temp_pa;
delete temp_pb;
}
//若係數相加不爲0,則將指數相加的結果保存在pa,並先將pa賦值給pc->next,再將pa賦值給pc;之後,pa,pb均後移,並銷燬pb之前指向的節點
else{
pa->coef=pa->coef+pb->coef;
pc->next=pa;
pc=pa;
pa=pa->next;
temp_pb=pb;
pb=pb->next;
delete temp_pb;
}
}
//若pa係數小於pb係數,則先將pa賦值給pc->next,再將pa賦值給pc;之後pa後移一位,pb不變
else if(pa->index<pb->index){
pc->next=pa;
pc=pa;
pa=pa->next;
}
//若pb係數小於pa係數,則先將pb賦值給pc->next,再將pb賦值給pc;之後pb後移一位,pa不變
else{
pc->next=pb;
pc=pb;
pb=pb->next;
}
}
//循環結束後,若pa未到達表尾,則將pa所指節點插入到"和多項式"鏈表中;pb同理
pc->next=pa?pa:pb;
//銷燬Lb
delete Lb;
}
//遍歷多項式並打印出其中的係數和指數
Status ShowPolyn(Polynomial p){
PNode *q=p->next;
if(!q) return ERROR;;
while(q){
cout<<"多項式係數爲:"<<q->coef<<endl;
cout<<"多項式指數爲:"<<q->index<<endl;
q=q->next;
}
return OK;
}
int main(){
Polynomial La,Lb;
InitPolyn(La);
CreatePolyn(La,3);
InitPolyn(Lb);
CreatePolyn(Lb,4);
AddPolyn(La,Lb);
ShowPolyn(La);
}