ADT多项式

#include<iostream.h>   
#include<malloc.h>   
typedef struct node{   
    float coef;  //系数   
    int expn;    //指数   
    struct node *next;   
} polynomial;     
   
   
   //.....基本操作的函数原型说明......   
void Initlist(polynomial * &sq)   //初始化函数   
{   
    sq=(polynomial *)malloc(sizeof(polynomial));   
    sq->next=NULL;   
}   
   
int GetLen(polynomial *sq)  //求表长函数   
{   
    int i=0;   
    polynomial *p=sq->next;   
    while(p!=NULL){   
        i++;p=p->next;   
    }return i;   
}   
   
polynomial *GetElem(polynomial *sq,int i)   //按序号查找函数   
{   
    int j=1;   
    polynomial *p=sq->next;   
    if(i<1 || i>GetLen(sq))   
        return NULL;   
    while(j<i){   
        p=p->next; j++;   
    }   
        return p;   
}   
   
polynomial *Locate(polynomial *sq,float c,int e)  //定位函数   
{   
    polynomial *p=sq->next;   
    while(p!=NULL && (p->coef!=c || p->expn!=e))   
        p=p->next;   
    return p;   
}   
   
int InsElem(polynomial *sq,float c,int e,int i)  //插入函数   
{   
    int j=1;   
    polynomial *p=sq,*s;   
    s=(polynomial *)malloc(sizeof(polynomial));   
    s->coef=c;  s->expn=e;  s->next=NULL;   
    if(i<1 || i>GetLen(sq)+1)   
        return 0;   
    while(j<1){   
        p=p->next; j++;   
    }   
    s->next=p->next;   
    p->next=s;   
    return 1;   
}   
   
int DestroyPolyn(polynomial *sq,int i)   //删除函数   
{   
    int j=1;   
    polynomial *p=sq,*q;   
    if(i<1 || i>GetLen(sq))   
        return 0;   
    while (j<1) {   
        p=p->next;j++;   
    }   
    q=p->next;   
    p->next=q->next;   
    free(q);   
    return 1;   
}   
   
void PrintPolyn(polynomial *sq)  //输出链表函数   
{   
    polynomial *p=sq->next;   
    while (p!=NULL){   
        cout<<"("<<p->coef<<","<<p->expn<<")";   
        p=p->next;   
    }   
    cout<<endl;   
}   
   
void CreatPolyn(polynomial *&sq,float C[],int E[],int n)  //创建一个多项式单链表   
{   
    int i;   
    Initlist(sq);   
    for(i=0;i<n;i++)   
        InsElem(sq,C[i],E[i],i+1);   
}   
   
void order(polynomial *sq) //将一个任意次序的多项式单链表,按expn数据域值从小到大顺序排列   
{   
    polynomial *p=sq->next,*q,*pre;   
    sq->next=NULL;   
    while(p!=NULL){   
        if (sq->next==NULL){              //处理第一个结点   
            sq->next=p; p=p->next; sq->next->next=NULL;   
        }   
        else {                            //处理其余结点   
            pre=sq; q=pre->next;   
            while (q!=NULL && p->expn>q->expn){ //找到*pre结点   
                pre=q; q=q->next;   
            }   
            q=p->next;                      //在*pre结点之后插入*p   
            p->next=pre->next;   
            pre->next=p;   
            p=q;   
        }   
    }   
}   
   
polynomial *AddPolyn(polynomial *pa,polynomial *pb) //多项式加法   
{   
    polynomial *pc,*p1=pa->next,*p2=pb->next,*p,*rear,*s;   
    pc=(polynomial *)malloc(sizeof(polynomial));   
    pc->next=NULL; rear=pc;   
    while(p1!=NULL && p2!=NULL){   
        if (p1->expn<p2->expn){   
            s=(polynomial *)malloc(sizeof(polynomial));   
            s->coef=p1->coef;s->expn=p1->expn;s->next=NULL;   
            rear->next=s; rear=s;   
            p1=p1->next;   
        }   
        else if (p1->expn>p2->expn){   
            s=(polynomial *)malloc(sizeof(polynomial));   
            s->coef=p2->coef;s->expn=p2->expn;s->next=NULL;   
            rear->next=s;rear=s;   
            p2=p2->next;   
        }   
        else{   
            if (p1->coef + p2->coef!=0){   
                s=(polynomial *)malloc(sizeof(polynomial));   
                s->coef=p1->coef+p2->coef;s->expn=p1->expn;   
                s->next=NULL;   
                rear->next=s; rear=s;rear->next=NULL;   
            }   
            p1=p1->next;p2=p2->next;   
        }   
    }   
    if(p1!=NULL)p=p1;   
    else p=p2;   
    while (p!=NULL) {   
        s=(polynomial *)malloc(sizeof(polynomial));   
        s->coef=p->coef;s->expn=p->expn;s->next=NULL;   
        rear->next=s;rear=s;rear->next=NULL;   
        p=p->next;   
    }   
    return pc;   
}   
   
polynomial *SubtractPolyn(polynomial *pa,polynomial *pb)   //多项式减法   
{   
       
    polynomial *pc,*p1=pa->next,*p2=pb->next,*p,*rear,*s;   
    pc=(polynomial *)malloc(sizeof(polynomial));   
    pc->next=NULL; rear=pc;   
    while(p1!=NULL && p2!=NULL){   
        if (p1->expn<p2->expn){   
            s=(polynomial *)malloc(sizeof(polynomial));   
            s->coef=p1->coef;s->expn=p1->expn;s->next=NULL;   
            rear->next=s; rear=s;   
            p1=p1->next;   
        }   
        else if (p1->expn>p2->expn){   
            s=(polynomial *)malloc(sizeof(polynomial));   
            s->coef=(-1) * p2->coef;s->expn=p2->expn;s->next=NULL;   
            rear->next=s;rear=s;   
            p2=p2->next;   
        }   
        else{   
            if (p1->coef + p2->coef!=0){   
                s=(polynomial *)malloc(sizeof(polynomial));   
                s->coef=p1->coef-p2->coef;s->expn=p1->expn;   
                s->next=NULL;   
                rear->next=s; rear=s;rear->next=NULL;   
            }   
            p1=p1->next;p2=p2->next;   
        }   
    }   
    if(p1!=NULL)   
    {   
        p=p1;   
    while (p!=NULL) {   
        s=(polynomial *)malloc(sizeof(polynomial));   
        s->coef=p->coef;s->expn=p->expn;s->next=NULL;   
        rear->next=s;rear=s;rear->next=NULL;   
        p=p->next;   
    }   
    }   
    else    
    {   
        p=p2;   
        while (p!=NULL) {   
        s=(polynomial *)malloc(sizeof(polynomial));   
        s->coef=(-1) * p->coef;s->expn=p->expn;s->next=NULL;   
        rear->next=s;rear=s;rear->next=NULL;   
        p=p->next;   
    }   
    }   
   
    return pc;   
}   
   
polynomial *MultiplyPolyn(polynomial *pa,polynomial *pb)  //多项式乘法   
   
{   
   
    polynomial *pc,*p1=pa->next,*p2,*s,*rear,*pd;   
       
        pc=(polynomial *)malloc(sizeof(polynomial));   
        pc->next=NULL;   
       
        for(int i=1;i<=GetLen(pa);i++)   
       
       {      
       
           
          rear=(polynomial *)malloc(sizeof(polynomial));   
        pd=(polynomial *)malloc(sizeof(polynomial));   
            pd->next=NULL;rear=pd;   
           
           p2=pb->next;   
                     
         for(int j=1;j<=GetLen(pb);j++)   
           
        {      
               
               
             
       s=(polynomial *)malloc(sizeof(polynomial));   
                s->coef=p1->coef * p2->coef;   
                         s->expn=p1->expn + p2->expn;   
                       s->next=NULL;   
               
      rear->next=s;rear=s;   
               
         p2=p2->next;   
           
       }   
           
      p1=p1->next;   
           
       pc=AddPolyn(pc,pd);   
           
   
       
 }   
       
       
       
 return pc;   
}    
   
   
void main()   
{   
    polynomial *ha,*hb,*hc;   
    float Ca[]={2,-4,6,-8}, Cb[]={1,3,5,-7,8};   
    int Ea[]={0,1,2,3},Eb[]={1,2,4,5,6};   
    CreatPolyn(ha,Ca,Ea,4);   
    CreatPolyn(hb,Cb,Eb,5);   
    order(ha);   
    order(hb);   
    cout<<"原多项式A:";PrintPolyn(ha);   
    cout<<"原多项式B:";PrintPolyn(hb);   
    cout<<"两个多项式相加:"<<endl;   
    hc=AddPolyn(ha,hb);   
    cout<<"hc=";PrintPolyn(hc);   
    cout<<"两个多项式相减:"<<endl;   
    hc=SubtractPolyn(ha,hb);   
    cout<<"hc=";PrintPolyn(hc);   
    cout<<"两个多项式相乘:"<<endl;   
    hc=MultiplyPolyn(ha,hb);   
    cout<<"hc=";PrintPolyn(hc);   
}  

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值