数据结构学习(C++)——单链表应用(一元多项式【1】) (转)
总算到了这里,这时,你会很得意的说,辛辛苦苦学的单链表总算知道能干点什么了。但是很不幸,如果你和我一样看的是那本书,到这里,你可能比学双向链表时还要痛苦。如果你是按照书上的介绍一步一步做到这里,你能把书上的多项式加法函数调试出来,我对你致以十二分的敬意。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】) (转)相关推荐
- 数据结构学习之单链表
节点类 #ifndef Node_H #define Node_H template <class Type> class Node //单链节点类 { public: Type data ...
- 数据结构学习(二)——单链表的操作之头插法和尾插法创建链表
http://blog.csdn.net/abclixu123/article/details/8210109 链表也是线性表的一种,与顺序表不同的是,它在内存中不是连续存放的.在C语言中,链表是通过 ...
- 数据结构学习心得——单链表
一.线性表的存储结构 顺序表(顺序表操作见上一篇博客) 链表 在链表存储中,每个结点不仅包含所有的元素的信息,还包含元素之间逻辑关系的信息,如单链表中前驱结点包含后继结点的地址信息,这样就可以通过前驱 ...
- 单链表存储一元多项式[IMUT 数据结构实验]
题目 [问题描述] 利用单链表存储一元多项式. [基本要求] 实现以下基本操作: (1)从键盘输入一元多项式的信息,建立一元多项式. (2)实现两个一元多项式相加,并输出和多项式. 分析 题目说是用单 ...
- 数据结构与算法--单链表相关面试题
此文章仅作为自己学习过程中的记录和总结,同时会有意地去用英文来做笔记,一些术语的英译不太准确,内容如有错漏也请多指教,谢谢! 一.概述 获取单链表的有效元素个数[新浪面试题1] 获取单链表倒数第k个结 ...
- python数据结构基础(单链表,多链表,二叉树)
python数据结构基础(单链表,多链表,二叉树) 数据结构指数据对象中数据元素之间的关系 Python 给我们提供了很多现成的数据结构类型,这些系统自己定义好的,不需要我们自己去定义的数据结构叫做 ...
- 数据结构之——《单链表》
数据结构之--<单链表> 1.链表概念 2.链表分类 3.接口函数实现 1.链表概念 链表是一种物理存储结构上非连续,非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现. ...
- 数据结构精讲——单链表
新手必会数据结构精讲--单链表 链表的介绍 概念:链表是一种物理存储结构上非连续.非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的 . 实际中链表的结构非常多样,以下情况组合起来就 ...
- 《数据结构》c语言版学习笔记——单链表结构(线性表的链式存储结构Part1)
线性表的链式存储结构 数据结构系列文章 第二章 单链表结构 文章目录 线性表的链式存储结构 前言 一.单链表的建立 代码 二.单链表的读取 代码 三.单链表的插入 代码 四.单链表的删除 代码 五.单 ...
- 03-java数据结构之链表的学习(单链表、双链表等)
文章目录 1.链表 1.1 链表的介绍 2.单链表 2.1.单链表的显示 2.2.单链表的添加操作 2.2.1.直接添加到链表的尾部 2.2.2.根据no插入到指定位置 2.3.单链表节点的修改 2. ...
最新文章
- 2、cookie session token详解
- 深圳乐易网络有限公司机试题String to Integer (atoi)
- python 字符串格式化语法_Python基础语法--字符串格式化
- Linux应用编程基础04:Linux线程编程
- sqlserver中日期保存及取值
- [转]Handler学习笔记(一)
- php 改变页面元素,动态更改网页HTML元素(对象)内容_经验交流
- js获取当天0点和24点的时间戳
- html语言class,HTML DOM
- 在html中做表格以及给表格设置高宽字体居中和表格线的粗细
- 【BZOJ1057】[ZJOI2007] 棋盘制作(单调栈的运用)
- 微信小程序中引入iconfont阿里矢量图库
- 不能右键新建html文件,鼠标右键没有新建文本文档选项怎么办?
- 假货泛滥是淘宝的毒瘤
- 人工智能课程设计——八皇后问题的求解算法比较
- xgboost 中的二阶导数为什么收敛更快?
- UVA 10041-Vito's Family
- 爱python,爱学习
- Ceph学习笔记1-Mimic版本多节点部署
- [saiku]saiku3.8项目搭建步骤
热门文章
- 无穷小微积分落地生根在中国的现实意义
- vscode jupyter笔记本正在升级
- Error response from daemon: error while removing network
- java接口返回map集合数据;前端ajax获取,遍历时无序
- P2765 魔术球问题(数学||最大流)
- Tomcat 结合Atomikos 实现JTA
- mac上mysql如何使用教程_mac命令终端的mysql常用操作
- MySQL8.0使用教程
- 阿里android社招面经,阿里社招面经(已过)
- 【论文笔记】基于U-Net的医学图像分割模型nnU-Net(no-new U-Net)