循环链表实现多项式计算

不记得是从哪里转来的了,我修改了一下,加了多项式相减(Polynomial::poly_dec),计算结果(Polynomial::evaluate)和解析多项式字符串(Polynomial::parse)。

term.h

#include <iostream>
using namespace std;
class Polynominal;
class Term
{
public:
	Term(int c, int e);
	Term(int c, int e, Term *next);
	Term *insert(int c, int e);
public:
	int coef;
	int exp;
	Term *link;
	friend ostream &operator<<(ostream &out,const Term &a);
	friend class Polynominal;
};
Term::Term(int c,int e)
	: coef(c), exp(e)
{
	link=0;
}
Term::Term(int c, int e, Term* next)
	: coef(c), exp(e)
{
	link=next;
}
Term* Term::insert(int c, int e)//创建新项
{
	link = new Term(c, e, link);
	return link;
}
ostream& operator<<(ostream &out, const Term &a)
{
	if(a.coef == 0)	
		return out;	
	if(a.coef == -1)
		out<<'-';
	else if(a.coef != 1)
		out<<a.coef;
	switch(a.exp)
	{	
		case 0:
			break;
		case 1:
			out<<"x";
			break;
		default:
			out<<"x^"<<a.exp;
			break
	}
	return out;
}

polynomial.h

#include "Term.h"
#include <cmath>
#include <string>
#include <vector>
using namespace std;

class Polynomial
{
public:
	Polynomial();//构造函数 
	~Polynomial();//析构函数 
	void add_terms(int c, int e);//直接增加多项式项 
	void output(ostream &out) const;//将多项式中的各项送输出流
	void poly_inc(Polynomial &r);//多项式相加
	void poly_dec(Polynomial &r);//多项式相减
	void poly_mul(Polynomial &r);//多项式相乘
	void copy(Polynomial& r);//保存中间多项式
	bool parse(const string &str);//解析多项式 
	double evaluate(double x);//计算多项式结果 
private:
	//循环链表
	Term *list;
	//输出重载
	friend ostream &operator<<(ostream &out, const Polynomial &r);
	//输入重载,使用parse
	friend istream &operator>>(istream &in, Polynomial &r);
	//加号重载
	friend Polynomial &operator+(Polynomial &a, Polynomial &b);
	//减号重载
	friend Polynomial &operator-(Polynomial &a, Polynomial &b);
	//乘号重载
	friend Polynomial &operator*(Polynomial &a, Polynomial &b);
};
Polynomial::Polynomial()
{
	list = new Term(0, -1);
	list->link = list;
}
Polynomial::~Polynomial()
{
	Term *p = list->link;
	while(p != list)
	{
		list->link = p->link;
		delete p;
		p = list->link;
	}
	delete list;
}
bool is_digit(char ch)
{
	return '0' <= ch && ch <= '9';
}
bool is_unknown(char ch)
{
	return ch == 'x' || ch == 'X';
}
bool is_operator(char ch)
{
	return ch == '-' || ch == '*';
}
bool Polynomial::parse(const string &str)
{
	vector<int> ceof, exp;
	int i;
	int tmp_a = 0;
	int tmp_e = 0;
	int negative_number = 1; // 系数的正负号
	bool is_X_front = true; // 判断是系数还是指数,X前面的是系数,X后面是指数
	bool is_start = true;	
	for (i = 0; i <= str.length(); i++)
	{
		char c;
		if(i == str.length())
			c = '\0';
		else
			c = str[i];
		if (is_unknown(c))
		{
			if (tmp_a == 0)
				tmp_a = 1;
			ceof.push_back(negative_number * tmp_a);
			is_X_front = false;
		}
		else if (c == '^'){}
		else if (is_operator(c) || c == '\0')
		{
			if (i != 0)
			{
				if(tmp_e==INF) exp.push_back(1);
				else exp.push_back(tmp_e);
			}
			if(is_X_front && !is_start)
				ceof.push_back(tmp_a);
			is_X_front = true;
			is_start = false;	
			tmp_a = 0;
			tmp_e = 0;
			if (c == '+')
				negative_number = 1;
			else
				negative_number = -1;
		}
		else if (is_digit(c))
		{
			if (is_X_front)
				tmp_a = 10 * tmp_a + (c - '0');
			else
			{
				if(tmp_e == INF) tmp_e=0; 
				tmp_e = 10 * tmp_e + (c - '0');
			}
		}
		else
			return false;
	}
	for(int i = 0; i < ceof.size(); i++)
		add_terms(ceof[i], exp[i]);
	return true;
}
void Polynomial::add_terms(int c, int e)
{
	Term *q = list;
	q = q->insert(c, e);
}
void Polynomial::output(ostream &out) const
{
	int first = 1;
	for(Term *p = list->link; p != list; p = p->link)
	{
		if(!first && p->coef > 0)
		out<<"+";
		first = 0;
		out<<*p;
	}
	out<<endl;
}
double Polynomial::evaluate(double x)
{
	double res;
	Term *p = this->list->link;
	while(p->exp >= 0)
	{
		res += pow((float)p->coef, (float)p->exp);
		p = p->link;
	}
	return res;
}
void Polynomial::poly_inc(Polynomial &r)
{
	Term*p, *q1 = list, *q;
	p = r.list->link;
	q = q1->link;
	while(p->exp >= 0)
	{
		if(p->exp < q->exp)
		{
			q1 = q;
			q = q->link;
		}
		if(p->exp==q->exp)
		{
			q->coef = p->coef + q->coef;
			if(q->coef == 0)
			{
				q1->link = q->link;
				delete q;
				q = q1->link;
			}
			else
			{
				q1 = q;
				q = q->link;
			}
		}
		else
			q1 = q1->insert(p->coef, p->exp);
			p = p->link;
	}
} 
void Polynomial::poly_dec(Polynomial &r)
{
	Polynomial p = Polynomial(r);
	Term *t = p.list->link;
	while(t->exp >= 0)
	{
		t->coef = -t->coef;
		t = t->link;
	}	
	poly_inc(p);
}
void Polynomial::poly_mul(Polynomial &r)
{
	Polynomial a;//过渡
	Polynomial b;//保存中间结果
	Term *q = list->link;
	Term *p = r.list->link;
	Term *q1;
	for(p = r.list->link; p->exp >= 0; p = p->link)
	{
		q1 = a.list->link;
		for(q = list->link; q->exp >= 0; q = q->link)
		{
			q1 = q1->insert(q->coef * p->coef, q->exp + p->exp);
		}
		b.poly_inc(a);
		q1 = a.list->link;
		while(q1 != a.list)
		{
			a.list->link = q1->link;
			delete q1;
			q1 = a.list->link;
		}
	}
	this->copy(b);
}
ostream& operator<<(ostream &out,const Polynomial &r)
{
	r.output(out);
	return out;
}
istream& operator>>(istream &in,Polynomial &r)
{
	string str;
	in>>str;
	r.parse(str);
	return in;
}
Polynomial& operator+(Polynomial &a,Polynomial &b)
{
	a.poly_inc(b);
	return a;
}
Polynomial& operator-(Polynomial &a,Polynomial &b)
{
	a.poly_dec(b);
	return a;
}
Polynomial &operator *(Polynomial &a, Polynomial &b)
{
	a.poly_mul(b);
	return a;
}
void Polynomial::copy(Polynomial &r)
{
	Term *p;
	Term *q = list->link;
	while(q != list)
	{
		list->link=q->link;
		delete q;
		q=list->link;
	}
	for(q = list->link, p = r.list->link; p->exp >= 0; p = p->link)
	{
		q = q->insert(p->coef, p->exp);
	}
}


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值