代码改变世界

数据结构学习的简单问题(三):用链表实现多项式相加

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;

}

运行结果: