顺序表合并.cpp
/* OrderList Union.cpp */
void MergeList_Order(OrderList<T> &la,OrderList<T> &lb,OrderList<T> &l){
int pa=0,pb=0,pc=0;
l.capcacity=la.capacity+lb.capacity;
l.last=la.last+lb.last;
l.elem=new T[l.capacity];
//elem push
while((pa<=la.last)&&(pb<=la.last)){
if(la.elem[pa]>lb.elem[pb]){
l.elem[pc]=l.elem[pb];
pc++;
pb++;
}
else(lb.elem[pb]>la.elem[pa]){
l.elem[pc]=l.elem[pa];
pc++;
pa++;
}
}
//another elem push
if(pa>la.last){
for(int i=lb.last-pb;i<=lb.last;i++){
l.elem[i]=lb.elem[i];
}
}
if(pb>lb.last){
for(int i=la.last-pa;i<=la.last;i++){
l.elem[i]=lb.elem[i];
}
}
}
链式表合并.cpp
/* LinkList Union */
void MergeList_link(LinkList<T> &l1,LinkList<T> &l2,LinkList<T> &l){
if(l1.IsEmpty()){
l=l2;
return;
}
if(l2.IsEmpty()){
l=l1;
return;
}
if(l1.IsEmpty()&&l2.IsEmpty())
return;
LinkNode<T> p1=l1.first->link;
LinkNode<T> p2=l2.first->link;
LinkNode<T> p=l.first;
while(p1!=NULL && p2!=NULL){
if(p1.elem>p2.elem){
p->link=new LinkNode<T>(p2.elem,NULL);
p=p->link;
p2=p2->link;
}
else(p1.elem<p2.elem){
p->link=new LinkNode<T>(p1.elem,NULL);
p=p->link;
p1=p1->link;
}
}
if(p1==NULL){
while(p2!=NULL){
p->link=new LinkNode<T>(p2.elem,NULL);
p=p->link;
p2=p2->link;
}
}else{
while(p1!=NULL){
p->link=new LinkNode<T>(p1.elem,NULL);
p=p->link;
p1=p1->link;
}
}
}
多项式.h和多项式.cpp
/* polynomial.h */
#ifndef POLYNOMIAL_H
#define POLYNOMIAL_H
#include<iostream.h>
struct Term{
float coef;
int exp;
Term *link;
Term(float c,int e,Term *l=NULL){
coef=c;exp=e;link=l;
}
Term* InsertAfter(float c,int e);
friend ostream& operator<<(ostream& ,const Term&);
};
class Polynomial{
public:
Polynomial(){first=new Term(0,-1);}
Polynomial(Polynomial &p);
int maxOrder();
Term* getHead()const{return first;}
Term* first;
friend ostream& operator<<(ostream& ,const Polynomial&);
friend istream& operator>>(istream& ,Polynomial&);
friend Polynomial operator+(Polynomial&,Polynomial&);
friend Polynomial operator*(Polynomial&,Polynomial&);
}
#endif
/* polynomial.cpp */
#include<iostream.h>
#include"polynomial.h"
using namespace std;
Term* Term::InsertAfter(float c,int e){
link=new Term(c,e,NULL);
return link;
}
ostream& operator<<(ostream& out,const Term& t){
if(t.coef ==0.0) return out;
out << t.coef;
switch(t.exp){
case 0:break;
case 1:out<<"X";break;
default:out<<"X-"<<t.exp;break;
}
return out;
}
Polynomial::Polynomial(Polynomial &p){
first=new Term(0,-1);
Term* dest=first;
Term* src=p.first;
while(src!=NULL){
dest->InsertAfter(src->coef,src->exp,NULL);
src=src->link;
dest=dest->link;
}
}
/* Polynomial(){first=new Term(0,-1);}
Polynomial(Polynomial &p);
int maxOrder();
Term* getHead()const{return first;}
Term* first;
friend ostream& operator<<(ostream& ,const Polynomial&);
friend istream& operator>>(istream& ,Polynomial&);
friend Polynomial operator+(Polynomial&,Polynomial&);
friend Polynomial operator*(Polynomial&,Polynomial&);
*/
/* struct Term{
float coef;
int exp;
Term *link;
Term(float c,int e,Term *l=NULL){
coef=c;exp=e;link=l;
}
Term* InsertAfter(float c,int e);
friend ostream& operator<<(ostream& ,const Term&);
}; */
int Polynomial::maxOrder(){
//the final exp is highest exp
Term* p=first;
while(p->link!=NULL){
p=p->link;
}
return p->coef;
}
ostream& Polynomial::operator<<(ostream &out ,const Polynomial &p){
Term* p=first->link;
bool h=true;
while(p!=NULL){
if(h==false&&p->coef>0.0)
cout<<"+";
h=false;
out<<*p;
p=p->link;
}
out<<endl;
return out;
}
istream& Polynomial::operator>>(istream &in ,Polynomial &p){
Term* p=first->link;
int c,e;
while(true){
in>>c;in>>e;
if(e<0)
break;
p=p->InsertAfter(c,e,NULL);
}
return in;
}
Polynomial Polynomial::operator+(Polynomial &x1,Polynomial &x2){
Term *p1=x1.first->link;
Term *p2=x2.first->link;
Polynomial x;
Term* p=x.first;
float temp;
while(p1!=NULL && p2!=NULL){
if(p1->exp==p2->exp){
temp=p1->coef+p2->coef;
if(fabs(temp)>0.001)
p=p->InsertAfter(temp,p1->exp);
p1=p1->link;
p2=p2->link;
}else if(p1->exp<p2->exp){
p=p->InsertAfter(p1->coef,p1->exp);
p1=p1->link;
}else{
p=p->InsertAfter(p2->coef,p2->exp);
p2=p2->link;
}
}
}