数据结构学习的简单问题(三):用链表实现多项式相加
2013-04-11 01:51 liuzq2013 阅读(341) 评论(0) 收藏 举报头文件:polynomial.h
#include <iostream> using namespace std; struct 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& );//将输出符适用于多项式结点 }; class Polynomial {//多项式类的定义 public: Polynomial() { first = new Term(0, -1); }//构造函数 //Polynomial ( Polynomial& R);//复制构造函数 int maxOrder()//计算最大阶数 { Term* cur=first;if(cur==NULL) {return -1;} while(cur->link!=NULL){ cur=cur->link;} return cur->exp; } Term* getHead() {return first;}//取表头指针 private: Term *first; friend ostream& operator << (ostream&, const Polynomial& ); friend istream& operator >> ( istream&, Polynomial& ); friend void Add ( Polynomial& A, Polynomial& B,Polynomial& C ); //friend void Mul ( Polynomial& A, Polynomial& B,Polynomial& C ); }; Term *Term::InsertAfter ( float c, int e ) {//在调用此函数的对象(this指针所指项)后插入一个新项 link = new Term (c, e, link);//同时完成多项操作//创建一个新结点,自动链接 return link;//插入到this结点后面 }; ostream& operator << (ostream& out, const Term& x) {//Term的友元函数:输出一个项x的内容到输出流对象out中去。 if (x.coef == 0.0) return out;//零系数项不输出 out << x.coef;//输出系数 switch (x.exp) {//输出指数 case 0: break;//指数为0,不出现‘X’ case 1: out << "X";break;//在系数后输出‘X’ default: out << "X^" << x.exp;break;//否则 } return out; }; istream& operator >> (istream& in, Polynomial& x) {//Polynomial类的友元函数:从输入流 in 输入各项,用尾插法建立一个多项式。 Term* rear = x.getHead(); int c, e;//rear是尾指针 while (1) { cout << "Input a term(coef, exp):" << endl; in >> c >> e;//输入项的系数c和指数e if ( e < 0 ) break;//用e < 0控制输入结束 rear = rear->InsertAfter(c, e);//链接到rear后 } return in; }; ostream& operator << (ostream& out, Polynomial& x) {//Polynomial类的友元函数:输出带头结点的多项式链表x。 Term *current = x.getHead() ->link; cout << "The polynomial is: " << endl; bool h = true;//调用Term的重载操作”<<” while (current != NULL) {//逐项输出 if (h == false && current -> coef > 0.0) out << "+" ;//A small trick!! h = false ; out << *current;//调用Term的重载操作”<<” current = current->link; } out << endl; return out; }; void Add(Polynomial& A, Polynomial& B,Polynomial& C) {//友元函数:给定两个带表头结点的按升幂排列//的多项式链表, 返回的是结果多项式链表 C. Term *pa, *pb, *pc, *p; float temp; pc = C.getHead();//结果链尾指针,初始为(0,-1,NULL) pa = A.getHead()->link;//A链检测指针 pb = B.getHead()->link;//B链检测指针 while (pa != NULL && pb != NULL) if (pa->exp == pb->exp) {//对应项指数相等 temp = pa->coef + pb->coef; pc = pc->InsertAfter(temp, pa->exp); pa = pa->link; pb = pb->link; } else if (pa->exp < pb->exp) {//pa指数小 pc = pc->InsertAfter(pa->coef, pa->exp); pa = pa->link;} else {//pb指数小 pc = pc->InsertAfter(pb->coef, pb->exp); pb = pb->link; } p = (pa != NULL)? pa : pb;//p指示剩余链,此时pa 和pb两者中至少有一个为NULL while (p != NULL) { pc = pc->InsertAfter(p->coef, p->exp); p = p->link; } };
测试程序:
#include <iostream> #include "polynomial.h" using namespace std; int main() { Polynomial h1,h2,h3; cin>>h1; cin>>h2; cout<<h1; cout<<h2; Add(h1,h2,h3); cout<<h3; }
运行结果:
浙公网安备 33010602011771号