一元多项式的表示及相加

博客介绍了线性表在一元多项式表示及相加中的应用。一元多项式可用顺序或链式存储,顺序存储分存全系数和只存非零项两种,链式存储需定义结点结构。还阐述了一元多项式链式相加运算的算法思想,根据指数项大小进行不同操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

                                 线性表的应用——一元多项式的表示及相加

对于一元多项式,可以用线性表来处理,可以采用顺序存储或者是链式存储

(一)一元多项式的顺序存储表示

1>.一元多项式Pn(x)只存储该一元多项式各项的系数,每个系数所对应的指数项则隐含在存储系数的顺序表的下标中。即p[0]存系数p0,对应为x^{^{0}}的系数。p[n]对应存系数pn,对应为x^{n}的系数。采用这种存储方式简单,再进行一元多项式的相加运算的时候,只需要将下标相同的单元内容相加即可,适合于存储非零系数多的多项式。但是对于非零项指数很高并且非零项很少的一元多项式会浪费很多的空间。

2>.只存储非零项,此时只需要存储非零项系数和非零项指数两部分,适合存储非零项少的多项式。

(二)一元多项式的链式存储表示

结点结构定义如下:

typedef struct polynode{

           int coef; //系数

           int exp;//指数

           struct  polynode  *next;

} polynode,*polylist;

   通过键盘输入一组多项式的系数和指数,用尾插法建立一元多项式的链表。输入系数0为结束标志,并约定建表时,总是按照从小到大的顺序排列。

polylist ploycreate(){
    polynode *head,*rear,*s;
    int c,e;
    head=(polynode*)malloc(sizeof(polynode));
    rear=head;
    scanf("%d,%d",&c,%e);
    while(c!=0){
        s=(polynode*)malloc(sizeof(polynode));
        s->coef=c;
        s->exp=e;
        rear->next=s;
        rear=s;
        scanf("%d,%d",&c,%e);

    }
    rear->next=NULL;
    return(head);
}

(三)一元多项式的链式相加运算

算法思想:单链表polya和polyb分别表示一元多项式A和B,A+B的求和运算就等同于单链表的插入问题。设p、q分别为指向单链表polya和polyb的当前项的指针,比较p、q结点的指数项,可得到规则:

1、如果p->exp<q->exp,则结点p所指的应该是“和多项式”中的一项,另指针p后移。

2、如果p->exp=q->exp,则将两个节点中的系数相加,当和不为零的时候修改结点p的系数域,释放q结点,若和为零则和多项式没有此项,从polya中删除p结点,同时释放p和q结点。

3、若p->exp>q->exp,则结点q所指应该是“和多项式”中的一项,将q插入到结点p之前,且令指针q在原来链表上后移。

void polyAdd(polilist polya,polylist polyb){
    polynode *p,*q,*tail,*temp;
    int sum;
    p=polya->next;
    q=polyb->next;
    tail=polya;    //tail指向和多项式的尾结点
    while(p!=NULL&&q!=NULL){
        if(p->exp<q->exp){
            tail->next=p;
            tail=p;
            p=p->next'
    }
        else if(p->exp==q->exp){
            sum=p->coef+q->coef;
            if(sum!=0){
                p->coef=sum;
                tail->next=p;
                tail=p;
                p=p->next;
                temp=q;
                q=q->next;
                free(temp);
             }
            else{
                temp=p;p=p->next;free(temp);
                temp=q;q=q->next;free(temp);
            }

      }
        else{
            tail->next=tail;tail=q;q=q->next;
    }
    if(p!=NULL) //多项式A中还有剩余,则将剩余结点加到和多项式中
        tail->next=p;
    else //多项式B中还有剩余,则将剩余结点加到和多项式中
        tail->next=q;

}

 

 

 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值