数据结构:一元多项式相加

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

typedef struct poly
{
    double coef;//系数
    int expn;//指数
    struct poly * next;
}PolyNode,* PolyLinkList;

PolyLinkList Tail_Polylinklist(int e);
PolyLinkList AddPoly(PolyLinkList H1,PolyLinkList H2);
void Print_Polylinklist(PolyLinkList H);
void Destroy_Polylinklist(PolyLinkList H);


PolyLinkList Tail_Polylinklist(int e)
{
    PolyLinkList H = (PolyLinkList)malloc(sizeof(PolyNode));
    PolyLinkList T;
    double coef = 0.0;
    int expn = 0;
    H->next = NULL;
    T = H;
    for (int i = 0; i < e; i++)
    {
        scanf("%lf",&coef);
        scanf("%d",&expn);
        PolyLinkList p = (PolyLinkList)malloc(sizeof(PolyNode));
        p->coef = coef;
        p->expn = expn;
        p->next = T->next;
        T->next = p;
        T = T->next;
    }
    return H;
}

void Print_Polylinklist(PolyLinkList H)
{
    PolyLinkList L;
    L = H->next;
    printf("\n");
    printf("Y = ");
    while (L != NULL)
    {
        if(L->coef > 0)
        {
            printf("%.2lfX^%d+",L->coef,L->expn); 
        }
        else
        {
            printf("(%.2lf)X^%d+",L->coef,L->expn);
        }
        L = L->next;
    }
    printf("\n");
}

PolyLinkList AddPoly(PolyLinkList H1,PolyLinkList H2)
{
    PolyLinkList L3 = H1,p,F1,F2,prev;
    p = L3;int sum = 0;
    prev = p;
    p->coef = 0;
    p->expn = 0;
    F2 = H2;
    H1 = H1->next;
    H2 = H2->next;
    free(F2);
    
    while (H1 != NULL && H2 != NULL)
    {
        if (H1->expn < H2->expn)
        {
          
            p->next = H1;
            p = p->next;
            H1 = H1->next;
            if (prev->expn == p->expn && prev != L3)
            {
                prev->coef = prev->coef + p->coef;
                free(p);
                p = prev;
            }
            else
            {
                prev = p;
            }
            
        }
        else if (H1->expn > H2->expn)
        {
            p->next = H2;
            p = p->next;
            H2 = H2->next;
            if (prev->expn == p->expn && prev != L3)
            {
                prev->coef = prev->coef + p->coef;
                free(p);
                p = prev;
            }
            else
            {
                prev = p;
            }
        }
        else
        {
            sum = (H1->coef + H2->coef);
            if (sum == 0)
            {
                F1 = H1;
                F2 = H2;
                H1 = H1->next;
                H2 = H2->next;
                free(F1);
                free(F2);
            }
            else
            {
                H1->coef = sum;
                F2 = H2;
                p->next = H1;
                p = p->next;
                prev = p;
                H1 = H1->next;
                H2 = H2->next;
                free(F2);
            }
            
        }
    }
    p->next = H1 ? H1 : H2;
    return L3;
}

void Destroy_Polylinklist(PolyLinkList H)
{
    PolyLinkList L;
    L = H;
    while (L)
    {
        L = L->next;
        free(H);
        H = L;
    }
    
}

int main()
{
    PolyLinkList L1,L2,L3;
    L1 = Tail_Polylinklist(3);
    // printf("L1:");
    Print_Polylinklist(L1);
    L2 = Tail_Polylinklist(4);
    printf("L2:");
    Print_Polylinklist(L2);
     L3 = AddPoly(L1,L2);
    // printf("L1 Add L2 equal:");
    Print_Polylinklist(L3);
    //这里不用摧毁L1 和 L2,否则因为L3是由L1,L2 cretae
    Destroy_Polylinklist(L3);
    system("pause");
    return 0;
}

减法和乘法读者自行添加吧

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值