数据结构学习(C++)——单链表应用(一元多项式【2】) (转)

本文通过一元多项式的实例,详细介绍了如何使用C++实现单链表的应用,并探讨了多项式加法和乘法的具体实现过程,包括运算符重载等内容。

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

数据结构学习(C++)——单链表应用(一元多项式【2】) (转)[@more@]

按照原书的安排,对多项式的讲解到上一篇就应该结束了,但我还想做一些延伸。比如说,你很清楚多项式的系数肯定不总是整数,但为什么用整型呢?我看到原书用的是整型,我也有这个疑问。但是,一旦动起手来,就会发现改成浮点不仅仅只是在定义Term时把int coef;改成float coef;很多的细节都要考虑到(给个提示,你知道浮点零是多少吗)。我试了一下,最后放弃了;理由是,写这些只是为了学习,没必要搞的那么复杂,能说明问题就可以了。XML:namespace prefix = o ns = "urn:schemas-microsoft-com:Office:office" />

在下面将会有些重载运算符的例子,我们的工作将是使多项式的运算看起来更符合书写习惯。完成这些是我觉得我擅自将原书的“+”改成了PolyAdd(),总要给个交待吧。很快你就会看到原位运算的多项式加法在多项式运算中有多么重要,往下看之前,请确保弄懂了上一篇的内容。

准备工作

下面将完成单链表的赋值运算的重载,请把这部分加到List类的public部分。的确,这部分也可以放在多项式类里实现;但是,复制一个多项式实际上就是复制一个单链表,与其单单做一个多项式赋值,还不如完成单链表的赋值,让派生类都能共享。

operator = (const List &l)

  {

    MakeEmpty();

  for (Node *p = l.first->link; p != NULL; p = p->link) LastInsert(p->data);

  }

还记得List类的private里面的这个List(const List &l)吗?当初怕它惹祸,直接将它禁用了,既然现在=都能用了,为了这种语法List b = a;顺便也把它完成了吧。现在可以把它从private放到public了。

List(const List &l)

  {

  first = current = last = new Node; prior = NULL;

  for (Node *p = l.first->link; p != NULL; p = p->link) LastInsert(p->data);

  }

终于可以这样写了a = b + c * d

friend Polynomial operator + (Polynomial &polyA, Polynomial &polyB)

{

  Polynomial tempA = polyA;Polynomial tempB = polyB;

  PolyAdd(tempA, tempB);

  return tempA;

}

 

friend Polynomial operator * (Polynomial &polyA, Polynomial &polyB)

{

  Node *pA = polyA.pGetFirst()->link;

  Node *pB = polyB.pGetFirst()->link;

  Polynomial polyTempA, polyTempB;

  int coef, exp;

  if (pA == NULL || pB == NULL) return polyTempA;

  for (pA = polyA.pGetFirst()->link; pA != NULL; pA = pA->link)

  {

  for(pB = polyB.pGetFirst()->link; pB != NULL; pB = pB->link)

  {

    coef = pA->data.coef * pB->data.coef;

    exp = pA->data.exp + pB->data.exp;

    TeRM term(coef, exp);

    polyTempB.LastInsert(term);

  }

    PolyAdd(polyTempA, polyTempB);

    polyTempB.Initialize();

  }

  return polyTempA;

}

【后记】很显然,在“+”的处理上我偷懒了,但这是最方便的。乘法部分只要参照手工运算,还是很简单的,我就不解释了。对于“-”,可以先完成(-a)这样的算法,然后就可以用加法完成了,而你要是象我一样懒很可能就会做这种事-a=-1×a,真的不提倡,超低的效率。对于除法,如果你会用汇编写多字节除法(跟手工计算很像),依样画葫芦也能弄出来,但首先要完成“-”。如果要写又得好长,留给你完成吧。到这里你明白原位加法的重要了吧,这些运算实际上都是靠它实现的。


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10752043/viewspace-956668/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/10752043/viewspace-956668/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值