知识大全 数据结构学习讲座(C++) 单链表(2)

Posted 多项式

篇首语:你可以忘掉苦难,但不能忘却艰辛;你可以忘掉伤疤,但不能忘却耻辱。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 数据结构学习讲座(C++) 单链表(2)相关的知识,希望对你有一定的参考价值。

数据结构学习讲座(C++) 单链表(2)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

单链表( ) 

 单链表应用

  有人曾经建议最好把链表和链表位置这两个分开 C++标准库是这么做的 但对于初学者来说 一个类总比两个类好操作 我不清楚在书中这部分的程序究竟调没调试 但这种语句我是绝对看不懂的

ListNode<Term> *pa *pb *pc *p;ListIterator<Term> Aiter(ah poly);ListIterator<Term> Biter(ah poly);pa = pc = Aiter First(); pb = p = Biter First();……………………… pa >coef = pa >coef + pb >coef;p = pb; pb = Biter Next(); delete p;

  pa pb p 究竟指向什么?你说这很清楚 ListNode<Term>这样的节点呗 但按照原书的定义 ListIterator::First()等等函数返回是指向data域的指针 他们怎么能直接赋值?到了下面更乱了 pb指向的区域直接分解出了Term的数据成员 也就是说是指向Term结构的 然后让ListNode<Term>类型的指针p指向这个Term结构 最后 居然把这个结构delete了 天啊 ListNode<Term>这样的节点的data域被delete了!

  如果从基本的节点操作入手 谁也不会弄的这么乱 但正因为又多了一个类 很多事就疏忽了 所以 我并不怀疑标准库的做法 只是对于初学者 同一时间最好只对一个类操作 我以我的定义为基础 重新完成了这段程序 我并不欣赏原位操作的多项式加法(+) PolyA+PolyB 然后B就嗖的一下没了 A就多了一堆(也可能少了一堆) 你作intJ+intK的时候怎么没见J和K有什么变化 与其这样 重载 + 还不如写成PolyA Add(PolyB)或者PolyAdd(PolyA PolyB)

  一元多项式类定义与实现

#ifndef Polynomial_H#define Polynomial_H

#include List h class Term public:  int coef;  int exp;  Term() : coef( ) exp( )   Term(int c int e) : coef(c) exp(e)   Term(int c) : coef(c) exp( ) ;

class Polynomial : List<Term> public:  void Input()     cout << endl << 输入多项式的各项系数和指数 ;   cout << endl << 注意 请按降序输入各项 输入系数 表示结束 << endl;   int coef exp;   for(int i = ; ; i++)       cout << 第 << i << 项的系数 ;    cin >> coef;    if (coef)         cout << 指数 ;     cin >> exp;     Term term(coef exp);     Insert(term);        else break;      void Print()   cout << endl;  First();  if (!IsEmpty())     Term *p = Next();   cout << p >coef;   if (p >exp)        cout << x ;    if (p >exp != ) cout << ^ << p >exp;     while (Next() != NULL)     p = Get();   if (p >coef > ) cout << + ;   cout << p >coef;   if (p >exp)       cout << x ;    if (p >exp != ) cout << ^ << p >exp;       cout << endl;friend void PolyAdd (Polynomial &polyA Polynomial &polyB) Node<Term> *pA *pB; polyA First();polyB First(); pA = polyA pNext();pB = polyB pNext(); while (pA != NULL && pB !=NULL)   if (pA >data exp == pB >data exp)     pA >data coef = pA >data coef + pB >data coef;   polyB Remove();   if (!pA >data coef) polyA Remove();   else polyA pNext();    else     if (pA >data exp > pB >data exp)       polyB pRemove();    polyA InsertBefore(pB);      else if (pA >data exp < pB >data exp) polyA pNext();     pA = polyA pGet();pB = polyB pGet();  if (pA == NULL)    polyA pGetPrior() >link = pB;  polyB pGetPrior() >link = NULL;  ;#endif 

  【说明】对于多项式 通常我们都是降序书写的 于是我就要求降序输入 但是对于做加法来说 确实升序的要方便一些 于是 实际上到了内部 就变成升序的了 对于输出格式(从C的时候我就不喜欢做这个) 尽量照顾习惯 但是当非常数项系数为 的时候还是会输出系数的 我实在不想把一个实际应用中根本拿不出台的输出函数搞的很复杂 为我编起来方便 输出变成了升序的 请多包含 测试程序就不给了 很简单 在续篇中 我将完成一元多项式 + - × = 的重载——为什么没有 ÷ 这种运算我拿笔算都不麻利 编起来就更闹心了 我还清楚的记得拿汇编写多字节除法程序时的痛苦 到了下一篇 你就可以这样写了a=b+c*d;a Print()

cha138/Article/program/sjjg/201311/22943

相关参考