码迷,mamicode.com
首页 > 其他好文 > 详细

线性表在一元多项式运算中的应用

时间:2016-04-08 19:40:43      阅读:206      评论:0      收藏:0      [点我收藏+]

标签:

实验题1-1 多项式运算

【问题描述】有两个指数递减的一元多项式,写一程序先求这两个多项式的和,再求它们的积。

【提示】 用带表头结点的单链表作为多项式的存储表示;要建立两个单链表;多项式相加就是要把一个单链表中的结点插入到另一个单链表中去,要注意插入、删除操作中指针的正确修改。

 

#include <iostream>
using namespace std;

int k = 1;
typedef struct {
    float coef;  //系数
    int expn;   //指数
}term;

struct LNode{
    term data;
    struct LNode *next;
};

typedef struct LNode* Polynomial;

//合并同类项
Polynomial MergePolyn(Polynomial P)
{
    Polynomial p = NULL,q = NULL,r = NULL,Q = NULL;
    if(P == NULL||P->next == NULL){
        return NULL;
    }
    else{
        for(p = P->next;p!=NULL;p=p->next)
            for(q = p->next,r = p;q!=NULL;){
                if(p->data.expn == q->data.expn){
                    p->data.coef+=q->data.coef;
                    Q = q;
                    r->next = q->next;
                    q = r->next;//?至关重要
                    delete Q;
                }
                else
                    r=r->next,q = q->next;
            }
        return P;
    }
}

//1.创建一个一元多项式
Polynomial CreatePolyn(int m)
{
    if(m>=0){
        Polynomial head = new LNode;
        head->next = NULL;
        Polynomial s,r = head;
        for(int i=0;i<m;i++){
            cout<<"第"<<i+1<<"项的系数和指数是:";
            float c;
            int e;
            cin>>c>>e;
            s = new LNode;
            s->next = NULL;
            s->data.coef = c;
            s->data.expn = e;
            r->next = s;
            r = r->next;
        }
        r->next = NULL;
        return head;
    }
    else{
        cout<<"输入m值非法,创建多项式失败\n";
        k = 0;
        return NULL;
    }
}

//2.两个一元多项式相加
Polynomial AddPolyn(const Polynomial pa,const Polynomial pb)
{
    if(pa&&pa->next&&pb&&pb->next){
        Polynomial head = new LNode;
        Polynomial s = pa->next,t = pb->next,r = head;
        r->next = NULL;
        while(s!=NULL){
            Polynomial n = new LNode;
            n->next = NULL;
            n->data.coef = s->data.coef;
            n->data.expn = s->data.expn;
            r->next = n;
            r = r->next;
            s = s->next;
        }
        while(t!=NULL){
            Polynomial n = new LNode;
            n->next = NULL;
            n->data.coef = t->data.coef;
            n->data.expn = t->data.expn;
            r->next = n;
            r = r->next;
            t = t->next;
        }
        r->next = NULL;
        head = MergePolyn(head);
        return head;

    }
    else if((pa == NULL||pa->next == NULL)&&(pb!=NULL&&pb->next!=NULL))
        return pb;
    else if((pb == NULL||pb->next == NULL)&&(pa!=NULL&&pa->next!=NULL))
        return pa;
    else
        return NULL;
}

//3.两个一元多项式相乘
Polynomial MultiplyPolyn(const Polynomial pa,const Polynomial pb)
{
   if(pa==NULL||pa->next==NULL||pb==NULL||pb->next==NULL)
        return NULL;
    else{
        Polynomial head = new LNode;
        head->next = NULL;
        Polynomial p,q,r,s = head;
        for(p = pa->next;p!=NULL;p=p->next)
            for(q = pb->next;q!=NULL;q=q->next){
                r = new LNode;
                r->data.coef = p->data.coef * q->data.coef;
                r->data.expn = p->data.expn + q->data.expn;
                r->next = NULL;//千万记住将new的结点指针域置空
                s->next = r;
                s = s->next;
            }
        s->next = NULL;
        head = MergePolyn(head);
        return head;
    }
}

//打印多项式
void PrintPolyn(Polynomial P)
{
    if(P==NULL||P->next==NULL){
        cout<<"无项\n";
    }
    else{
        cout<<"Y=";
        int iszero = 1;
        Polynomial p = NULL,q = NULL;
        p = P->next;
        if(p->data.coef&&p->data.coef!=1&&p->data.coef!=-1&&p->data.expn&&p->data.expn!=1)
            {cout<<p->data.coef<<"X^"<<p->data.expn;iszero = 0;}
        else if(p->data.coef&&p->data.coef!=1&&p->data.coef!=-1&&p->data.expn==1)
            {cout<<p->data.coef<<"X";iszero = 0;}
        else if(p->data.coef&&p->data.coef!=1&&p->data.coef!=-1&&p->data.expn==0)
            {cout<<p->data.coef;iszero = 0;}
        else if(p->data.coef==1&&p->data.expn&&p->data.expn!=1)
            {cout<<"X^"<<p->data.expn;iszero = 0;}
        else if(p->data.coef==1&&p->data.expn==1)
            {cout<<"X";iszero = 0;}
        else if(p->data.coef==1&&p->data.expn==0)
            {cout<<"1";iszero = 0;}
        else if(p->data.coef==-1&&p->data.expn&&p->data.expn!=1)
            {cout<<"-X^"<<p->data.expn;iszero = 0;}
        else if(p->data.coef==-1&&p->data.expn==1)
            {cout<<"-X";iszero = 0;}
        else if(p->data.coef==-1&&p->data.expn==0)
            {cout<<"-1";iszero = 0;}
        else if(p->data.coef==0)
            ;
        else
            {cout<<p->data.coef<<"X^"<<p->data.expn;iszero = 0;}
        if(p->next)
            q = p->next;
        while(q){
            if(q->data.coef>0&&q->data.coef!=1&&q->data.expn&&q->data.expn!=1)
                {cout<<"+"<<q->data.coef<<"X^"<<q->data.expn;iszero = 0;}
            else if(q->data.coef>0&&q->data.expn==0)
                {cout<<"+"<<q->data.coef;iszero = 0;}
            else if(q->data.coef>0&&q->data.coef!=1&&q->data.expn==1)
                {cout<<"+"<<q->data.coef<<"X";iszero = 0;}
            else if(q->data.coef==1&&q->data.expn&&q->data.expn!=1)
                {cout<<"+"<<"X^"<<q->data.expn;iszero = 0;}
            else if(q->data.coef==1&&q->data.expn==1)
                {cout<<"+"<<"X";iszero = 0;}
            else if(q->data.coef==1&&q->data.expn==0)
                {cout<<"1";iszero = 0;}
            else if(q->data.coef<0&&q->data.coef!=-1&&q->data.expn==1)
                {cout<<q->data.coef<<"X";iszero = 0;}
            else if(q->data.coef==-1&&q->data.expn&&q->data.expn!=1)
                {cout<<"-X^"<<q->data.expn;iszero = 0;}
            else if(q->data.coef==-1&&q->data.expn==1)
                {cout<<"-X";iszero = 0;}
            else if(q->data.coef==-1&&q->data.expn==0)
                {cout<<"-1";iszero = 0;}
            else if(q->data.coef==0)
                ;
            else
                {cout<<q->data.coef<<"X^"<<q->data.expn;iszero = 0;}
            q=q->next;
        }
        if(iszero)
            cout<<"0";
        cout<<endl;
    }
}



int main()
{
    Polynomial pa = NULL,pb = NULL,P = NULL,Q = NULL,R = NULL,T = NULL;
    do{
        cout<<"1.创建两个一元多项式"<<endl;
        cout<<"2.两个一元多项式相加得一新多项式"<<endl;
        cout<<"3.两个一元多项式相乘得一新多项式"<<endl;
        cout<<"请选择:";
        int n,m;
        cin >> n;
        switch(n)
        {
            case 1:
                cout<<"请输入第一个多项式的项数:";
                cin>>m;
                P = CreatePolyn(m);
                pa = MergePolyn(P);
                PrintPolyn(pa);
                cout<<"请输入第二个多项式的项数:";
                cin>>m;
                Q = CreatePolyn(m);
                pb = MergePolyn(Q);
                PrintPolyn(pb);
                break;
            case 2:
                R = AddPolyn(pa,pb);
                PrintPolyn(R);
                break;
            case 3:
                T = MultiplyPolyn(pa,pb);
                PrintPolyn(T);
                break;
            default:
                k = 0;
                cout<<"输入了无效字符\n";
                break;
        }
    }while(k);
    return 0;
}

 注意点:不能随意修改pa,pb的值,两多项式的加法运算与乘法运算应该互不干扰,尤其注意在多项式加法中不能采用两链表合为一个链表的算法(会改变pa的链表)。

P.S 对每一个new的结点的指针域要置空,同理,对每一个delete后的悬垂指针也应置空,否则后面的程序使用的时候以为还是没释放的对象, 访问就会出错。

线性表在一元多项式运算中的应用

标签:

原文地址:http://www.cnblogs.com/socrates-lzstu/p/5369322.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!