线性表的应用——一元多项式的存储

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/mozha_666/article/details/79658496

捕捉一元多项式的描述要点
一元多项式有多个数据项,每个数据项的关键点是变量的指数,变量的系数


  • 顺序存储,一维数组进行存储
    对应关系:数组下标0-n-1,和变量系数对应,数组的数据单元可以存储变量的系数
    这里写图片描述
    优点:
    数组适合随机存取,利用它存储多项式,做加减法运算很方便
    缺点:
    若非零项少,浪费存储空间

  • 顺序存储:利用结构数组只存储非零项数据
    1、结构数组,就是可以存储多个结构体的数组
    2、对于一元多项式,结构体,只要包含两个属性,一个是系数,一个是指数
    3、为了方便查找,可以按指数的升序或降序序列进行存储
typedef struct {
    int expon;//指数
    int coef;//系数
}Polynomial;
Polynomial data[MAXSIZE];//结构数组

  • 链式存储,非零项
    1、链表的每个结点应包含,系数+指数+next指针
typedef struct Polynomial{
    int expon;//指数
    int coef;//系数
    struct Polynomial *next;
}Polynomial;

来张图更直观一些
这里写图片描述
接下来,来份代码,感受一下,这份代码了良久啊,码艺不精,请见谅啊。


#include<stdio.h> 
#include<stdlib.h>

typedef struct PolynomialNode* PolynomialLink;
typedef struct PolynomialNode{
    int coef;//系数 
    int expon;//指数
    PolynomialLink next;//指针指向下一项 
}PolynomialNode;

/*
在尾部插入多项式的项 
*/
void Attach(int coef,int expon,PolynomialLink *rear){
    PolynomialLink temp; 
    temp = (PolynomialNode*)malloc(sizeof(PolynomialNode));
    temp->coef = coef;
    temp->expon = expon;
    temp->next = NULL;
    (*rear)->next = temp;
    *rear = temp;
} 
/*
读入多项式 
*/
PolynomialLink ReadPoly(){
    PolynomialLink p,rear,temp;
    int n,c,e;
    p = (PolynomialNode *)malloc(sizeof(PolynomialNode));
    p->next = NULL; 
    rear = p;
    //输入多项式有几项 
    scanf("%d",&n);
    while(n--){
        //按降幂的顺序输入每项的系数指数 
        scanf("%d%d",&c,&e);
        Attach(c,e,&rear);      
    }
    //删除头结点
    temp = p;
    p = p->next;
    free(temp);
    return p;   
}
/*
输出多项式 
*/
void PrintPoly(PolynomialLink p){
    if(!p){
        printf("0 0\n");
        return ;
    }
    printf("%d %d",p->coef,p->expon);
    p = p->next;
    while(p){
        printf(" %d %d",p->coef,p->expon);
        p = p->next;
    }
    printf("\n");   
}
/*
比较指数大小 
*/ 
int Compare(int a,int b){
    if(a>b){
        return 1;
    }
    if(a<b){
        return -1;
    }
    if(a == b){
        return 0;
    }
}
/*
对多项式求和 
*/
PolynomialLink AddPoly(PolynomialLink p1,PolynomialLink p2){
    PolynomialLink p,rear,t1,t2,temp;
    t1 = p1;
    t2 = p2;
    //构造和多项式的头结点 
    p = (PolynomialNode *)malloc(sizeof(PolynomialNode));
    p->next = NULL; 
    rear = p;
    while(t1 && t2){
        switch(Compare(t1->expon,t2->expon)){
            case 1:{
                Attach(t1->coef,t1->expon,&rear);
                t1 = t1->next;
                break;
            }
            case -1:{
                Attach(t2->coef,t2->expon,&rear);
                t2 = t2->next;
                break;
            }
            case 0:{
                int sum = t1->coef + t2->coef;
                if(!sum){
                    t1 = t1->next;
                    t2 = t2->next;
                    break;
                }
                Attach(sum,t1->expon,&rear);
                t1 = t1->next;
                t2 = t2->next;
                break;
            }
            default:{
                break;
            }
        } 
    }
    while(t1){
        Attach(t1->coef,t1->expon,&rear);
        t1 = t1->next;
    }
    while(t2){
        Attach(t2->coef,t2->expon,&rear);
        t2 = t2->next;
    }
    //释放头结点 
    temp = p;
    p = p->next;
    free(temp);
    return p; 
} 
/*
对多项式求乘积 
*/
PolynomialLink MultiPoly(PolynomialLink p1,PolynomialLink p2){
    PolynomialLink p,rear,t1,t2,temp;
    if(!p1 || !p2){
        return NULL;
    }
    t1 = p1;
    t2 = p2;
    //构造和多项式的头结点 
    p = (PolynomialNode *)malloc(sizeof(PolynomialNode));
    p->next = NULL; 
    rear = p;

    while(t2){
        Attach(t1->coef * t2->coef , t1->expon + t2->expon,&rear);
        t2 = t2->next;
    }
    t1 = t1->next;
    while(t1){
        rear = p;
        t2 = p2;
        while(t2){
            int c = (t1->coef) * (t2->coef);
            int e = t1->expon + t2->expon;
            while(rear->next && rear->next->expon > e){
                rear = rear->next;
            }
            if(rear->next && rear->next->expon == e){
                int sum = rear->next->coef+c;
                if(sum){
                    rear->next->coef = sum; 
                } else {
                    temp = rear->next;
                    rear->next = temp->next;
                    free(temp);
                }                   
            } else {
                temp = (PolynomialLink)malloc(sizeof(PolynomialNode));
                temp->coef = c;
                temp->expon = e;
                temp->next = rear->next;
                rear->next = temp;
                rear = rear->next;
            }           
            t2 = t2->next;  
        }
        t1 = t1->next;
    }

    //释放头结点 
    temp = p;
    p = p->next;
    free(temp);
    rear->next = NULL;
    return p;

}

int main(void){
    PolynomialLink p1,p2,pa,pm;
    //读入多项式
    p1 = ReadPoly();
    p2 = ReadPoly(); 
//  PrintPoly(p1);
//  PrintPoly(p2);

    //对多项式求乘积
    pm = MultiPoly(p1,p2);
    //对多项式求和
    pa = AddPoly(p1,p2);
    //输出多项式 
    PrintPoly(pm);
    PrintPoly(pa);

    return 0;
}

这里写图片描述

猜你喜欢

转载自blog.csdn.net/mozha_666/article/details/79658496