【一元稀疏多项式计算器】

本文介绍了一种基于线性链表实现的一元稀疏多项式运算器,涵盖了多项式的创建、销毁、清空、复制、四则运算、求导、求幂、求定积分等功能,旨在训练指针操作和线性链表处理能力。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 【问题描述】: 设计一个一元稀疏多项式运算器,能实现对一元稀疏多项式的创建、销毁、清空、复制、 四则运算、打印输出、求导、求幂、求定积分等功能。

 【实验目的】 线性表是最简单、最常用的一种数据结构。一元稀疏多项式可以用一个线性链表表示。 指针的概念和使用方法,是程序设计的基本功,同时也是学生学习程序设计时深感困难知识 点。这个问题不解决,直接影响本课程后续内容的学习。本实验的目的在于训练其操作指针的能力,进而掌握线性链表的特性和常用的操作算法。

【基本要求】 要求一元稀疏多项式运算器能实现以下基本功能:(1) 创建多项式   (2) 显示多项式   (3) 销毁多项式   (4) 清空多项式   (5) 复制多项式   (6) 两个稀疏多项式的求和   (7) 两个稀疏多项式的求差   (8) 两个稀疏多项式的求积   (9) 求稀疏多项式的 n 阶导函数 (10)计算稀疏多项式在 x=a 处的值   (11)计算稀疏多项式在区间[a..b]上的定积分   (12)稀疏多项式的 n 次幂 

//一元稀疏多项式计算器
#include<stdio.h>
#include<stdlib.h>
#include<math.h>

typedef struct LNode
{
    float coef;     //系数
    int exp;        //指数
    struct LNode *next;
}LNode, Polynomial;

//创建一个多项式
void create(Polynomial *&L)
{
    int i, n;
    LNode *p;
    printf("请输入该多项式的项数: \n");
    scanf("%d", &n);
    L = (LNode*)malloc(sizeof(LNode));
    L->next = NULL;
    printf("接下来输入系数和指数(空格隔开)\n");
    for (i = 0; i<n; i++)
    {
        p = (LNode *)malloc(sizeof(LNode));
        scanf("%f %d", &p->coef, &p->exp);
        p->next = L->next;
        L->next = p;
    }
}

//将多项式按指数降序排序
void sort(Polynomial *&L)
{
    LNode *r, *p, *q, *u;
    p = L->next;
    L->next = NULL;
    while (p != NULL)
    {
        r = L;
        q = L->next;
        while (q != NULL && (q->exp > p->exp))
        {
            r = q;
            q = q->next;
        }
        u = p->next;
        r->next = p;
        p->next = q;
        p = u;
    }
}
//输入第二个多项式
void insert_next(Polynomial *&L)
{
    printf("请输入第二个多项式: \n");
    create(L);
    sort(L);
}

//选择进行何种操作
void select()
{
    printf("请选择操作方式: \n");
    printf("1.输出多项式\n");
    printf("2.两个多项式相加\n");
    printf("3.两个多项式相减\n");
    printf("4.两个多项式相乘\n");
    printf("5.计算多项式在x=a处的值\n");
    printf("6.求多项式a的导函数\n");
    printf("7,销毁多项式\n");
    printf("8,清空多项式\n");
    printf("9,复制多项式\n");
    printf("10,求多项式在[a,b]上的定积分\n");
    printf("11,求多项的n阶导函数\n");
    printf("12,稀疏多项式的n次幂\n");
}

//显示多项式,不显示x
void display(Polynomial *L)
{
    printf("多项式内容: \n");
    LNode *p = L->next;
    while (p != NULL)
    {
        printf("%f, %d\n", p->coef, p->exp);
        p = p->next;
    }
}

//显示多项式,显示x
void Print(Polynomial *head)
{
    if(head)
    {
        Polynomial *p=head;
        if(p->next)
        {
            p=p->next;
            while(p&&p->next)
            {
                if(!p->coef)
                    p=p->next;
                else if(p->exp>1)
                {
                    if(p->coef!=1&&p->coef>0)
                    {
                        printf("%fx^%d+",p->coef,p->exp);
                        p=p->next;
                    }
                    else if(p->coef!=-1&&p->coef<0)
                    {
                        printf("(%fx^%d)+",p->coef,p->exp);
                        p=p->next;
                    }
                    else if(p->coef==-1)
                    {
                        printf("(-x^%d)+",p->exp);
                        p=p->next;
                    }
                    else
                    {
                        printf("x^%d+",p->exp);
                        p=p->next;
                    }
                }
                else if(p->coef!=1&&p->coef>0)
                {
                    printf("%fx+",p->coef);
                    p=p->next;
                }
                else if(p->coef==-1)
                {
                    printf("(-x)+");
                    p=p->next;
                }
                else if(p->coef!=-1&&p->coef<0)
                {
                    printf("(%fx)+",p->coef);
                    p=p->next;
                }
                else
                {
                    printf("x+");
                    p=p->next;
                }
            }
            if(p->exp)
            {
                if(p->exp==1)
                {
                    if(p->coef!=-1&&p->coef<0)
                        printf("(%fx)",p->coef);
                    else if(p->coef==-1)
                        printf("(-x)");
                    else if(p->coef!=1&&p->coef>0)
                        printf("%fx",p->coef);
                    else
                        printf("x");
                }
                else if(p->coef<0&&p->coef!=-1)
                    printf("(%fx^%d)",p->coef,p->exp);
                else if(p->coef==-1)
                    printf("(-x^%d)",p->exp);
                else if(p->coef!=1&&p->coef>0)
                    printf("%fx^%d",p->coef,p->exp);    
                else
                    printf("x^%d",p->exp);
            }
            else
            {
                if(p->coef>=0)
                    printf("%f",p->coef);
                else if(p->coef<0)
                    printf("(%f)",p->coef);
            }
        }
    }
    else
        printf("多项式无法打印");
}
//多项式相加
void Add(Polynomial *L1, Polynomial *&L2, Polynomial *&L3)
{
    insert_next(L2);
    LNode *p = L1->next;
    LNode *q = L2->next;
    L3 = (LNode *)malloc(sizeof(LNode));
    L3->next = NULL;
    LNode *r = L3;

    while (p != NULL&&q != NULL)
    {
        if (p->exp < q->exp)//p的指数小于q的指数,q先进去
        {
            LNode *u = q->next;
            q->next = r->next;
            r->next = q;
            r = q;
            q = u;
        }
        else if (q->exp < p->exp)//q的指数小于p的指数,p先进去
        {
            LNode *u = p->next;
            p->next = r->next;
            r->next = p;
            r = p;
            p = u;
        }
        else//两指数相等,系数相加
        {
            float temp = p->coef + q->coef;
            if (temp != 0.0)
            {
                LNode *m = (LNode *)malloc(sizeof(LNode));
                m->coef = temp;
                m->exp = p->exp;
                m->next = r->next;
                r->next = m;
                r = m;
            }
            p = p->next;
            q = q->next;
        }
    }
    while (q != NULL)
    {
        LNode *u = q->next;
        q->next = r->next;
        r->next = q;
        r = q;
        q = u;
    }
    while (p != NULL)
    {
        LNode *u = p->next;
        p->next = r->next;
        r->next = p;
        r = p;
        p = u;
    }
    r->next = NULL;
}

//多项式相减
void Subtract(Polynomial *L1, Polynomial *&L2, Polynomial *&L3)
{
    insert_next(L2);
    LNode *p = L1->next;
    LNode *q = L2->next;
    L3 = (LNode *)malloc(sizeof(LNode));
    L3->next = NULL;
    LNode *r = L3;

    while (p != NULL&&q != NULL)
    {
        if (p->exp < q->exp)//p的指数小于q的指数,q先进去,对系数进行更改
        {
            float temp = (-1) * q->coef;
            LNode *m = (LNode *)malloc(sizeof(LNode));
            m->coef = temp;
            m->exp = p->exp;
            r->next = m->next;
            r->next = m;
            r = q;
            q = q->next;
        }
        else if (q->exp < p->exp)//q的指数小于p的指数,p先进去
        {
            LNode *u = p->next;
            r->next = p->next;
            r->next = p;
            r = p;
            p = u;
        }
        else//两指数相等,系数相加
        {
            float temp = p->coef - q->coef;
            if (temp != 0.0)
            {
                LNode *m = (LNode *)malloc(sizeof(LNode));
                m->coef = temp;
                m->exp = p->exp;
                r->next = m->next;
                r->next = m;
                r = m;
            }
            p = p->next;
            q = q->next;
        }
    }
    while (q != NULL)//同理,q中有剩余,则改变符号
    {
        float temp = (-1) * q->coef;
        LNode *m = (LNode *)malloc(sizeof(LNode));
        m->coef = temp;
        m->exp = p->exp;
        r->next = m->next;
        r->next = m;
        r = q;
        q = q->next;
    }
    while (p != NULL)
    {
        LNode *u = p->next;
        r->next = p->next;
        r->next = p;
        r = p;
        p = u;
    }
    r->next = NULL;
}

//多项式相乘
void Multiply(Polynomial *L1, Polynomial *&L2, Polynomial *&L3)
{
   
    LNode *p = L1->next;
    LNode *q = L2->next;
    L3 = (LNode *)malloc(sizeof(LNode));
    L3->next = NULL;
    LNode *r = L3;

    while (p != NULL)
    {
        q = L2->next;
        while (q != NULL)
        {
            int temp_coef = p->coef * q->coef;
            int temp_exp = p->exp + q->exp;
            LNode *m = L3->next;
            while (m != NULL)
            {
                if (m->exp != temp_exp)
                    m = m->next;
                else
                {
                    m->coef += temp_coef;
                    break;
                }
            }
            if (m == NULL)
            {
                LNode *s = (LNode *)malloc(sizeof(LNode));
                s->coef = temp_coef;
                s->exp = temp_exp;
                r->next = s->next;
                r->next = s;
                r = s;
                r->next = NULL;
            }
            q = q->next;
        }
        p = p->next;
    }
    r->next = NULL;
}

//去除系数为空的项
void Del(Polynomial *&L)
{
    LNode *p = L->next;
    LNode *r = L;
    while (p != NULL)
    {
        if (p->coef == 0)
            r->next = p->next;
        r = p;
        p = p->next;
    }
}

//多项式求值
void Evaluate(Polynomial* L)
{
    if(!L->next||!L)
        printf("\n进行运算的多项式不能没有项\n");
    else
    {
        Polynomial *p=L->next;
        float x,val=0;
        printf("请输入未知数的值");
        scanf("%f",&x);
        printf("\n");
        while(p)
        {
            double temp=p->exp;
            val+=p->coef*pow(x,temp);
            p=p->next;
        }
        printf("x=%f时,多项式的值为%f\n",x,val);
    }

}

//多项式求导
void Diff(Polynomial *L1, Polynomial *&L2)
{
    L2 = (LNode *)malloc(sizeof(LNode));
    L2->next = NULL;
    LNode *p = L1->next;
    LNode *r = L2;
    while (p != NULL)
    {
        if (p->exp != 0)
        {
            float coef1 = p->exp * p->coef;
            int exp1 = p->exp - 1;
            LNode *m = (LNode *)malloc(sizeof(LNode));
            m->coef = coef1;
            m->exp = exp1;
            r->next = m->next;
            r->next = m;
            r = m;
        }
        p = p->next;
    }
    r->next = NULL;
}

//销毁稀疏多项式
void Destroy(Polynomial* L){
Polynomial *p,*q;
p=L;
while(p!=NULL)
{
  q=p->next;
  free(p);
  p=q;
}
L=NULL;
}

//清空稀疏多项式
void Clear(Polynomial* L)//多项式链表清空
{
    Polynomial *p;
    p=L->next;
    L->exp=0;
    Destroy(p);
    L->next=NULL;
}

//复制稀疏多项式
void Copy(Polynomial* L,Polynomial* &q) {
    q = (Polynomial*)malloc(sizeof(Polynomial));
    q->next = NULL;
    Polynomial *p = L->next;
    while (p != NULL) {
        LNode *newNode = (LNode*)malloc(sizeof(LNode));
        newNode->coef = p->coef;
        newNode->exp = p->exp;
        newNode->next = q->next;
        q->next = newNode;
        p = p->next;
    }
}

//多项式求导
void Differentiate(Polynomial *L)
{
    LNode *p = L->next;
    LNode *q = NULL;
    while (p != NULL)
    {
        if (p->exp != 0)
        {
            LNode *new_node = (LNode *)malloc(sizeof(LNode));
            new_node->coef = p->coef * p->exp;
            new_node->exp = p->exp - 1;
            new_node->next = NULL;
            if (q == NULL)
            {
                L->next = new_node;
                q = new_node;
            }
            else
            {
                q->next = new_node;
                q = new_node;
            }
        }
        p = p->next;
    }
}
 
//反复调用求导的函数求高阶导
void Derivation(Polynomial* head)
{
    int n,i;
    printf("请输入求导阶数\n");
    scanf("%d",&n);
    Polynomial* node=head;
    for(i=0;i<n;i++){
        Differentiate(node);
    }
    Print(node);
}

//求多项式的n次幂
void Power(Polynomial *L, int n) {
    Polynomial *result = (Polynomial *)malloc(sizeof(Polynomial));
    result->next = NULL;
    Polynomial *temp = (Polynomial *)malloc(sizeof(Polynomial));
    temp->next = NULL;
    printf("请输入n的值\n");
    scanf("%d",&n);
    result = L;
    for (int i = 1; i < n; i++) {
        Multiply(result, L, temp);
        result = temp;
    }  
    LNode *p = result->next;
    while (p != NULL) {
       p=p->next;
       Print(result);
    }  
}

//求定积分
void Integrate(Polynomial *L, float a, float b)
{
    printf("请输入a,b的值\n");
    scanf("%f %f",&a,&b);
    LNode *p = L->next;
    float val = 0;
    while (p)
    {
        val += (p->coef / (p->exp + 1)) * pow(b, p->exp + 1) - (p->coef / (p->exp + 1)) * pow(a, p->exp + 1);
        p = p->next;
    }
    printf("积分的值为%.3f\n",val);
}

int main()
{
    int sign;
    Polynomial *La = NULL, *Lb = NULL, *Lc = NULL, *Ld=NULL;

    printf("请输入多项式一: \n");
    create(La);
    sort(La);
    int k=0;
    while(k<15){
    select();
    scanf("%d", &sign);
    switch (sign)
    {
    case 1:
        Print(La);
        break;
    case 2:
        Add(La, Lb, Lc);
        printf("多项式的和为: \n");
        Print(Lc);
        break;
    case 3:
        Subtract(La, Lb, Lc);
        printf("多项式的差为: \n");
        Print(Lc);
        break;
    case 4:
        insert_next(Lb);
        Multiply(La, Lb, Lc);
        Del(Lc);            //删去系数为0的项
        sort(Lc);
        Print(Lc);
        break;
    case 5:
        Evaluate(La);
        break;
    case 6:
        Diff(La, Lb);
        sort(Lb);
        Print(Lb);
        break;
    case 7:
        Destroy(La);
        printf("已销毁\n");
        break;
    case 8:
        Clear(La);
        printf("已清空");
        break;
    case 9:
        Copy(La,Lb);
        Print(Lb);
        break;
    case 10:
        int a,b;
        Integrate(La,a,b);
        break;
    case 11:
        Derivation(La);
        Print(La);
        break;
    case 12:
        int n;
        Power(La,n);
        break;
    }
    printf("\n");
    system("pause");
    k++;
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值