您的位置:首页 > 理论基础 > 数据结构算法

【重学数据结构】一元多项式的表示及相加

2016-01-21 21:41 411 查看
严蔚敏版数据结构中的例子,不过我没用C语言,而用了C++,因为C++标准模板库中已经有了各种泛型容器,用起来比较方便。

这是第一篇,实现了2.4节:一元多项式的表示及相加,详细代码见http://codepad.org/cV4t8YLq

下面说一下核心算法:

Polynomial &Polynomial::operator+=(Polynomial right)
{
for (Polynomial::iterator i = this->begin(), j = right.begin();
j != right.end();
++j)
{
while (this->cmp(j, i) == 1) ++i;
if (this->cmp(j, i) == -1)
{
this->MyInsert(i, *j);
}
else
{
this->MyMerge(i, j->k);
}
}
return *this;
}
即加法功能,把右操作数的加到左操作数,所以先是一个for循环遍历右操作数,

然后根据两个迭代器,可以分三种情况:

一是可以插入

二是可以合并

三是无法做这上述两种情况,需要累加左操作数。

这里面用了三个小函数,

一是用于确定上述三种情况的哪一种的函数cmp,

int Polynomial::cmp(Polynomial::iterator j, Polynomial::iterator i) // > 1, == 0, < -1
{
if (i == this->end())
{
return -1;
}
else
{
if (j->e < i->e) return -1;
else if (j->e == i->e) return 0;
else return 1;
}
}


返回-1,表示可以参数 j “小于” 参数 i,既然“小于”, 就可以把 j 插入 i的前面;

返回0,表示相等,则合并;

返回1,表示大于,则需要累加 i,因为不知道需要累加几次,所以用while循环。又因为累加 i 改变了 i 的值,所以这种情况要放在最上面。

因为还要考虑到 i 指向 this->end(), 所以做成一个函数比较好,这种情况作的操作也是插入,所以也返回 -1

然后是用于插入的小函数

void Polynomial::MyInsert(Polynomial::iterator &i, Polynomial::value_type const &v)
{
i = this->insert(i, v);
++i;
}


从std::list继承而来的insert方法返回的是插入了的元素的位置,而我需要指向的是即插入前原本指向的元素,所以要累加一起。

最后是用于合并的小函数

void Polynomial::MyMerge(Polynomial::iterator &i, int k)
{
i->k += k;
if (i->k == 0)
{
i = this->erase(i);
}
else
{
++i;
}
}
这最简单了,用不着解释。之所以做成一个函数,除了优化结构外,还起到注释的作用,因为需要取一个名字。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: