实现多项式相乘的程序

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";

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值