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

总算到了这里,这时,你会很得意的说,辛辛苦苦学的单链表总算知道能干点什么了。但是很不幸,如果你和我一样看的是那本书,到这里,你可能比学双向链表时还要痛苦。如果你是按照书上的介绍一步一步做到这里,你能把书上的多项式加法函数调试出来,我对你致以十二分的敬意。XML:namespace prefix = o ns = "urn:schemas-microsoft-com:Office:office" />

说到这里,我想起来我发单链表的时候,有人给我建议说:最好把链表和链表位置这两个分开。没错,C++标准库是这么做的,而我也不是什么专家,也不能证明什么优劣;但是,对于初学者来说,一个类总比两个类好操作。我不清楚原书这部分的程序究竟调没调试,但这种语句我是绝对看不懂的:

ListNode *pa, *pb, *pc, *p;

ListIterator Aiter(ah.poly);

ListIterator 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这样的节点呗。但按照原书的定义,ListIterator::First()等等函数返回是指向data域的指针,他们怎么能直接赋值?到了下面更乱了,pb指向的区域直接分解出了Term的数据成员,也就是说是指向Term结构的;然后让ListNode类型的指针p指向这个Term结构,最后,居然把这个结构delete了,天啊,ListNode这样的节点的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(0), exp(0) {}

Term(int c, int e) : coef(c), exp(e) {}

Term(int c) : coef(c), exp(0) {}

};

class Polynomial : List

{

public:

void Input()

{

cout << endl << "输入多项式的各项系数和指数";

cout << endl << "注意:请按降序输入各项,输入系数0表示结束" << endl;

int coef, exp;

for(int i = 1; ; 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 != 1) cout << "^" << p->exp;

}

while (Next() != NULL)

{

p = Get();

if (p->coef > 0) cout << "+";

cout << p->coef;

if (p->exp)

{

cout << "x";

if (p->exp != 1) cout << "^" << p->exp;

}

}

}

cout << endl;

}

friend void PolyAdd (Polynomial &polyA, Polynomial &polyB)

{

Node *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的时候我就不喜欢做这个),尽量照顾习惯,但是当非常数项系数为1的时候还是会输出系数的,我实在不想把一个实际应用中根本拿不出台的输出函数搞的很复杂。为我编起来方便,输出变成了升序的,请多包含。测试程序就不给了,很简单。在续篇中,我将完成一元多项式“+”“-”“×”“=”的重载——为什么没有“÷”,这种运算我拿笔算都不麻利,编起来就更闹心了,我还清楚的记得拿汇编写多字节除法程序时的痛苦。到了下一篇,你就可以这样写了a=b+c*d;a.Print();

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

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

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

  1. 数据结构学习之单链表

    节点类 #ifndef Node_H #define Node_H template <class Type> class Node //单链节点类 { public: Type data ...

  2. 数据结构学习(二)——单链表的操作之头插法和尾插法创建链表

    http://blog.csdn.net/abclixu123/article/details/8210109 链表也是线性表的一种,与顺序表不同的是,它在内存中不是连续存放的.在C语言中,链表是通过 ...

  3. 数据结构学习心得——单链表

    一.线性表的存储结构 顺序表(顺序表操作见上一篇博客) 链表 在链表存储中,每个结点不仅包含所有的元素的信息,还包含元素之间逻辑关系的信息,如单链表中前驱结点包含后继结点的地址信息,这样就可以通过前驱 ...

  4. 单链表存储一元多项式[IMUT 数据结构实验]

    题目 [问题描述] 利用单链表存储一元多项式. [基本要求] 实现以下基本操作: (1)从键盘输入一元多项式的信息,建立一元多项式. (2)实现两个一元多项式相加,并输出和多项式. 分析 题目说是用单 ...

  5. 数据结构与算法--单链表相关面试题

    此文章仅作为自己学习过程中的记录和总结,同时会有意地去用英文来做笔记,一些术语的英译不太准确,内容如有错漏也请多指教,谢谢! 一.概述 获取单链表的有效元素个数[新浪面试题1] 获取单链表倒数第k个结 ...

  6. python数据结构基础(单链表,多链表,二叉树)

    python数据结构基础(单链表,多链表,二叉树) 数据结构指数据对象中数据元素之间的关系 Python 给我们提供了很多现成的数据结构类型,这些系统自己定义好的,不需要我们自己去定义的数据结构叫做 ...

  7. 数据结构之——《单链表》

    数据结构之--<单链表> 1.链表概念 2.链表分类 3.接口函数实现 1.链表概念 链表是一种物理存储结构上非连续,非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现. ...

  8. 数据结构精讲——单链表

    新手必会数据结构精讲--单链表 链表的介绍 概念:链表是一种物理存储结构上非连续.非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的 . 实际中链表的结构非常多样,以下情况组合起来就 ...

  9. 《数据结构》c语言版学习笔记——单链表结构(线性表的链式存储结构Part1)

    线性表的链式存储结构 数据结构系列文章 第二章 单链表结构 文章目录 线性表的链式存储结构 前言 一.单链表的建立 代码 二.单链表的读取 代码 三.单链表的插入 代码 四.单链表的删除 代码 五.单 ...

  10. 03-java数据结构之链表的学习(单链表、双链表等)

    文章目录 1.链表 1.1 链表的介绍 2.单链表 2.1.单链表的显示 2.2.单链表的添加操作 2.2.1.直接添加到链表的尾部 2.2.2.根据no插入到指定位置 2.3.单链表节点的修改 2. ...

最新文章

  1. 2、cookie session token详解
  2. 深圳乐易网络有限公司机试题String to Integer (atoi)
  3. python 字符串格式化语法_Python基础语法--字符串格式化
  4. Linux应用编程基础04:Linux线程编程
  5. sqlserver中日期保存及取值
  6. [转]Handler学习笔记(一)
  7. php 改变页面元素,动态更改网页HTML元素(对象)内容_经验交流
  8. js获取当天0点和24点的时间戳
  9. html语言class,HTML DOM
  10. 在html中做表格以及给表格设置高宽字体居中和表格线的粗细
  11. 【BZOJ1057】[ZJOI2007] 棋盘制作(单调栈的运用)
  12. 微信小程序中引入iconfont阿里矢量图库
  13. 不能右键新建html文件,鼠标右键没有新建文本文档选项怎么办?
  14. 假货泛滥是淘宝的毒瘤
  15. 人工智能课程设计——八皇后问题的求解算法比较
  16. xgboost 中的二阶导数为什么收敛更快?
  17. UVA 10041-Vito's Family
  18. 爱python,爱学习
  19. Ceph学习笔记1-Mimic版本多节点部署
  20. [saiku]saiku3.8项目搭建步骤

热门文章

  1. 无穷小微积分落地生根在中国的现实意义
  2. vscode jupyter笔记本正在升级
  3. Error response from daemon: error while removing network
  4. java接口返回map集合数据;前端ajax获取,遍历时无序
  5. P2765 魔术球问题(数学||最大流)
  6. Tomcat 结合Atomikos 实现JTA
  7. mac上mysql如何使用教程_mac命令终端的mysql常用操作
  8. MySQL8.0使用教程
  9. 阿里android社招面经,阿里社招面经(已过)
  10. 【论文笔记】基于U-Net的医学图像分割模型nnU-Net(no-new U-Net)