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

建立一元多项式的链式存储

用单链表存储多项式的结点结构如下:

 struct Polynode
      { 
         int coef; 
         int exp; 
         Polynode *next; 
}

多项式相加的过程

1.两个多项式中所有指数相同的项的对应系数相加, 
若和不为零,则构成“和多项式”中的一项;
2.所有指数不相同的项
均复抄到“和多项式”中。

一元多项式相加中的三种情况

1.若pa->exp<qb->exp,
则结点pa所指的结点应是“和多项式”中的一项,将结点pa插入在结点pc之后,令指针pa、pc后移;
2.若pa->exp>qb->exp,
则结点qb所指的结点应是“和多项式”中的一项,将结点pb插入在结点pc之后,pb 、pc后移;
3.若pa->exp=qb->exp,
则将两个结点中的系数相加, 释放qb结点;
3.1当和不为零时修改结点pa的系数域, pa、pc后移;
3.2若和为零,释放pa,pa后移。 

算法分析

1.设置四个工作指针,pa, pb, pc, p,并对其进行初始化
2.当 pa!=NULL 并且pb!=NULL时,重复做以下工作
	2.1If(pa.exp<pb.exp),将pa加入到C中,之后移动pa、pc;
	2.2If(pa.exp>pb.exp),将pb加入到C中,之后移动pb、pc;
	2.3If(pa.exp==pb.exp) ,pa、pb的系数相加,删除pb,pb后移
		2.3.1如果和为0,删除pa, pa后移
		2.3.2否则,将和写入到pa中,将pa加入到C中,之后,pa、pc后移;
3.如pa!=NULL,将pa链入C中,否则将pb链入C中;

核心代码

void Add(LinkList <T>&A, LinkList <T>B){
    Node<T> *pa, *pb, *pc, *p;   
    T a, b;  //存放pa、pb两个指针变量中存储的系数
    pc = A.GetHead(); //结果存放指针
    p = B.GetHead();     
    pa = A.GetHead()->next;    //pa指向ah
    pb = B.GetHead()->next;    //pb指向bh
    delete p;	               //删去bh的表头结点
    while ( pa != NULL && pb != NULL ) {
       a = pa->data;
       b = pb->data;
       if(a.exp==b.exp){ 		
       //pa->exp == pb->exp
	  		a.coef = a.coef + b.coef;	//系数相加
        	p = pb;  pb = pb->next;  
            delete p;		//删去原pb所指结点
		if (a.coef == 0) {
                   p = pa;  
                   pa = pa->next; 
                   delete p;
            }	                 //相加为零, 该项不要
        else {                  //相加不为零, 加入ch链
                   pa->data = a;   
                   pc->next = pa;
                   pc = pa;  
                   pa = pa->next;
             }
        }
       else if(a.exp>b.exp) {	  //pa->exp > pb->exp
	  		pc->next = pb;  
	  		pc = pb;  
            pb = pb->next;
	}
       else{		  //pa->exp < pb->exp
	 		pc->next=pa;  
            pc = pa;  
            pa = pa->next;
      }
   }
	if (pa) 
		pc->next=pa;
	else 
		pc->next=pb; 

对结果表达式的构造:
从空表开始,依次将A或B中结点加入到C中,完成C表的构造(尾插法构造了新的单链表)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值