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

📄 main.cpp

📁 多项式乘法
💻 CPP
字号:
#include <iostream>
using namespace std;

template <class Type> class List; // 单链表类
template <class Type> class ListItr;// 单链表迭代器类

/* 节点类 
 * 包含数据域和指针场
 */
template <class Type>
class ListNode
{
	friend class List <Type>;
	friend class ListItr<Type>;

	private :
		ListNode <Type> *Next;// 指针场
		Type Element;// 数据域
	public:
		ListNode (const Type &E, ListNode <Type> *N = NULL)
			:Element (E), Next(N){}// 构造函数
		ListNode (): Next(NULL){}// 默认构造函数
		~ListNode (){}// 析构函数
};

/* 单链表类 */
template <class Type>
class List
{
	friend class ListItr <Type>;

	private:
		ListNode <Type> *head;// 头指针
	public:
		List() {head = new ListNode <Type> ();}//构造函数
		~List() {MakeEmpty(); delete head;}// 析构函数

		const List& operator = (const List& R);// 重载等号运算符
		int IsEmpty () const {return head->Next == NULL;} //判断是否为空
		void MakeEmpty();// 清空链表
};

template <class Type>
void List<Type>::MakeEmpty()
{
	ListNode <Type> *Ptr;
	ListNode <Type> *NextNode;
	for (Ptr = head->Next; Ptr != NULL; Ptr = NextNode)//从头遍历一次
	{
		NextNode = Ptr->Next;
		delete Ptr;//删除节点
	}
	head->Next = NULL;
}

/* 单链表迭代器类 */
template <class Type>
class ListItr 
{
	private:
		ListNode <Type> *head;// 头节点
		ListNode <Type> *Current;// 当前节点
	public:
		ListItr (const List <Type> &L): head(L.head) 
		{Current = L.IsEmpty ()? head: head -> Next;}// 构造函数
		~ ListItr (){}// 析构函数

		void MakeEmpty();// 清空迭代器
		void Insert (const Type & x);// 插入函数

		int operator + () const// 判断是否到头或是到尾节点
		{return Current && Current != head;}

		const Type & operator ()() const;// 返回当前节点的数据域
		void operator ++ ();// 当前节点后移一位
		void operator ++ (int) {operator ++();}// 当前节点后移一位
		void Zeroth() {Current = head;}// 使当前节点指向头节点
		void First();// 使当前节点指向头节点后一节点
		const ListItr & operator = (const ListItr &);// 重载等号
};

template <class Type>
void ListItr <Type> ::MakeEmpty()
{
	ListNode <Type> *Ptr;
	ListNode <Type> *NextNode;
	for (Ptr = head->Next; Ptr != NULL; Ptr = NextNode)
	{
		NextNode = Ptr->Next;
		delete Ptr;//删除节点
	}
	head->Next = NULL;

}

template <class Type>
void ListItr <Type> :: Insert (const Type & x)
{
	ListNode <Type> *p;
	p = new ListNode <Type> (x, Current -> Next);//插入节点
	Current = Current -> Next = p;// 当前节点后移一位
}

template <class Type>
const Type &  ListItr <Type> ::operator()()const
{
	return Current -> Element;// 返回当前节点的数据域
}

template <class Type>
void ListItr <Type> ::operator ++()
{
	Current = Current -> Next;// 当前节点后移一位
}

template <class Type>
const ListItr <Type> & ListItr <Type> ::operator = (const ListItr <Type> & R)
{
	if (this = &R) return  *this;// 如果是本身就不用复制直接返回

	head = R.head;// 指向R的头节点
	Current = R.Current;// 指向R的Current的节点
	return *this
}

template <class Type>
void ListItr <Type> ::First ()
{
	Current = head -> Next;// 使当前节点指向头节点后一节点
}

/* 多项式节点类 */
struct Term
{
	float coef;  // 系数
	int exp;   // 幂指数

	Term (float c, int e) {coef = c; exp = e;}// 初始化函数
	Term() {}

	friend int operator == (const Term & L, const Term & T) {return L.exp == T.exp;}// 判断是否相等
	friend int operator > (const Term & L, const Term & T) {return L.exp > T.exp;}// 判断大小关系
    friend int operator < (const Term & L, const Term & T) {return L.exp < T.exp;}// 判断大小关系

	friend Term & operator *= (Term & L, const Term & T)
	{L.coef *= T.coef; L.exp += T.exp; return L;}// 重载运算符
	friend Term & operator += (Term & L, const Term & T)
	{L.coef += T.coef; return L;}// 重载运算符

	friend int equal_stop (const Term & L, const Term & T)
	{return L.exp == T.exp && L.coef == T.coef;}// 设置停止标志
	friend char compare (const Term & P, const Term & T);// 比较两节点
	friend Is_Empty (const Term & T){return !T.coef;}// 判断是否为空
};

/* 比较项的指数 */
char compare (const Term & P, const Term & T)
{
	if (P == T) return '=';
	else if (P < T) return '<';
	else return '>';
}

/* 多项式类 */
template <class Type>
class Polynomial
{
public:
	friend class Polynomial <Type>;
	Polynomial (const Type & P) {Stop_flag = P;}// 构造函数
	Polynomial (){}
	~ Polynomial (){}

	Polynomial & operator = (const Polynomial & T);// 重载等号
	Polynomial & operator * (const Polynomial & T);// 重载乘号
	Polynomial & operator + (const Polynomial & T);// 重载加号
	void insert ();// 插入节点
	void print ();// 输出多项式
private:
	List <Type> poly;// 单链表对象
	Type Stop_flag;// 停止标志
};

template <class Type>
void Polynomial <Type> ::insert()
{
	Type elem;
	ListItr <Type> Itr (poly);// 生成迭代器
	cout << "Please input cofficient and power exponent one by one!\n";
	
	cout << "Please input a power cofficient!\n";
	cin >> elem.coef;// 输入系数
	cout << "Please input a power exponent!\n";
	cin >> elem.exp;// 输入指数
	if (equal_stop(elem, Stop_flag))// 判断多项式是否是空的,若是的就报错跳出程序
	{
		cerr << "you input an empty Polynomial" << endl;
	}
	Itr.Insert(elem);// 插入项

	while (1)
	{
		cout << "Please input a power cofficient!\n";
		cin >> elem.coef;
		cout << "Please input a power exponent!\n";
		cin >> elem.exp;
        if (equal_stop(elem, Stop_flag)) break;//当到了结束标志时跳出
		Itr.Insert(elem);// 插入节点
	}
}

template <class Type>
void Polynomial <Type> ::print()
{
	if (poly.IsEmpty())// 判断是否为空
		cout << "Polynomial is Empty!\n";
	else
	{
		ListItr <Type> Itr(poly);

		if (Itr().coef != 0)// 系数不为零
		{
			if (Itr().exp != 0)
			{
				cout << Itr().coef << "x^" << Itr().exp;//输出多项式
			}
			if (Itr().exp == 0)
			{
				cout << Itr().coef;
			}
		}
		++Itr;

		for (; +Itr; ++Itr)
		{
			if (Itr().coef != 0)// 系数不为零
			{
				if (Itr().coef > 0) cout << '+';
				if (Itr().exp != 0)
				{
					cout << Itr().coef << "x^" << Itr().exp;//输出多项式
				}
				if (Itr().exp == 0)
				{
					cout << Itr().coef;
				}
			}
		}
	}
}

template <class Type>
Polynomial <Type> & Polynomial <Type> :: operator = (const Polynomial & T)
{
	if (this == & T) return * this;// 判断是否是本身多项式

	poly.MakeEmpty();// 清空单链表
	ListItr <Type> ItrT (T.poly);
	ListItr <Type> ItrThis (poly);
	for (;+ItrT;++ItrT) ItrThis.Insert (ItrT());// 复制多项式
	return *this;
}

/*
 * 乘法 
 * 取出本身的每个节点 与输入的多项式的每一个节点相乘
 * 然后相加得到结果
 */
template <class Type>
Polynomial <Type> & Polynomial <Type> :: operator * (const Polynomial & T)
{
	Type elemA, elemB;
	Polynomial <Type> C;
	Polynomial <Type> D;
	ListItr <Type> ItrA (poly);// 生成单链表迭代器
	ListItr <Type> ItrB (T.poly);// 生成单链表迭代器
	ListItr <Type> ItrC (C.poly);// 生成单链表迭代器

	while (+ItrA)
	{
		while (+ItrB)
		{
			elemA = ItrA();// 取出A当前节点的数据域
			elemB = ItrB();// 取出B当前节点的数据域
			elemA *= elemB;// 相乘
			ItrC.Insert(elemA);//插入到C中
			++ItrB;// B的迭代器后移一位
		}
		D + C;// 加入到D中
		ItrC.Zeroth();// 将C中Current指针指向头节点
		ItrC.MakeEmpty();// 清空C
		++ItrA;// A的迭代器后移一位
		ItrB.First();// B的Current指针指向头
	}
	*this = D;
	return *this;

}

/* 加法 */
template <class Type>
Polynomial <Type> & Polynomial <Type> :: operator + (const Polynomial & T)
{
	Type elemA, elemB;
	Polynomial <Type> C;
	ListItr <Type> ItrA (poly);// 生成A迭代器
	ListItr <Type> ItrB (T.poly);// 生成B迭代器
	ListItr <Type> ItrC (C.poly);// 生成C迭代器

	while (+ItrA && + ItrB)
	{
		elemA = ItrA();
		elemB = ItrB();
		switch (compare (elemA, elemB))// 比较两节点大小
		{
		case '=':
				elemA += elemB;// 指数相等就相加
				if (!Is_Empty(elemA)) ItrC.Insert(elemA);
				++ItrA;// A的Current指针后移一位
				++ItrB;// B的Current指针后移一位
				break;
		case '>': // 如果A的指数大B的迭代器后移一位
			ItrC.Insert(elemB);
			++ItrB;
			break;
		case'<':// 如果B的指数大A的迭代器后移一位
			ItrC.Insert(elemA);
			++ItrA;
			break;
		}
	}

	if (+ItrA) //判断A是否为空
	{
		for (;+ItrA;++ItrA)
		{
			elemA = ItrA();
			ItrC.Insert(elemA);
		}
	}
    else 
	{
		for (;+ItrB;++ItrB)
		{
			elemB = ItrB();
			ItrC.Insert(elemB);
		}
	}
	*this = C;
	return *this;
}

void main(void)
{
	Term R(-1, -1);// 结束标志
	Polynomial <Term> a(R), b(R),c;
	a.insert();// 输入a多项式
	a.print();
	b.insert();// 输入b多项式
	c = a * b;// 多项式相乘
	c.print();// 输出多项式
}

⌨️ 快捷键说明

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