【数据结构】线性表的应用之一元多项式

参考资料:《数据结构(C语言版)严蔚敏著》
版权说明:未经作者允许,禁止转载。如引用本文内容,需标明作者及出处。如本文侵犯了您的权益,请联系我删除并致歉。
文章说明:如文章中出现错误,请联系我更改。如您对文章的内容有任何疑问,也欢迎来与我讨论。
本文正在施工中...请稍等...


一元多项式

ADT Polynomial{
    数据对象:
    数据关系:
    基本操作:
        CreatPolyn(&P,m)
            操作结果:输入m项的系数和指数,建立一元多项式P。
        DestroyPolyn(&p)
            初始条件:一元多项式P已存在。
            操作结果:销毁一元多项式P。
        PrintPolyn(P)
            初始条件:一元多项式P已存在。
            操作结果:打印输出一元多项式P。
        PolyLength(P)
            初始条件:一元多项式P已存在。
            操作结果:返回一元多项式P中的项数。
        AddPolyn(&Pa,&Pb)
            初始条件:一元多项式Pa和Pb已存在,
            操作结果:完成多项式相加运算,即:Pa=Pa+Pb,并销毁一元多项式Pb。
        SubstractPolyn(&Pa,&Pb)
            操作结果:完成多项式相减运算,即:Pa=Pa-Pb,并销毁一元多项式Pb。
        MultiplyPolyn(&Pa,&Pb)
            初始条件:一元多项式Pa和Pb已存在。
            操作结果:完成多项式相乘运算,即:Pa=Pa*Pb,并销毁一元多项式Pb。 
} ADT Polynomial 


typedef struct{     //项的表示,多项式的项作为LinkList的数据元素 
    float coef;     //系数
    int expn;       //指数 
}term,ElemType;     //两个类型名:term用于本ADT,ElemType为LinkList的数据对象名 

typedef LinkList polynomial;        //用带表头结点的有序链表表示多项式

void CreatPolyn(polynomial &P,int m);
    //输入m项的系数和指数,建立一元多项式的有序链表P
void DestroyPolyn(polynomial &P);
    //销毁一元多项式P
void PrintPolyn(polynomail P);
    //打印输出一元多项式P
int PolynLength(polynomail P);
    //返回一元多项式P中的项数
void AddPolyn(polynomail &Pa,polynomial &Pb);
    //完成多项式相加运算,即:Pa=Pa+Pb,并销毁一元多项式Pb
void SubtractPolyn(polynomail &Pa,polynomial &Pb);
    //完成多项式相减运算,即:Pa=Pa-Pb,并销毁一元多项式Pb
void MultiplyPolyn(polynomial &Pa,polynomail &Pb);
    //完成多项式相乘运算,即:Pa=Pa*Pb,并销毁一元多项式Pb
int cmp(term a,term b);
    //依a的指数值<(或=)(或>)b的指数值,分别返回-1、0和+1
void CreatPolyn(polynomail &P,int m){
    //输入m项的系数和指数,建立表示一元多项式的有序链表P
    InitList(P);
    h=GetHead(P);
    e.coef=0.0;
    e.expn=-1;
    SetCurElem(h,e);    //设置头结点的数据元素
    for(i=1;i<=m;i++){  //依次输入m个非零项 
        scanf(e.coef,e.expn);
        if(!LocateElem(P,e,q,(*cmp)())){    //当前链表中不存在该指数项 
            if(MakeNode(s,e)) InsFirst(q,s);    //生成结点并插入链表 
        } 
    } 
} //CreatPolyn 
void AddPolyn(polynomail &Pa, polynomail &Pb){
    //多项式加法:Pa=Pa+Pb,利用两个多项式的结点构成“和多项式”
    ha=GetHead(Pa); hb=GetHead(Pb); //ha和hb分别指向Pa和Pb的头结点
    qa=NextPos(Pa,ha);
    qb=NextPos(Pb,hb);  //qa和qb分别指向Pa和Pb中当前结点
    while(qa&&qb){  //qa和qb均非空 
        a=GetCurElem(qa);
        b=GetCurElem(qb);   //a和b为两表中当前比较元素
        switch(*cmp(a,b)){
            case -1:    //多项式PA中当前结点的指数值小
                ha=qa;
                qa=NextPos(Pa,qa);
                break;
            case 0:     //两者的指数值相等 
                sun=a.coef+b.coef;
                if(sum!=0.0){   //修改多项式PA中当前结点的系数值
                    SetCurElem(qa,sum);
                    ha=qa;  
                } 
                else{   //删除多项式PA中当前结点 
                    DelFirst(ha,qa);
                    FreeNode(qa);
                    qb=NextPos(Pb,hb);
                    qa=NextPos(Pa,ha);
                    break; 
                }
            case 1:     //多项式PB中当前结点的指数值小 
                DelFirst(hb,qb);
                InsFirst(ha,qb);
                qb=NextPos(Pb,hb);
                ha=NextPos(Pa,ha);
                break; 
        } //switch
    } //while
    if(!ListEmpty(Pb))  Append(Pa,qb);      //连接Pb中剩余结点
    FreeNode(hb);       //释放Pb的头结点 
} //AddPolyn

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wingrez

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值