c++一元多项式的乘法和加法

来源:互联网 发布:mysql trigger 编辑:程序博客网 时间:2024/05/16 15:50

首先是结点类:

Term.h代码如下:

#ifndef CH_H#define CH_H#include<iostream>#include <stdlib.h>#include <fstream>#include <assert.h>using namespace std;#endifstruct Term{float coef;int exp;Term *link;Term(float c, int e, Term* next = NULL) :coef(c), exp(e), link(next){ }Term* InsertAfter(float c, int e);friend ostream& operator<<(ostream&, const Term&);};


Term.cpp代码如下:

#include "Term.h"Term* Term::InsertAfter(float c, int e){//插入一个新项link = new Term(c, e, link);return link;}ostream& operator<<(ostream& out, const Term& x){if (x.coef == 0.0){return out;}switch (x.exp){case 0:out << x.coef;break;case 1:out << x.coef << "X";break;default:if (1 == x.coef){out << "X^" << x.exp;}else if (-1 == x.coef){out << "-X^" << x.exp;}else{out << x.coef << "X^" << x.exp;}break;}return out;}

Polynomial.h代码如下:

#ifndef  POLYNOMAL_H#define  POLYNOMAL_H#include "Term.h"class Polynomial{public:Polynomial(){ first = new Term(0, -1); }Polynomial(Polynomial& R);int maxOrder();Term *getHead(){ return first; }private:Term *first;friend ostream& operator<<(ostream&, const Polynomial&);friend istream& operator>>(istream&, Polynomial&);friend Polynomial operator+(Polynomial&, Polynomial&);friend Polynomial operator*(Polynomial&, Polynomial&);};#endif

polynomial.cpp代码如下 :

#include "Polynomal.h"Polynomial::Polynomial(Polynomial& R){first = new Term(0, -1);Term* destptr = first, *srcptr = R.getHead()->link;while (srcptr != NULL){destptr->InsertAfter(srcptr->coef, srcptr->exp);//在最后面添加一个新节点,他的指针域为空。srcptr = srcptr->link;destptr = destptr->link;}}int Polynomial::maxOrder(){Term* current = first;while (current->link != NULL){current = current->link;}return current->exp;}istream& operator>>(istream& in, Polynomial& x){Term* rear = x.getHead();float c;int e;while (1){//cout << "输入了一个个节点的coef,exp!" << endl;in >> c >> e;if (e < 0){break;}rear = rear->InsertAfter(c, e);}return in;}ostream& operator<<(ostream& out, const Polynomial& x){Term *current = x.first->link;//x.getHead()->link;cout << "The Polynomial is:" << endl;bool h = true;while (current != NULL){if (h == false && current->coef > 0.0){out << "+";}h = false;out << *current;current = current->link;}out << endl;return out;}Polynomial operator+(Polynomial& A, Polynomial& B){Term *pa, *pb, *pc, *p;float temp;Polynomial C;pc = C.first;pa = A.getHead()->link;pb = B.getHead()->link;while (pa != NULL&&pb != NULL){if (pa->exp == pb->exp){temp = pa->coef + pb->coef;if (fabs(temp) > 0.001)//相加后系数不为零{pc = pc->InsertAfter(temp, pa->exp);pa = pa->link;pb = pb->link;}else{pa = pa->link;pb = pb->link;}}else if (pa->exp < pb->exp){pc = pc->InsertAfter(pa->coef, pa->exp);pa = pa->link;}else{pc = pc->InsertAfter(pb->coef, pb->exp);pb = pb->link;}}if (pa != NULL){p = pa;}else{p = pb;}while (p != NULL){pc = pc->InsertAfter(p->coef, p->exp);p = p->link;}return C;}Polynomial operator*(Polynomial& A, Polynomial& B){Term *pa, *pb, *pc;int AL, BL, i, k, maxExp;Polynomial C;pc = C.getHead();AL = A.maxOrder();BL = B.maxOrder();if (AL != -1 || BL != -1){maxExp = AL + BL;float *result = new float[maxExp + 1];for (i = 0; i <= maxExp; i++){result[i] = 0.0;}pa = A.getHead()->link;while (pa != NULL){pb = B.getHead()->link;while (pb != NULL){k = pa->exp + pb->exp;result[k] = result[k] + pa->coef*pb->coef;pb = pb->link;}pa = pa->link;}for (i = 0; i <= maxExp; i++){if (fabs(result[i]) > 0.01){pc = pc->InsertAfter(result[i], i);}}delete[] result;}pc->link = NULL;return C;}

main.cpp代码如下:

#include "Polynomal.h"void  main(){Polynomial pl1,pl2,temp;ifstream fin("list.txt");fin >> pl1;cout << pl1;fin.close();ifstream fin1("list2.txt");fin1 >> pl2;cout << pl2;fin1.close();cout << "加法:" << endl;temp = pl1 + pl2;cout << temp;cout << "乘法:" << endl;temp = pl1*pl2;cout << temp;while (1){}}

其中 在根目录下建立两个list.txt 、list2.txt.

list.txt类容如下:5 0 3 2  7 3 2 5  -1 -1(两个数为一组,表示一元多项式的某一项的系数和指数,-1 -1 表示输入停止

list2.txt类容如下:2 1 4 3 9 4 -1 -1(同上)

效果图如下:





0 0
原创粉丝点击