📄 makepolynominal.cpp
字号:
#include <iostream>
using namespace std;
#include "Polynominal.h"
Polynominal::Polynominal()
{
theList = new Term(0, -1); //生成带头结点的空循环链表
theList->link = theList;
}
void Polynominal::InsertTerm(int c, int e)
{
Term *pTerm = theList->link;
Term *pPreTerm = theList;
while (pTerm != theList){
if (pTerm->exp < e){
pPreTerm = pTerm;
pTerm = pTerm->link;
}
else {
if (pTerm->exp == e){
pTerm->coef += c;
return;
}
else
break;
}
}
pPreTerm->link=new Term(c,e,pTerm);
}
void Polynominal::AddTerms(istream & in)
{
int c, e;
for(;;)
{
cout<<"Input a term(coef,exp):\n" << endl;
in >> c >> e;
if (e < 0)
break;
InsertTerm(c,e);
//q->InsertAfter(c, e);
//q = q->InsertAfter(c, e);
}
}
void Polynominal::Output(ostream& out) const
{
int first = 1;
Term *p = theList->link;//(p指向谁?)
cout << "The polynominal is:\n" << endl;
for ( ; p != theList; p = p->link){
if(!first && (p->coef > 0))
out << "+";
first = 0;
out << *p;// 调用Term类上重载的“<<”操作。
}
cout << "\n" << endl;
}
void Polynominal::PolyAdd(Polynominal& r) //为什么只有一个参数
{
Term* q, *q1 = theList, *q2, *p;
p = r.theList; q = q1->link; p = p->link; //p和q指向两个当前进行比较的项
while (p->exp >= 0){ //如果p多项式未结束,则继续
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)
{
q2 = q;
q1->link = q->link;
q = q->link;
delete(q2);
p = p->link;
}
else
{
q1 = q;
q = q->link;
p = p->link;
}
}
else{ // (p->exp>q->exp)
q1 = q1->InsertAfter(p->coef, p->exp);
p = p->link;
} //end else
} //end while
} //end PolyAdd
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::Release()
{
Term *pHead = theList->link;
while (pHead != theList){
Term *tmp = pHead;
pHead = pHead->link;
delete tmp;
}
delete theList;
}
Polynominal Polynominal::multiply(Polynominal& p,Polynominal& q)
{
Polynominal s;
Term *op1, *op2;
op1 = p.theList;//oprand1
int c,e;
cout<<"Begin______\n";
for(op1 = op1->link;op1->exp != -1;op1 = op1->link)
{
op2 = q.theList;//oprand2
for(op2 = op2->link; op2->exp != -1; op2 = op2->link)
{
c = op1->coef * op2->coef;
e = op1->exp + op2->exp;
s.InsertTerm(c,e);
}
}
cout<<s;
cout<<"END______\n";
return s;
}
Polynominal operator *(Polynominal& a, Polynominal& b)
{
return Polynominal::multiply(a,b);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -