一元多项式的加减法

本文介绍了一元多项式的链表实现方法,包括创建、加法和减法运算,并提供了一个完整的C语言代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

   设有两个一元多项式A(x),B(x),请完成运算A(x)+B(x)、A(x)-B(x),要求多项式采用链表进行存储。另外该任务要求具有建立多项式链表以及输出多项式到屏幕的功能。

首先确定数据结构

struct Polynomial
{
    int coef;
    int exp;
    struct Polynomial *next;
};

然后我们需要从键盘获取多项式,所以需要一个建立多项式的函数,由于输入的指数是无序的,并且可能存在需要合并相同指数项,我们需要在这个过程中进行合并,有两种方法,第一种,会比较繁琐浪费时间,就是先一次性建立一个多项式,然后给这个多项式按照指数大小进行排序,排完序后进行合并同类项,如果发现这个同类项的系数为0,还要进行删除该项,所需要的步骤较多,不宜采用,但较相似我们人的手写计算的过程,第二种,边建边排序边合并同类项,一次最多插入一个节点,直到链表建立结束,相比第一种算法时间复杂度较小。建立A,B结束后在进行加法,减法运算。完整代码如下:

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

struct Polynomial
{
    int coef;
    int exp;
    struct Polynomial *next;
};


struct Polynomial *create();//建立多项式

struct Polynomial *insert(struct Polynomial *head,struct Polynomial *p);

void add(struct Polynomial *p1,struct Polynomial *p2);//多项式相加运算

void sub(struct Polynomial *p1,struct Polynomial *p2);//多项式相减运算

void print(struct Polynomial *p);//将多项式打印到屏幕

int main()
{
    struct Polynomial *p1,*p2;
    printf("请输入多项式A中x的系数及指数(输入0 0表示输入结束):\n");
    p1=create();
    printf("请输入多项式B中x的系数及指数(输入0 0表示输入结束):\n");
    p2=create();
    printf("\n");
    printf("A(x)=");
    print(p1);
    printf("\n");
    printf("B(x)=");
    print(p2);
    printf("\n\n");
    printf("A(x)+B(x)=");
    add(p1,p2);
    printf("\n\n");
    printf("A(x)-B(x)=");
    sub(p1,p2);
    printf("\n\n");
    return 0;
}

struct Polynomial *create()
{
    struct Polynomial *p,*q,*head;
    p=(struct Polynomial *)malloc(sizeof(struct Polynomial));
    scanf("%d%d",&p->coef,&p->exp);
    head=NULL;
    while(p->coef!=0||p->exp!=0)
    {
        head=insert(head,p);
        scanf("%d%d",&p->coef,&p->exp);
    }
    return head;
}

struct Polynomial *insert(struct Polynomial *head,struct Polynomial *p)
{
    struct Polynomial *q,*q1,*q2;
    q=(struct Polynomial *)malloc(sizeof(struct Polynomial));
    q->coef=p->coef;
    q->exp=p->exp;
    q->next=NULL;
    if(head==NULL)
    {
        head=q;
        head->next=NULL;
        return head;
    }
    q2=q1=head;
    while(q1!=NULL)
    {
        while(q1->exp<p->exp)
        {
            q2=q1;
            if(q1->next==NULL)
                break;
            q1=q1->next;
        }
        if(q1->exp==p->exp)
        {
            q1->coef=q1->coef+p->coef;
            if(q1->coef==0)
            {
                if(q1==head)
                {
                    head=head->next;
                    break;
                }
                else
                {
                    q2->next=q1->next;
                }
            }
            else
                break;
        }
        else if(q1->exp<p->exp)
        {
            q1->next=q;
            break;
        }
        else
        {
            if(q2==head&&q2->exp>q->exp)  //如果不加q2->exp>q->exp会出现二义性
            {
                q->next=head;
                head=q;
                break;
            }
            else
            {
                q2->next=q;
                q->next=q1;
                break;
            }
        }
    }
    return head;
};

void add(struct Polynomial *p1,struct Polynomial *p2)
{
    struct Polynomial*p,*q,*head;
    p=(struct Polynomial *)malloc(sizeof(struct Polynomial));
    head=q=p;
    while(p1!=NULL||p2!=NULL)
    {
        if(p1==NULL)
        {
            while(p2!=NULL)
            {
                 q=p;                                         //p的前一节点
                 p->exp=p2->exp;
                 p->coef=p2->coef;
                 p=(struct Polynomial *)malloc(sizeof(struct Polynomial));
                 q->next=p;
                 p2=p2->next;
            }
        }
        else if(p2==NULL)
        {
            while(p1!=NULL)
            {
                 q=p;
                 p->exp=p1->exp;
                 p->coef=p1->coef;
                 p=(struct Polynomial *)malloc(sizeof(struct Polynomial));
                 q->next=p;
                 p1=p1->next;
            }
        }
        else
        {
            if(p1->exp<p2->exp)
            {
                 q=p;
                 p->exp=p1->exp;
                 p->coef=p1->coef;
                 p=(struct Polynomial *)malloc(sizeof(struct Polynomial));
                 q->next=p;
                 p1=p1->next;
            }
            else if(p1->exp==p2->exp)
            {
                 q=p;
                 p->exp=p1->exp;
                 p->coef=p1->coef+p2->coef;
                 if(p->coef!=0)
                 {
                     p=(struct Polynomial *)malloc(sizeof(struct Polynomial));
                     q->next=p;
                     p1=p1->next;
                     p2=p2->next;
                 }
                 else
                 {
                     p1=p1->next;
                     p2=p2->next;
                 }
            }
            else
            {
                 q=p;
                 p->exp=p2->exp;
                 p->coef=p2->coef;
                 p=(struct Polynomial *)malloc(sizeof(struct Polynomial));
                 q->next=p;
                 p2=p2->next;
            }
        }
    }
    q->next=NULL;
    print(head);
};

void sub(struct Polynomial *p1,struct Polynomial *p2)
{
    struct Polynomial*p,*q,*head;
    p=(struct Polynomial *)malloc(sizeof(struct Polynomial));
    head=q=p;
    while(p1!=NULL||p2!=NULL)
    {
        if(p1==NULL)
        {
            while(p2!=NULL)
            {
                 q=p;
                 p->exp=p2->exp;
                 p->coef=-p2->coef;
                 p=(struct Polynomial *)malloc(sizeof(struct Polynomial));
                 q->next=p;
                 p2=p2->next;
            }
        }
        else if(p2==NULL)
        {
            while(p1!=NULL)
            {
                 q=p;
                 p->exp=p1->exp;
                 p->coef=p1->coef;
                 p=(struct Polynomial *)malloc(sizeof(struct Polynomial));
                 q->next=p;
                 p1=p1->next;
            }
        }
        else
        {
            if(p1->exp<p2->exp)
            {
                 q=p;
                 p->exp=p1->exp;
                 p->coef=p1->coef;
                 p=(struct Polynomial *)malloc(sizeof(struct Polynomial));
                 q->next=p;
                 p1=p1->next;
            }
            else if(p1->exp==p2->exp)
            {
                 q=p;
                 p->exp=p1->exp;
                 p->coef=p1->coef-p2->coef;
                 if(p->coef!=0)
                 {
                     p=(struct Polynomial *)malloc(sizeof(struct Polynomial));
                     q->next=p;
                     p1=p1->next;
                     p2=p2->next;
                 }
                 else
                 {
                     p1=p1->next;
                     p2=p2->next;
                 }
            }
            else
            {
                 q=p;
                 p->exp=p2->exp;
                 p->coef=-p2->coef;
                 p=(struct Polynomial *)malloc(sizeof(struct Polynomial));
                 q->next=p;
                 p2=p2->next;
            }
        }

    }
    q->next=NULL;
    print(head);
};

void print(struct Polynomial *p)//将多项式打印到屏幕
{
    struct Polynomial *p1;
    p1=p;
    if(p==NULL)
    {
        printf("0\n");
        return;
    }
    while(p1!=NULL)
    {
        if(p1==p)  //头结点输出时的情况
        {
            printf(" %d",p1->coef);
            if(p1->exp!=0)
                printf("x^%d ",p1->exp);
            else
                printf(" ");
        }
        else
        {
            if(p1->coef>0)
            {
                 printf("+ %d",p1->coef);
                 if(p1->exp!=0)
                    printf("x^%d ",p1->exp);
                 else
                    printf(" ");
            }
            else
            {
                printf("- %d",-p1->coef);
                if(p1->exp!=0)
                    printf("x^%d ",p1->exp);
                else
                    printf(" ");
            }
        }
        p1=p1->next;
    }
    printf("\n");
}

在写关于指针的代码很容易发生内存溢出的错误情况,所以敲代码之前要先想好算法,在函数命名时不要和提供的函数过于相近,容易造成混淆。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值