一元多项式求和的实现

来源:互联网 发布:怎么删除网络连接 编辑:程序博客网 时间:2024/06/05 03:14
/*
一元多项式求和
例:A(x)=7*12x^2-2x^8+5x^12 ,B(x)=4x+6x^3+2x^8+5x^20+7x^28,求A(x)+B(x)
把系数指数依次输入,输入 0 0 结束
*/

#include <stdio.h>
#include <malloc.h>            //实现动态存储分配

typedef struct Node            //定义单链表结点
{
    int coef,exp;            //系数,指数
    struct Node *next;
}Node;

Node *Great()
{
    Node *first = NULL,*r = NULL,*s = NULL;
    int coef,exp;
    first = (Node*)malloc(sizeof(Node));        //申请头结点
    r = first;                                //尾插法建立单链表
    printf("请输入系数和指数:");
    scanf("%d%d",&coef,&exp);
    while(coef != 0)
    {
        s = (Node*)malloc(sizeof(Node));
        s->coef = coef;
        s->exp = exp;
        r->next = s;
        r = s;
        printf("请输入系数和指数:");
        scanf("%d%d",&coef,&exp);
    }
    r->next = NULL;           //单链表的尾标志
    return first;            //返回头指针
}

Node *AddPolynomial(Node *A,Node *B)
{
    Node *pre = A,*p = pre->next;
    Node *qre = B,*q = qre->next;
    Node *v = NULL;
    while(p != NULL && q != NULL)
    {
        if(p->exp < q->exp)
        {
            pre = p;p = p->next;
        }else if(p->exp < q->exp){
            v = q->next;
            pre->next = q;
            q->next = p;
            q = v;
        }else{
            p->coef = p->coef + q->coef;
            if(p->coef == 0){
                pre->next = p->next;
                free(p);
                p = p->next;
            }else{
                pre = p;
                p = p->next;
            }
            qre->next = q->next;
            free(q);
            q = qre->next;
        }
    }
    if(q != NULL)
        pre->next = q;
    free(B);
    return(A);
}

void Print(Node *first)
{
    Node *p = first->next;
    if(p != NULL)
        printf("%dx%d",p->coef,p->exp);
    p = p->next;
    while(p != NULL)
    {
        if(p->coef > 0)
            printf("+%dx%d",p->coef,p->exp);
        else
            printf("%dx%d",p->coef,p->exp);
        p = p->next;
    }
    printf("\n");
}

int main()
{
    Node *A = NULL, *B = NULL;
    A = Great();Print(A);
    B = Great();Print(B);
    A = AddPolynomial(A,B);
    printf("结果:");
    Print(A);
    return 0;

}