数据结构

位置:IT落伍者 >> 数据结构 >> 浏览文章

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


发布日期:2018年08月31日
 
数据结构学习讲座(C++) 单链表(2)

单链表()

单链表应用

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

ListNode<Term> *pa *pb *pc *p;

ListIterator<Term> Aiter(ahpoly);

ListIterator<Term> Biter(ahpoly);

pa = pc = AiterFirst(); pb = p = BiterFirst();

………………………

pa>coef = pa>coef + pb>coef;

p = pb; pb = BiterNext(); 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有什么变化与其这样重载+还不如写成PolyAAdd(PolyB)或者PolyAdd(PolyAPolyB)

一元多项式类定义与实现

#ifndef Polynomial_H

#define Polynomial_H

#include Listh

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;

polyAFirst();polyBFirst();

pA = polyApNext();pB = polyBpNext();

while (pA != NULL && pB !=NULL)

{

if (pA>dataexp == pB>dataexp)

{

pA>datacoef = pA>datacoef + pB>datacoef;

polyBRemove();

if (!pA>datacoef) polyARemove();

else polyApNext();

}

else

{

if (pA>dataexp > pB>dataexp)

{

polyBpRemove();

polyAInsertBefore(pB);

}

else if (pA>dataexp < pB>dataexp) polyApNext();

}

pA = polyApGet();pB = polyBpGet();

}

if (pA == NULL)

{

polyApGetPrior()>link = pB;

polyBpGetPrior()>link = NULL;

}

}

};

#endif

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

在下面将会有些重载运算符的例子我们的工作将是使多项式的运算看起来更符合书写习惯完成这些是我觉得我擅自将原书的改成了PolyAdd()总要给个交待吧

上一篇:数据结构考研分类复习真题 第十章 排序[62]

下一篇:数据结构学习讲座(C++) 单链表(3)