【PTA】一元多项式的乘法与加法运算

本文介绍了C++编程中的链表操作,包括插入节点、有序插入和合并两个已排序链表。重点讨论了如何在链表中实现高效有序插入以及合并后的智能排序算法,展示了在处理复杂数据结构时的技术细节。

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

struct Node
{
   int coef;
   int index;
   Node* Next;
};

typedef Node* List;

List Insert(List L,int tmpc,int tmpi){
    List tmp=new Node;
    tmp->coef=tmpc;
    tmp->index=tmpi;
    tmp->Next=NULL;
    List L1=L;
    while(L1->Next){
        L1=L1->Next;
    }
    L1->Next=tmp;
    return L;
}

List order_Insert(List L,int tmpc,int tmpi){
//有序插入,链表排序比较复杂,不如在插入的时候就有序插入
    List tmp=new Node;
    tmp->coef=tmpc;
    tmp->index=tmpi;
    tmp->Next=NULL;
    List L1=L;
    while(L1->Next){
        if(L1->Next->index>tmpi)L1=L1->Next;
        else break;
    }
    tmp->Next=L1->Next;
    L1->Next=tmp;
    return L;
}

List CreateL(List L){
    int n,tmpc,tmpi;
    scanf("%d",&n);
    for(int i=0;i<n;i++){
        scanf("%d %d",&tmpc,&tmpi);
        L=Insert(L,tmpc,tmpi);
    }
    return L;
}

List add(List L3,List L1,List L2){
//注意算出系数为0则不必插入,加法一定是有序的
    List L4=L1->Next;
    List L5=L2->Next;

    while(L4&&L5){
        if(L4->index==L5->index){
            if((L4->coef+L5->coef)!=0)L3=Insert(L3,L4->coef+L5->coef,L4->index);
            L4=L4->Next;
            L5=L5->Next;
        }else if(L4->index>L5->index){
            L3=Insert(L3,L4->coef,L4->index);
            L4=L4->Next;
        }else{
            L3=Insert(L3,L5->coef,L5->index);
            L5=L5->Next;
        }
    }

    while(L4){
        L3=Insert(L3,L4->coef,L4->index);
        L4=L4->Next;
    }
    while(L5){
        L3=Insert(L3,L5->coef,L5->index);
        L5=L5->Next;
    }

    return L3;
}

List find(List L,int fi){
    List L1=L->Next;
    while(L1&&(L1->index!=fi)){
        L1=L1->Next;
    }

    if(L1){
        return L1;
    }else{
        return NULL;
    }
}

List mul(List L3,List L1,List L2){
//乘法插入不一定有序,注意系数非0才插入新项
//此处未解决与原相同指数项的系数抵消的问题(需要删除原结点),所以最后输出还是得判0
    List L4=L1->Next;
    List L5=L2->Next;
    int tmpc,tmpi;
    List tmpf;
    while(L4){
        while(L5){
            tmpc=L4->coef*L5->coef;
            tmpi=L4->index+L5->index;
            tmpf=find(L3,tmpi);
            if(tmpf){
                tmpf->coef+=tmpc;
            }else{
                if(tmpc!=0)L3=order_Insert(L3,tmpc,tmpi);
            }
            L5=L5->Next;
        }
        L4=L4->Next;
        L5=L2->Next;
    }

    return L3;

}

void PrintL(List L3){
    int flag=0;
    L3=L3->Next;
    if(!L3){
        printf("0 0");
        return;
    }
    while(L3){
        if(flag){
            if(L3->coef!=0)printf(" %d %d",L3->coef,L3->index);
        }else{
            if(L3->coef!=0)printf("%d %d",L3->coef,L3->index);
            flag=1;
            }
        L3=L3->Next;
    }
    return;
}

int main(){
    List L1,L2;
    L1=new Node;L2=new Node;
    L1->Next=NULL;L2->Next=NULL;
    L1=CreateL(L1);L2=CreateL(L2);

    
    List L3=new Node;L3->Next=NULL;
    List L4=new Node;L4->Next=NULL;

    

    L3=mul(L3,L1,L2);
    L4=add(L4,L1,L2);

    PrintL(L3);    
    printf("\n");
    PrintL(L4);


    return 0;

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值