数据结构:一元多项式计算器

这个我也是借鉴网上的,加了一些自己的理解,改了一些小东西,感觉还是菜逼,还有这个程序还是有bug,感觉原作者的bug更多,算啦,原作者写的挺好的,这要是不用这鬼指针写多好,指针真的烦

以下的加了一些我理解代码的注释,希望能帮助理解

输入的第一个多项式为:2x^3-4x^5

输入的第二个多项式为:4x^4+4x^5

#include <stdio.h>
#include <stdlib.h>
typedef struct polynomial
{
    float coef;//系数
    int expn;//指数
    struct polynomial *next;
} polynomial;

void CreatePolyn(polynomial **p, int m) //p为一个二级指针,
{
    int i, data;
    int flag;
    polynomial *cp, *temp;
    (*p) = (polynomial *)malloc(sizeof(polynomial));
    (*p)->coef = 0.0;
    (*p)->expn = -1;
    (*p)->next = NULL;
    for(i=1; i<=m; ++i)
    {
        cp = *p;//初始位置
        flag = 0; //标志多项式中是否已经存在相同指数的多项式
        temp = (polynomial *)malloc(sizeof(polynomial));
        printf("请输入第%d项的系数:", i);
        scanf("%f", &(temp->coef));
        printf("请输入第%d项的指数:", i);
        scanf("%d", &(temp->expn));
        while(cp->next && temp->expn > cp->next->expn)
        {
            cp = cp->next;
        }
        //相当于弄出一个指数递增的多项式
        if(cp->next && temp->expn == cp->next->expn)
        {
            continue;// 如果已经存在相同指数的多项式,忽略该项
        }
        temp->next = cp->next;
        cp->next = temp;
    }
}

// 打印多项式
void PrintPolyn(polynomial *p)
{
    polynomial *temp = p->next;
    int a[100000];
    double b[100000];
    int aid=0,bid=0;
    int cnt=0;
    printf("升幂情况:");
    while(temp)
    {
        if(cnt!=0&&temp->coef>0)printf("+");
        b[bid]=temp->coef;
        a[aid]=  temp->expn;
        printf("%.2fx^%d ", b[bid], a[aid]);
        aid++;
        bid++;
        cnt++;
        temp = temp->next;
    }
    if(cnt==0)printf("0");//如果是空的输出0
    printf("\n");
    printf("降幂情况:");
    int ans=0;
    for(int i=aid-1; i>=0; i--)
    {
        if(ans!=0&&b[i]>0)printf("+");
        printf("%.2fx^%d ", b[i], a[i]);
        ans++;
    }
}
// 多项式加法
void AddPolyn(polynomial **pa, polynomial **pb)
{
    polynomial *cpa, *cpb, *temp, *ccpa, *p = (*pa);
    //用*p = (*pa),直接在pa上面进行修改
    cpa = (*pa)->next;
    cpb = (*pb)->next;
    //这下面基本就是一个合并的过程,之前链表有练习有个合并的
    while(cpa && cpb)
    {
        if(cpa->expn < cpb->expn)
        {
            p->next = cpa;
            p = cpa;
            cpa = cpa->next;
        }
        else if(cpa->expn > cpb->expn)
        {
            p->next = cpb;
            p = cpb;
            cpb = cpb->next;
        }
        else
        {
            if(cpa->coef + cpb->coef == 0)
            {
                cpa = cpa->next;
                cpb = cpb->next;

            }
            else
            {
                cpa->coef += cpb->coef;
                p->next = cpa;
                p = cpa;
                cpa = cpa->next;
                cpb = cpb->next;
            }
        }
    }
    if(cpa)
        p->next = cpa;
    else
        p->next = cpb;
    free(*pb);
}
// 多项式减法
void SubtractPolyn(polynomial **pa, polynomial **pb)
{
    polynomial *cpa, *cpb, *temp, *ccpa, *p = (*pa);
    cpa = (*pa)->next;
    cpb = (*pb)->next;
    while(cpa && cpb)
    {
        if(cpa->expn < cpb->expn)
        {
            p->next = cpa;
            p = cpa;
            cpa = cpa->next;
        }
        else if(cpa->expn > cpb->expn)
        {
            p->next = cpb;
            p = cpb;
            p->coef *= -1; // 改变系数的符号,将减数多项式的系数变为负的
            cpb = cpb->next;
        }
        else     // cpa->expn == cpb->expn 指数相等
        {
            if(cpa->coef == cpb->coef)  //如果两项系数相等,删除该节点
            {
                cpa = cpa->next;
                cpb = cpb->next;

            }
            else
            {
                cpa->coef -= cpb->coef;
                p->next = cpa;
                p = cpa;
                cpa = cpa->next;
                cpb = cpb->next;
            }
        }
    }
    // 注意:cpa和cpb不是互斥关系,需分开两个if分支,但最多只有一个分支执行,可能同时不执行
    if(cpa)
        p->next = cpa;
    if(cpb)
    {
        p->next = cpb;
        while(cpb)
        {
            cpb->coef *= -1; // 改变系数的符号,将减数多项式的系数变为负的
            cpb = cpb->next;
        }
    }
    free(*pb);
}
//将pb中的多项式复制到pa中
void CopyPolyn(polynomial **pa, polynomial *pb)
{
    CreatePolyn(pa, 0);
    polynomial *temp, *cpa;
    cpa = *pa;
    pb = pb->next; // 移动指针指向第一个节点
    while(pb)
    {
        temp = (polynomial *)malloc(sizeof(polynomial));
        temp->coef = pb->coef;
        temp->expn = pb->expn;
        temp->next = NULL;
        cpa->next = temp;
        cpa = temp;
        pb = pb->next;
    }
}

//pa为多项式。pb为单项式,与pa中的每一项相乘,结果保存到pa中
void MultiplyOperate(polynomial *pa, polynomial *pb)
{
    pa = pa->next;
    while(pa)
    {
        pa->coef *= pb->coef;
        pa->expn += pb->expn;
        pa = pa->next;
    }
}
// 多项式乘法
void MultiplyPolyn(polynomial **pa, polynomial **pb)
{
    // pa应该在此过程中保持不变,直到得到最后的结果
    polynomial *cpa, *ccpa, *res;
    cpa = *pa; //保存着原pa的内容
    CreatePolyn(pa, 0); //从新初始化pa为头结点
    (*pb) = (*pb)->next;
    while(*pb)
    {
        CopyPolyn(&ccpa, cpa);//将cpa(内容是pa)复制到ccpa
        MultiplyOperate(ccpa, *pb);//将ccpa分别与pb其中一项相乘
        AddPolyn(pa, &ccpa);//将结果加入到pa中
        (*pb) = (*pb)->next;
    }

}

int main()
{
    printf("--------欢迎来到一元多项式计算器--------\n");
    polynomial *pa, *pb;
    int n,m;
    printf("++++++++请输入第一个多项式的项数:++++++++\n");
    scanf("%d",&n);
    CreatePolyn(&pa, n);
    printf("++++++++请输入第二个多项式的项数:++++++++\n");
    scanf("%d",&m);
    CreatePolyn(&pb, m);
    printf("请选择两个多项是计算的方式\n");
    printf("********************************\n");
    int choose;
    printf("1:相加   2:相减  3:相乘\n");
    printf("********************************\n");
    printf("请输入:");
    scanf("%d",&choose);
    if(choose==1)
        AddPolyn(&pa,&pb);
    else if(choose==2)
        SubtractPolyn(&pa, &pb);
    else
        MultiplyPolyn(&pa, &pb);
    printf("计算结果如下:\n");
    PrintPolyn(pa);
    printf("\n");
    return 0;
}
原创文章 96 获赞 28 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_43813140/article/details/105672663