链表实现多项式相加和相乘
2015-09-13 14:48
441 查看
【Polynominal.h】:
【polyominal.cpp】:
#include<iostream> using namespace std; class Polynominal; class Term { public: Term(int c, int e); Term(int c, int e, Term* next); Term* InsertAfter(int c, int e); private: int coef; int exp; Term* link; friend ostream & operator<<(ostream &, const Term &); 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::InsertAfter(int c, int e) { link = new Term(c, e, link); return link; } ostream &operator <<(ostream & out, const Term& val) { if (val.coef == 0) return out; out << val.coef; switch (val.exp) { case 0:break; case 1:out << "X"; break; default:out << "X^" << val.exp; break; } return out; } class Polynominal { public: Polynominal(); ~Polynominal(); void Output(ostream& out)const; void AddTerms(istream& in); void PolyAdd(Polynominal& r); void PolyMult(Polynominal& r); private: Term* theList; friend ostream & operator <<(ostream &, const Polynominal &); friend istream & operator >>(istream &, Polynominal &); friend Polynominal& operator +(Polynominal &, Polynominal &); friend Polynominal& operator *(Polynominal &, Polynominal &); }; Polynominal::Polynominal() { theList = new Term(0, -1); theList->link = theList; } Polynominal::~Polynominal() { Term* p = theList->link; while (p != theList) { theList->link = p->link; delete p; p = theList->link; } delete theList; } void Polynominal::AddTerms(istream & in) { Term* q = theList; int c, e; for (;;) { cout << "Input a term(coef,exp):\n" << endl; cin >> c >> e; if (e < 0) break; q = q->InsertAfter(c, e); } } void Polynominal::Output(ostream& out) const { int first = 1; Term *p = theList->link; cout << "The polynominal is:\n" << endl; for (; p != theList; p = p->link) { if (!first && (p->coef > 0)) out << "+"; first = 0; out << *p; } cout << "\n" << endl; } void Polynominal::PolyAdd(Polynominal& r) { Term* q, *q1 = theList, *p; p = r.theList->link; q = q1->link; while (p->exp >= 0) { while (p->exp < q->exp) { q1 = q; q = q->link; } if (p->exp == q->exp) { q->coef = q->coef + p->coef; if (q->coef == 0) { q1->link = q->link; delete (q); q = q1->link; } else { q1 = q; q = q->link; } } else q1 = q1->InsertAfter(p->coef, p->exp); p = p->link; } } ostream& operator <<(ostream &out, const Polynominal &x) { x.Output(out); return out; } istream& operator >>(istream &in, Polynominal &x) { x.AddTerms(in); return in; } Polynominal& operator +(Polynominal &a, Polynominal &b) { a.PolyAdd(b); return a; } void Polynominal::PolyMult(Polynominal &r) { Term* q, *q1=theList, *p,*mult; p = r.theList->link; q = q1->link; Polynominal temp; int c = 0, e = 0; mult = temp.theList->link; for (q = r.theList->link; p->exp >= 0; p = p->link) { for (; q->exp >= 0; q = q->link) { c = p->coef*q->coef; e = p->exp*q->exp; mult=mult->InsertAfter(c, e); } } for (p = temp.theList->link,q=this->theList->link; p->exp >= 0; p = p->link) { if (q->exp >= 0) { q->coef = q->coef; q->exp = p->exp; q = q->link; } else { c = p->coef; e = p->exp; q->InsertAfter(c, e); } } } Polynominal& operator *(Polynominal &a, Polynominal &b) { a.PolyMult(b); return a; }
【polyominal.cpp】:
#include"polynominal.h" void main() { Polynominal p, q; cin >> p; cout << p; cin >> q; cout << q; q = q + p; cout << q; q = q*p; cout << q; system("pause"); }
相关文章推荐
- Perfect Squares
- 代码面试最常用的10大算法
- [知乎]12306 系统在 2015 年春运高峰期的稳定运行,采用了哪些具体技术?
- JAVA STATIC 修饰的代码段
- java 中 for 与 while 比较。
- maven入门总结
- Spark 编译
- HTTP状态码详解
- hadoop 学习笔记:mapreduce框架详解
- exchange2010安装及配置
- linux虚拟机解决校园网上网方案
- ExtJS4组件_form表单配置-属性-方法详解
- 一个完整顺序表的实现
- Android程序窗体显示:requestWindowFeature()
- django 1.8 官方文档翻译: 8-3 点击劫持保护
- 矩阵链乘法问题描述(Matrix-chain multiplication)
- 滚动视图UIScrollView、UIPageControl
- 因为yii2中jquery位置默认在最下方,可将自定义js位置放在下方
- HDU 5439 Aggregated Counting(找规律+预处理)
- 对HDFS进行操作——笔记