线性表的应用——多项式的计算

应用顺序表计算多项式,把多项式存储在顺序表里,顺序表的下标对应多项式的系数
这里写图片描述

#include <stdio.h>
#include <stdlib.h>
#define MAX_SIZE 100
#define OK 1
#define ERROR -1
typedef int Status;
typedef int Elemtype;

多项式的结构体

typedef struct polynomial
{
    float coef;//系数
    int expn;//指数
}Polyn;

顺序表的的结构体

typedef struct SqList
{
    Polyn *array;
    int length;
}SqList;

顺序线性表初始化

Status Init_SqList(SqList *L)
{
    L->array=(Polyn *)malloc(MAX_SIZE * sizeof(Polyn)) ;
    if(!L->array)
        return ERROR;
    else
    {
        L->length = 0;
        return OK;
    }
}

创建一个多项式

void CreatPolyn(SqList *L)
{
    int i;//循环变量
    int m;//多项式的项数
    SqList *q;
    q = L;

    printf("请输入多项式数:");
    scanf("%d", &m);

    if(m <= 0 || m > MAX_SIZE)
    {
        printf("Item unsecification!\n");
    }

    for(i = 0; i < m; i++)
    {
        float c;//多项式的系数
        printf("请输入%d次项的系数:", i);
        scanf("%f", &c);
        q->array[i].coef = c;
        q->array[i].expn = i;//顺序表达下表和指数是相同的,所以把下标赋给指数
        q->length++;
    }
    if(q->length == m)
        printf("创建成功\n");
}

求多项式的项数

Status PolynLength(SqList *L)
{
    int length = 0;
    int i;
    SqList *p;

    p = L;

    for(i = 0; i < p->length; i++)
    {
        length++;
    }

    return length;
}

多项式相加

Status AddPolyn(SqList *L1, SqList *L2, SqList *L3)
{   //L1+L2=L3
    int i;//循环变量
    SqList *p;
    SqList *q;
    SqList *r;

    p = L1;
    q = L2;
    r = L3;

    //若L1和L2不一样长,先把前面的部分相加
    for(i = 0; i < p->length && i < q->length; i++)
    {
        r->array[i].coef = p->array[i].coef + q->array[i].coef;
        r->array[i].expn = p->array[i].expn;
        r->length++;
    }
    //把长的直接加在L3后面
    if((i == p->length) && (i != q->length))
    {
        int j;

        for(j = i; j < q->length; j++)
        {
            r->array[j].coef = q->array[j].coef;
            r->array[j].expn = q->array[j].expn;
            r->length++;
        }
    }
    else if((i != p->length) && (i == q->length))
    {
        int j;

        for(j = i; j < p->length; j++)
        {
            r->array[j].coef = p->array[j].coef;
            r->array[j].expn = p->array[j].expn;
            r->length++;
        }
    }

    printf("项数为:%d\n", r->length);

    return OK;
}

两个多项式(L1-L2)相减

Status SubractPolyn(SqList *L1, SqList *L2, SqList *L3)
{
    int i;//循环变量
    SqList *p;
    SqList *q;
    SqList *r;

    p = L1;
    q = L2;
    r = L3;
    //若L1和L2不一样长,先把前面的部分相减
    for(i = 0; i < p->length && i < q->length; i++)
    {
        r->array[i].coef = p->array[i].coef - q->array[i].coef;
        r->array[i].expn = p->array[i].expn;
        r->length++;
    }
    //两个多项式不一样长
    //若被减数多项式长,则把剩下的直接加在L3后面
    //若减数多项式长,则把剩下的变成负的加在L3后面
    if((i == p->length) && (i != q->length))
    {
        int j;

        for(j = i; j < q->length; j++)
        {
            r->array[j].coef = -(q->array[j].coef);
            r->array[j].expn = q->array[j].expn;
            r->length++;
        }
    }
    else if((i != p->length) && (i == q->length))
    {
        int j;

        for(j = i; j < p->length; j++)
        {
            r->array[j].coef = p->array[j].coef;
            r->array[j].expn = p->array[j].expn;
            r->length++;
        }
    }

    return OK;
}

两个多项式相乘

Status MultiplyPolyn(SqList *L1, SqList *L2, SqList *L4)
{   //L1*L2 = L4
    int i;
    int j;
    SqList *p;
    SqList *q;
    SqList *r;

    p = L1;
    q = L2;

    //根据L1和L2相乘后的项数给L4申请空间
    //若L1有n项  L2有m项   则L4有(n-1)+(m-1)+ 1项
    L4->array=(Polyn *)malloc(((p->length - 1) + (q->length - 1) + 1) * sizeof(Polyn)) ;
    if(!L4->array)
        printf("初始化失败!\n");
    else
    {
        //L4的长度为:(n-1)+(m-1)+ 1
        L4->length = (p->length - 1) + (q->length - 1) + 1;
        printf("初始化成功!\n");
        printf("长度为:%d\n", L4->length);
    }

    r = L4;
    //先把L4所有的系数和指数赋为0
    for(i = 0; i < L4->length; i++)
    {
        r->array[i].coef = 0;
        r->array[i].expn = 0;
    }
    //系数相乘,指数相加,在和计算出来的位置上原有的系数相加  
    for(i = 0; i < p->length; i++)
    {
        for(j = 0; j < q->length; j++)
        {
            int a = p->array[i].expn + q->array[j].expn;
            r->array[a].expn = a;
            r->array[a].coef = p->array[i].coef * q->array[j].coef + r->array[a].coef;
        }
    }

    return OK;
}

打印多项式

void OutPut(SqList *L)//打印多项式
{
    SqList *q;
    int i;
    int j;

    q = L;

    printf("P = ");
    for(i = 0; i < q->length; i++)
    {
        if(i == 0)//若是常数项
        {
            if(!q->array[i].coef == 0)//不为0,打印
            {
                printf("%f", q->array[i].coef);
                for(j = i + 1; j < q->length; j++)
                {
                    if((q->array[j].coef != 0) && (q->array[j].coef > 0))
                    {
                        printf(" + ");
                        break;
                    }
                    else if((q->array[j].coef != 0) && (q->array[j].coef < 0))
                    {
                        printf(" ");
                        break;
                    }
                }
            }
        }
        else//若不是常数项
        {
            if(!q->array[i].coef == 0)//系数不为0 打印
            {
                printf("%fX^", q->array[i].coef);
                printf("%d", q->array[i].expn);
                for(j = i + 1; j < q->length; j++)
                {
                    if((q->array[j].coef != 0) && (q->array[j].coef > 0))
                    {
                        printf(" + ");
                        break;
                    }
                    else if((q->array[j].coef != 0) && (q->array[j].coef < 0))
                    {
                        printf(" ");
                        break;
                    }
                }
            }
        }
    }
    printf("\n");
}

主方法

int main()
{
    int i;
    int res1 = 0;//L1初始化返回结果
    int res2 = 0;//L2初始化返回结果
    int res3 = 0;//L3初始化返回结果
    int res4 = 0;//L4初始化返回结果
    int res5 = 0;//L1+L2返回的结果
    int res6 = 0;//L1-L2的结果
    int res7 = 0;//L1*L2的结果
    SqList L1;//第一个多项式
    SqList L2;//第二个多项式
    SqList L3;//相加后的多项式
    SqList L4;//相减后的多项式
    SqList L5;//L1*L2后的多项式

    res1 = Init_SqList(&L1);//初始化L1
    res2 = Init_SqList(&L2);//初始化L2
    res3 = Init_SqList(&L3);//初始化L3
    res4 = Init_SqList(&L4);//初始化L4
    printf("%4d%4d%4d%4d\n", res1, res2, res3, res4);

    CreatPolyn(&L1);//创建多项式L1
    OutPut(&L1);//打印多项式L1

    printf("--------------------------------\n");

    CreatPolyn(&L2);//创建多项式L2
    OutPut(&L2);//打印多项式L2

    printf("*******************************\n");
    printf("L1为:");
    OutPut(&L1);
    printf("\n");
    printf("L2为:");
    OutPut(&L2);
    printf("\n");

    printf("************L1+L2后************\n");//多项式L1+L2赋值给L3
    printf("\n");
    res5 = AddPolyn(&L1, &L2, &L3);
    OutPut(&L3);
    printf("\n");
    printf("%d\n", res5);
    printf("\n");

    printf("************L1-L2后************\n");
    printf("\n");
    res6 = SubractPolyn(&L1, &L2, &L4);
    OutPut(&L4);
    printf("\n");
    printf("%d\n", res6);
    printf("\n");

    printf("************L1*L2后************\n");
    printf("\n");
    res7 = MultiplyPolyn(&L1, &L2, &L5);

    for(i = 0; i < L5.length; i++)
    {
        printf("系数:%4f | 指数:%4d\n", L5.array[i].coef, L5.array[i].expn);
    }

    OutPut(&L5);
    printf("\n");
    printf("%d\n", res7);

    return 0;
}

若有汉字的编译错误,请把汉字改成英文就OK了
运行结果:
这里写图片描述

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值