⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 polynomial.cpp

📁 一个我的数据结构解题集合
💻 CPP
字号:
#include <iostream>
#include "Polynomial.h"

using namespace std;


/* 本多项式加上项e
 */
void Polynomial::add(Term e) {

	// 找出多项式中首个系数大于等于项e的项的前一项
	SList<Term>::Itor itor = list_.head();			// 注意: 此处的itor始终指向想要访问的
													//		 项的前一项
	for ( ; ( itor != list_.tail() ) &&
			( (itor->next->data).compareTo(e) < 0 );
		  itor=itor->next)
		;	// 空循环体

	if ( itor == list_.tail() ||
		 (itor->next->data).compareTo(e) > 0 ) {	// 指数相等的项本来不存在
		list_.insertAfter(itor, e);
	} else {										// 找到指数相等的项
		(itor->next->data).coef += e.coef;
		if ( (itor->next->data).coef == 0 )
			list_.removeNext(itor);
	}

} // add(Term e)


/* 本多项式乘以项e
 */
void Polynomial::mul(Term e) {
	SList<Term>::Itor itor = list_.head();			// 注意: 此处的itor始终指向想要访问的
													//		 项的前一项
	for ( ; itor != list_.tail(); itor=itor->next) {

		(itor->next->data).coef *= e.coef;			// 系数相乘
		if ( (itor->next->data).coef == 0 )
			list_.removeNext(itor);

		(itor->next->data).expn += e.expn;			// 指数相加
	}

} // mul(Term e)


/* 本多项式加上多项式rhs
 */
void Polynomial::add(const Polynomial& rhs) {
	SList<Term>::Itor ilhs = list_.head(),
					  irhs = rhs.list_.head();		// 注意: 此处的litor和ritor
													//		 始终指向想要访问的项的前一项

	while ( ilhs != list_.tail() &&
			irhs != rhs.list_.tail() ) {
		int cmp = (ilhs->next->data).compareTo(irhs->next->data);	// 比较两个项指数大小

		if ( cmp > 0 ) {								// ilhs所指项的后一项指数大
			list_.insertAfter(ilhs, irhs->next->data);
			ilhs=ilhs->next;
			irhs=irhs->next;
		} else
		if ( cmp == 0 ) {								// ilhs和irhs所指项的后一项指数相等
			(ilhs->next->data).coef += (irhs->next->data).coef;
			if (ilhs->next->data.coef == 0) {
				list_.removeNext(ilhs);
			} else {
				ilhs=ilhs->next;
			}

			irhs=irhs->next;
		} else {										// ilhs所指项的后一项指数小
			ilhs=ilhs->next;							// 不是不加, 时候未到
		}
	}

	while ( irhs != rhs.list_.tail() ) {				// 加入剩余结点
		list_.insertAfter(list_.tail(), irhs->next->data);
		irhs=irhs->next;
	}


} // add(const Polynomial&)


/* 本多项式减去多项式rhs
 */
void Polynomial::sub(const Polynomial& rhs) {
	SList<Term>::Itor ilhs = list_.head(),
					  irhs = rhs.list_.head();		// 注意: 此处的litor和ritor
													//		 始终指向想要访问的项的前一项

	while ( ilhs != list_.tail() &&
			irhs != rhs.list_.tail() ) {
		int cmp = (ilhs->next->data).compareTo(irhs->next->data);	// 比较两个项指数大小

		if ( cmp > 0 ) {								// ilhs所指项的后一项指数大
			Term e = irhs->next->data;
			e.coef = -e.coef;

			list_.insertAfter(ilhs, e);

			ilhs=ilhs->next;
			irhs=irhs->next;
		} else
		if ( cmp == 0 ) {								// ilhs和irhs所指项的后一项指数相等
			(ilhs->next->data).coef -= (irhs->next->data).coef;
			if (ilhs->next->data.coef == 0) {
				list_.removeNext(ilhs);
			} else {
				ilhs=ilhs->next;
			}

			irhs=irhs->next;
		} else {										// ilhs所指项的后一项指数小
			ilhs=ilhs->next;							// 不是不减, 时候未到
		}
	}

	while ( irhs != rhs.list_.tail() ) {				// 加入剩余结点
		Term e = irhs->next->data;
		e.coef = -e.coef;

		list_.insertAfter(list_.tail(), e);
		irhs=irhs->next;
	}

} // sub(const Polynomial&)


/* 本多项式乘以多项式rhs
 */
void Polynomial::mul(const Polynomial& rhs) {
	Polynomial result, temp;
	SList<Term>::Itor itor = rhs.list_.begin();			// 注意: 此处的itor始终指向想要访问的
														//		 项本身
	for ( ; itor != rhs.list_.end(); itor=itor->next) {
		temp = *this;
		temp.mul(itor->data);
		result.add(temp);
	}

	*this = result;

} // mul(const Polynomial&)


/* 在cout打印一元多项式
 */
void Polynomial::print() const {

	SList<Term>::Itor itor = list_.begin();

	cout << itor->data.coef;
	if ( itor->data.expn != 0 )
		cout << " * x^(" << itor->data.expn << ")";
	itor = itor->next;

	for ( ; itor != list_.end(); itor=itor->next) {
		if ( itor->data.coef >= 0 )
			cout << " + " << itor->data.coef;
		else
			cout << " - " << -(itor->data).coef;

		if ( itor->data.expn != 0 )
			cout << " * x^(" << itor->data.expn << ")";
	}
	cout << endl;
} // print() const

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -