exp是指数,info是系数,输入0 0一个多项式结束。
#include
#include
#include
template
class Listob
{
public:
Listob()
{
info=0;
next=NULL;
prior=NULL;
}
Listob(TData c,TData d)
{
info=c;
exp=d;
next=NULL;
prior=NULL;
}
friend void operator>>(istream &stream,Listob
&o);
TData info,exp;
Listob
*next;
Listob
*prior;
};
template
void operator>>(istream &stream,Listob
&o)
{
cout<<"Enter information:";
stream >>o.exp>>o.info;
}
template
class List :public Listob
{
public:
List()
{start=end=NULL;}
void store(Listob
);
void remove(Listob
*ob);
void frwdlist();
Listob
*find(TData c);
Listob
*getstart()
{ return start;}
Listob
*getend()
{ return end;}
void setstart(Listob
*p)
{ start=p;}
void setend(Listob
*p)
{end=p;}
static void add(List
&,List
);
static void sort(List
&);
static void copy(List
&,List
);
private:
Listob
*start,*end;
};
template
void List
::store(Listob
f)
{
Listob
*p;
p=new Listob
;
if(!p)
{
cout<<"Allocation error./n";
exit(1);
}
p->info=f.info;
p->exp=f.exp;
if(start==NULL)
end=start=p;
else
{
p->prior=end;
end->next=p;
end=p;
}
}
template
void List
::remove(Listob
*ob)
{
if(ob->prior)
{
ob->prior->next=ob->next;
if(ob->next)
ob->next->prior=ob->prior;
else
end=ob->prior;
}
else
{
if(ob->next)
{
ob->next->prior=NULL;
start=ob->next;
}
else
start=end=NULL;
}
}
template
void List
::frwdlist()
{
if(start==NULL)
{ cout<<"empty list/n";}
Listob
*temp;
temp=start;
while(temp)
{
cout<
exp<<","<
info<<" ";
temp=temp->next;
}
cout<}
template
void List
::add(List
&list1,List
list2)
{
Listob
*p ,*q,*temp,*u;
p=list1.getstart();q=list2.getstart();
if(!p) {List
::copy(list1,list2); return;}
int flag;
while(p&&q)
{
if(p->exp
exp)
flag=1;
if(p->exp==q->exp)
flag=2;
if(p->exp>q->exp)
flag=3;
switch(flag)
{
case 1:
{
temp=p;
p=p->next;
} break ;
case 2:
{
p->info+=q->info;
if(!p->info)
{
list1.remove(p);
}
else
temp=p;
p=p->next;
q=q->next;
} break;
case 3:
{
if(p->prior)
{
u=q->next;
p->prior->next=q;
p->prior->next->prior=p->prior;
p->prior->next->next=p;
p->prior=q;
}
else
{
u=q->next;
list1.setstart(q);
list1.getstart()->next=p;
list1.getstart()->prior=NULL;
p->prior=list1.getstart();
}
q=u;
} break;
}
}
if(q)
{temp->next=q;q->prior=temp;}
}
template
void List
::copy( List
&list1,List
list2)
{
Listob
*p;
list1.setstart(NULL);
p=list2.getstart();
while(p)
{
list1.store(*p);
p=p->next;
}
}
template
void List
:: sort(List
&list)
{
TData temp;
Listob
*p,*q;
p=list.getstart();
while(p)
{
q=p;
while(q->next)
{
if(q->next->exp
exp)
{
temp=q->next->exp;
q->next->exp=p->exp;
p->exp=temp;
temp=q->next->info;
q->next->info=p->info;
p->info=temp;
}
q=q->next;
}
p=p->next;
}
}
void main()
{
List
list1,list2,list2save,listanswer;
Listob
f ,*p,*q;
cin>>f;
while(f.info!=0)
{
list1.store(f);
cin>>f;
}
List
::sort(list1);
list1.frwdlist();
cin>>f;
while(f.info!=0)
{
list2.store(f);
cin>>f;
}
List
::sort(list2);
List
::copy(list2save,list2);
list2.frwdlist();
p=list1.getstart();
q=list2.getstart();
if(p&&q)
{
while(p)
{
while(q)
{
q->exp+=p->exp;
q->info*=p->info;
q=q->next;
}
List
::add(listanswer,list2);
List
::copy(list2,list2save);
q=list2.getstart();
p=p->next;
}
listanswer.frwdlist();
}
else
cout<<"empty list/n";
}