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

来源:互联网 发布:matlab微电网优化调度 编辑:程序博客网 时间:2024/04/28 07:22

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

#include <stdio.h>#include <stdlib.h>#define MAX_SIZE 100#define OK 1#define ERROR -1typedef 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了
运行结果:
这里写图片描述

阅读全文
0 0
原创粉丝点击