线性表应用举例——一元多项式相加问题

多项式相加算法的思路是,不产生新的结点而利用原有结点空间,设两个指针变量p和q分别指向A和B两个多项式单链表的第一个结点,依次比较两指针所指结点的指数项。若指数相等系数相加,和不为零修改*p的系数项并删除*q,和为零删除*p和*q;若指数不等,p->exp<q->exp时*p为和多项式中的一项,p->exp>q->exp时把*q插在*p之前(*q为和多项式中的一项);所有操作之后要相应的移动指针。直到其中的一个链空,把另一个链剩下的结点插在*p之后。

其算法描述如下:

void polyadd(A,B)
polynomial *A,*B;//把多项式A和B相加结果多项式在A中
{
    polynomial *p,*q,*s,*r;
    float x;
    p=A->next;q=B->next;//p和q分别指向两个多项式的第一个结点
    s=A;//s作为p的前驱
    while((p!=NULL)&&(q!=NULL))//两链都不空时反复做
       if(p->exp>q->exp)//把q所指结点插入到结果链中去
       {
              r=q->next;//为r后移做准备
              q->next=p;//把p接在q所指结点后
              s->next=q;//把q接入结果链
              s=q;q=r;//修改s和q的当前值
       }
       else if(p->exp<q->exp)//p所指结点进结果链,只须移动指针
       {
                   s=p;//s后移
                   p=p->next;//p指向下一个结点
       }
           else //两链当前结点的指数相等
           {
               x=p->coef+q->coef;//系数相加送x
               if(x!=0)//x不为0,填入结果链当前结点系数域
               {
                   p->coef=x;
                   s=p;//指示p的前驱指针s后移
               }
               else
               {
                   s->next=p->next;//x为0先释放p所指结点
                   free(p);
               }
               p=s->next;//p指针指向下一个结点
               r=q;//为释放q所指结点做准备
               q=q->next;//q指向下一个结点
               free(r);
           }
    if(q!=NULL)
       s->next=q;//把q链剩余结点链入结果链
    free(B);//释放B多项式的头结点
}//polyadd




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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值