线性表实现多项式加法(C++)以及链表实现稀疏多项式的加法

线性表链表案例之多项式加法

线性表实现多项式加法

在这里插入图片描述

#include <iostream>
#define OK 1
#define ERROR 0
#define MAXSIZE 100
using namespace std;
typedef int Status;
typedef struct{
    int exponent;
    int base;
}ElemType;
typedef struct
{
    ElemType *elem;//对应方式二初始化
    //ElemType* elem;对应方式一初始化
    int length;
}SqList;

Status init(SqList &L){
    L.elem=new ElemType[MAXSIZE];
    if(!L.elem) return ERROR;
    L.length=0;
    return OK;
}
void createSqlist(SqList &L,int n){
    init(L);
    while(n>0){
        printf("请输入底数:\n");
        cin>>L.elem[L.length].base;
        printf("请输入指数:\n");
        cin>>L.elem[L.length++].exponent;
        n--;
    }
}
void selectAll(SqList L){
    for(int i=0;i<L.length;i++){
        if(i==L.length-1){
            printf("%dX^%d",L.elem[i].base,L.elem[i].exponent);
        }else{
            printf("%dX^%d+",L.elem[i].base,L.elem[i].exponent);
        }
    }
}
//线性表的多项式相加
SqList add(SqList L1,SqList L2){
    int p1=0;int p2=0;
    SqList R;
    R.elem=new ElemType[L1.length+L2.length];
    R.length=0;
    while(p1<L1.length&&p2<L2.length){
        if(L1.elem[p1].exponent==L2.elem[p2].exponent){//指数相等的情况
            int result=L1.elem[p1].base+L2.elem[p2].base;//底数相加
            if(result!=0){
                R.elem[R.length].base=result;//底数
                R.elem[R.length++].exponent=L1.elem[p1].exponent;//指数
            }
            //移动指针
            p1++;
            p2++;
        }else{//指数不相等的情况
            if(L1.elem[p1].exponent<L2.elem[p2].exponent){//L1的指数更小
                R.elem[R.length].base=L1.elem[p1].base;//底数
                R.elem[R.length++].exponent=L1.elem[p1].exponent;//指数
                p1++;//移动p1指针
            }else{
                R.elem[R.length].base=L2.elem[p2].base;//底数
                R.elem[R.length++].exponent=L2.elem[p2].exponent;//指数
                p2++;//移动p2指针
            }
        }
    }
    //判断L1和L2中哪个有剩余
    while(p1<L1.length){
        R.elem[R.length].base=L1.elem[p1].base;//底数
        R.elem[R.length++].exponent=L1.elem[p1].exponent;//指数
        p1++;
    }
    while(p2<L2.length){
        R.elem[R.length].base=L2.elem[p2].base;//底数
        R.elem[R.length++].exponent=L2.elem[p2].exponent;//指数
        p2++;
    }
    return R;
}


int main()
{
    SqList L;
    int n;
    printf("请输入第一个多项式的项数:\n");
    cin>>n;
    createSqlist(L,n);
    selectAll(L);
    printf("\n");
    SqList L2;
    int n2;
    printf("请输入第二个多项式的项数:\n");
    cin>>n2;
    createSqlist(L2,n2);
    selectAll(L2);
    printf("\n");
    SqList R=add(L,L2);
    printf("\n===================================\n");
    selectAll(R);
    return 0;
}

SqList中的元素不是直接的指数和底数,而是它们对应的结构体的地址的情况:(即(指针里面存指针的情况)):**

#include <iostream>
#define OK 1
#define ERROR 0
#define MAXSIZE 100
using namespace std;
typedef int Status;
typedef struct{
    int exponent;
    int base;
}type,*ElemType;
typedef struct
{
    ElemType *elem;//这个里面存的还是指针,所以在分配的时候还需要单独为这些分配空间L.elem[L.length]=new type;这种
    //就是很变态的指针里面存指针
    //ElemType* elem;对应方式一初始化
    int length;
}SqList;

Status init(SqList &L){
    L.elem=new ElemType[MAXSIZE];
    if(!L.elem) return ERROR;
    L.length=0;
    return OK;
}
void createSqlist(SqList &L,int n){
    init(L);
    while(n>0){
        printf("请输入底数:\n");
        L.elem[L.length]=new type;
        //cin>>e->base;
        cin>>L.elem[L.length]->base;
        printf("请输入指数:\n");
        //cin>>e->exponent;
        cin>>L.elem[L.length++]->exponent;
        n--;
    }
}
void selectAll(SqList L){
    for(int i=0;i<L.length;i++){
        if(i==L.length-1){
            printf("%dX^%d",L.elem[i]->base,L.elem[i]->exponent);
        }else{
            printf("%dX^%d+",L.elem[i]->base,L.elem[i]->exponent);
        }
    }
}
//线性表的多项式相加
SqList add(SqList L1,SqList L2){
    int p1=0;int p2=0;
    SqList R;
    R.elem=new ElemType[L1.length+L2.length];
    R.length=0;
    while(p1<L1.length&&p2<L2.length){
        if(L1.elem[p1]->exponent==L2.elem[p2]->exponent){//指数相等的情况
            int result=L1.elem[p1]->base+L2.elem[p2]->base;//底数相加
            if(result!=0){
                R.elem[R.length]=new type;
                R.elem[R.length]->base=result;//底数
                R.elem[R.length++]->exponent=L1.elem[p1]->exponent;//指数
            }
            //移动指针
            p1++;
            p2++;
        }else{//指数不相等的情况
            if(L1.elem[p1]->exponent<L2.elem[p2]->exponent){//L1的指数更小
                R.elem[R.length]=new type;
                R.elem[R.length]->base=L1.elem[p1]->base;//底数
                R.elem[R.length++]->exponent=L1.elem[p1]->exponent;//指数
                p1++;//移动p1指针
            }else{
                R.elem[R.length]=new type;
                R.elem[R.length]->base=L2.elem[p2]->base;//底数
                R.elem[R.length++]->exponent=L2.elem[p2]->exponent;//指数
                p2++;//移动p2指针
            }
        }
    }
    //判断L1和L2中哪个有剩余
    while(p1<L1.length){
        R.elem[R.length]=new type;
        R.elem[R.length]->base=L1.elem[p1]->base;//底数
        R.elem[R.length++]->exponent=L1.elem[p1]->exponent;//指数
        p1++;
    }
    while(p2<L2.length){
        R.elem[R.length]=new type;
        R.elem[R.length]->base=L2.elem[p2]->base;//底数
        R.elem[R.length++]->exponent=L2.elem[p2]->exponent;//指数
        p2++;
    }
    return R;
}


int main()
{
    SqList L;
    int n;
    printf("请输入第一个多项式的项数:\n");
    cin>>n;
    createSqlist(L,n);
    selectAll(L);
    printf("\n");
    SqList L2;
    int n2;
    printf("请输入第二个多项式的项数:\n");
    cin>>n2;
    createSqlist(L2,n2);
    selectAll(L2);
    printf("\n");
    SqList R=add(L,L2);
    printf("\n===================================\n");
    selectAll(R);
    return 0;
}

链表实现稀疏多项式

在这里插入图片描述

#include <iostream>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
#define MAXSIZE 100
using namespace std;
typedef int Status;//返回值类型
typedef struct{
    int exponent;
    int base;
}ElemType;
typedef struct Lnode{
    ElemType elem;
    Lnode* next;
}Lnode,*LinkList;
Status init(LinkList &L){
    L=new Lnode;
    L->next=nullptr;
}
//创建链表
void createLink(LinkList &L,int n){
    init(L);
    Lnode* tail=L;//尾指针
    while(n>0){
        Lnode* q=new Lnode;
        printf("请输入底数:\n");
        cin>>q->elem.base;
        printf("请输入指数:\n");
        cin>>q->elem.exponent;
        q->next=nullptr;
        tail->next=q;
        //移动tail
        tail=q;
        n--;
    }
}
//进行多项式加法计算
LinkList add(LinkList La,LinkList Lb){
    Lnode *pa,*pb,*pc;
    pa=La->next;
    pb=Lb->next;
    pc=La;
    while(pa!=nullptr&&pb!=nullptr){//两个多项式都还没有到达最后
        if((pa->elem).exponent==(pb->elem).exponent){
            int result=pa->elem.base+pb->elem.base;
            if(result!=0){
                pa->elem.base=result;//直接存回到其中一个节点中即可
                pc->next=pa;//加结果节点加入链表中
                pc=pa;//移动pc

            }
            Lnode* tempa=pa;
            pa=pa->next;
            Lnode* tempb=pb;
            pb=pb->next;//移动指针
            if(result!=0){
                delete(tempb);
            }else{
                delete(tempa);
                delete(tempb);
            }
        }else{
            if(pa->elem.exponent>pb->elem.exponent){//取指数小的加入到结果链表中La
                pc->next=pb;
                pc=pb;//移动结果链表尾指针
                pb=pb->next;
            }else{
                pc->next=pa;
                pc=pa;//移动
                pa=pa->next;
            }
        }
    }
    while(pa!=nullptr){
        pc->next=pa;
        pa=pa->next;
    }
    while(pb!=nullptr){
        pc->next=pb;
        pb=pb->next;
    }
    delete(Lb);
    return La;
}

void selectAll(LinkList L){
    Lnode* p;
    p=L->next;
    while(p!=nullptr){
        if(p->next!=nullptr){
            printf("%dX^%d+",p->elem.base,p->elem.exponent);
        }else{
            printf("%dX^%d",p->elem.base,p->elem.exponent);
        }
        p=p->next;
    }
}


int main()
{
    LinkList L1;
    int n1;
    printf("请输入多项式1长度:\n");
    cin>>n1;
    createLink(L1,n1);
    selectAll(L1);
    printf("\n");

    LinkList L2;
    int n2;
    printf("请输入多项式2长度:\n");
    cin>>n2;
    createLink(L2,n2);
    selectAll(L2);
    printf("\n");
    LinkList R=add(L1,L2);
    selectAll(R);
    return 0;
}

  • 1
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

菜菜iwi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值