一元稀疏多项式的计算

1.1[问题描述]

     能够按照指数降序排列建立并输出多项式;能够完成两个多项式的相加、相减,并将结果输出;

1.2[实现提示]

    以链式存储结构实现多项式。

代码

#include<cstdio>
#include<iostream>
#include<cstdlib>
using namespace std;

typedef struct PNode
{
    float coef;
    int expn;
    struct PNode *next;
}PNode,*Polynomial;

void CreatePolyn(Polynomial &p1,Polynomial &p2){
    printf("请输入多项式的项数:\n");
    int n;
    Polynomial s1,pre1,q1,s2,pre2,q2;
    scanf("%d",&n);
    p1=new PNode;
    p2=new PNode;
    p1->next=NULL;
    p2->next=NULL;
    for(int i=1;i<=n;i++){
        s1=new PNode;
        s2=new PNode;
        cin>>s1->coef>>s1->expn;
        s2->coef=s1->coef;s2->expn=s1->expn;
        pre1=p1;
        pre2=p2;
        q1=p1->next;
        q2=p2->next;
        while(q1&&q1->expn>s1->expn){
            pre1=q1;
            q1=q1->next;
        }
        s1->next=q1;
        pre1->next=s1;
        while(q2&&q2->expn>s2->expn){
            pre2=q2;
            q2=q2->next;
        }
        s2->next=q2;
        pre2->next=s2;
    }
}

void Build(Polynomial &pa,Polynomial &pb,Polynomial &pc,Polynomial &pd){
    CreatePolyn(pa,pc);
    CreatePolyn(pb,pd);
    printf("建立成功!\n\n");
    system("Pause");
    system("cls");
}

void Addpolyn(Polynomial pa,Polynomial pb){
    Polynomial p1,p2,p3,i;
    p1=pa->next;p2=pb->next;p3=pa;
    while(p1&&p2){
        if(p1->expn==p2->expn){
            Polynomial r;
            int sum=p1->coef+p2->coef;
            if(sum!=0){
                p1->coef=sum;
                p3->next=p1;
                p3=p1;
                p1=p1->next;
                r=p2;p2=p2->next;
                delete r;
            }
            else{
                r=p1;p1=p1->next;delete r;
                r=p2;p2=p2->next;delete r;
            }
        }
        else if(p1->expn<p2->expn){
            p3->next=p2;
            p3=p2;
            p2=p2->next;
        }
        else{
            p3->next=p1;
            p3=p1;
            p1=p1->next;
        }
    }
    p3->next=p1?p1:p2;
    printf("相加后的多项式为:\n");
    i=pa->next;
    while(i!=NULL){
        printf("%.1fx%d  ",i->coef,i->expn);
        i=i->next;
    }
    printf("\n");
    system("Pause");
    system("cls");
}

void Subpolyn(Polynomial pc,Polynomial pd){
    Polynomial p1,p2,p3,i,j;
    p1=pc->next;p2=pd->next;p3=pc;
    j=pd->next;
    while(j!=NULL){
        j->coef=-(j->coef);
        j=j->next;
    }
    while(p1&&p2){
        if(p1->expn==p2->expn){
            Polynomial r;
            int sum=p1->coef+p2->coef;
            if(sum!=0){
                p1->coef=sum;
                p3->next=p1;
                p3=p1;
                p1=p1->next;
                r=p2;p2=p2->next;
                delete r;
            }
            else{
                r=p1;p1=p1->next;delete r;
                r=p2;p2=p2->next;delete r;
            }
        }
        else if(p1->expn<p2->expn){
            p3->next=p2;
            p3=p2;
            p2=p2->next;
        }
        else{
            p3->next=p1;
            p3=p1;
            p1=p1->next;
        }
    }
    p3->next=p1?p1:p2;
    printf("相减后的多项式为:\n");
    i=pc->next;
    while(i!=NULL){
        printf("%.1fx%d  ",i->coef,i->expn);
        i=i->next;
    }
    printf("\n");
    system("Pause");
    system("cls");
}

void Display(Polynomial pa,Polynomial pb){
    Polynomial i,j;
    printf("以下是按指数降序建立的多项式:\n");
    printf("多项式一:\n");
    i=pa->next;
    while(i!=NULL){
        printf("%.1fx%d  ",i->coef,i->expn);
        i=i->next;
    }
    printf("\n");
    printf("多项式二:\n");
    j=pb->next;
    while(j!=NULL){
        printf("%.1fx%d  ",j->coef,j->expn);
        j=j->next;
    }
    printf("\n");
    system("Pause");
    system("cls");
}

int main()
{
    Polynomial pa,pb,pc,pd;
    while(1){
        printf("----------多项式运算----------\n\n");
        printf("     1.建立多项式.\n");
        printf("     2.输出多项式.\n");
        printf("     3.多项式加法.\n");
        printf("     4.多项式减法.\n");
        printf("     5.退出.\n");
        printf("------------------------------\n\n");
        printf("请输入您的选择:\n");
        int a;
        scanf("%d",&a);
        if(a==5){
            printf("-----------\n");
            printf("谢谢使用!\n");
            printf("-----------\n");
            break;
        }
        if(a!=1&&a!=2&&a!=3&&a!=4&&a!=5){
            printf("您输入的不符合要求,请重新输入!\n");
            continue;
        }
        switch(a){
            case 1:Build(pa,pb,pc,pd);break;
            case 2:Display(pa,pb);break;
            case 3:Addpolyn(pa,pb);break;
            case 4:Subpolyn(pc,pd);break;
        }
    }
    return 0;
}

/*
4

1 1
-4.4 2
6 4
-5 3

5

2 1
3.4 4
-5 3
7 5
-3 2
*/

猜你喜欢

转载自blog.csdn.net/Krismile_/article/details/86248589