数据结构——一元多项式的表示及相加

本文所有代码均为伪码,仅阐述算法基本思想——《数据结构》清华大学出版社

一元多项式的表示采用链式存储结构来实现,基本操作和链表的合并类似。以下为算法部分:

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

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

void CreatPolyn(polynomail &P, int m);
//输入m项的系数和指数,建立表示一元多项式的有序链表P
void DestroyPolyn(polynomail &p);
//销毁一元多项式P
void PrintPolyn(polynomail P);
//打印输出一元多项式P
void PolynLength(polynomail P);
//返回一元多项式P中的项数
void AddPolyn(polynomail &Pa, polynomail &Pb);
//完成多项式相加运算,即:Pa=Pa+Pb,并销毁一元多项式Pb
void SubtractPolyn(polynomail &Pa,polynomail &Pb);
//完成一元多项式的相减运算,即:Pa=Pa-Pb,并销毁一元多项式Pb
void MultiplyPolyn(polynomail &Pa,polynomail &Pb);
//完成一元多项式的相乘运算,即:Pa=Pa*Pb,并销毁一元多项式Pb

int cmp(term a,term b);
//依a的指数值<(或=)(或>)b的指数值,分别返回-1、0、+1


//基本操作的算法描述(部分)
void CreatPolyn(polynmail &P, int m){
    InitList(P);//构造一个空的线性链表P
    h=GetHead(P);//获取P的头结点
    e.coef=0.0;e.expn=-1;SetCurElem(h,e);//设置头结点的数据元素
    for(i=1;i<=m;++i){
        scanf(e.coef,e.expn);
        if(!LocateElem(P,e,q,(*cmp)())){//当前链表中不存在该指数项
            if(MakeNode(s,e)) InsFirst(q,s);//生成结点并插入链表
        }
    }
}

void AddPolyn(polynomail &Pa,Polynomail &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://两者指数值相等
                sum=a.coef+b.coef;
                if(sum!=0.0){//修改多项式Pa中的当前结点的系数值
                    SetCurElem(qa,sum); ha=qa;
                }else{//删除多项式Pa中的当前结点
                    DelFirst(ha,qa); FreeNode(qa);
                }
                DelFirst(hb,qb);FreeNode(qb);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;
        }
    }
    if(!ListEmpty(Pb)) Append(Pa,qb);//链接Pb中的剩余结点
    FreeNode(hb);//释放Pb的头结点
}
  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值