采用链式结构实现任意多项式的存储,求两个多项式的和

本文介绍了一种使用链表来实现多项式加法的方法。通过定义特定的节点结构,可以方便地输入、存储和输出多项式。文章详细展示了如何进行多项式的输入、输出以及两个多项式相加的过程。

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

源代码:

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

typedef struct node       //代表每个结点的结构体
{
    double xs;                 //double型系数
    int zs;                        //int型指数
    struct node*zz;        //指向结构体的指针
} Node;

Node*input();               //输入函数
Node*add();                //多项式相加函数
void output();              //输出函数

int main()
{
    Node*p1,*p2,*p3;
    printf("请输入第一个多项式\n");
    p1 = input();
    printf("请输入第二个多项式\n");
    p2 = input();
    p3 = add(p1,p2);
    printf("第一个多项式:\n");
    output(p1);
    printf("\n");
    printf("第二个多项式:\n");
    output(p2);
    printf("\n");
    printf("多项式的和:\n");
    output(p3);
    return 0;
}

Node*input()
{
    int i,n;
    Node *p1,*p2,*p3;
    printf("请输入多项式的项数:");
    scanf("%d",&n);
    p1 = p2 = p3 = (struct node*)malloc(sizeof(struct node));          //开辟内存
    for(i=0; i<n; i++)
    {
        printf("请输入第%d项:",i+1);
        scanf("%lf %d",&p2->xs,&p2->zs);                                        //样例:如果输入x则输入:1 1
        if(i != n-1)  //将最后一项单独列出来
        {
            p3 = (struct node*)malloc(sizeof(struct node));                 //开辟新内存
            p2->zz = p3;                                                                       //让p2指向的结构体内的zz指针指向新内存
            p2 = p3;                                                                              //让p2指向新内存

        }                                                                                              //if内的语句实现了多项式的存储
        else
        {
            p2->zz = NULL;                                                                 //最后一个结构体的zz指针置空
        }
    }
    return p1;                                                                                   //返回表头指针
}

void output(Node*head)
{
    int n = 0;
    while(head != NULL)
    {
        if(head->xs < 0)
        {
            if(head->zs==0)
            {
                printf("%.2lf",head->xs);
            }
            else
            {
                printf("%.2lfx%d",head->xs,head->zs);
            }
            n++;
        }
        else if(head->xs > 0)
        {
            if(n != 0){
                printf("+");                            //如果系数是正数,且不是第一项则输出正号
            }
            if(head->zs==0)
            {
                printf("%.2lf",head->xs);
            }
            else
            {
                printf("%.2lfx%d",head->xs,head->zs);
            }
            n++;
        }
        head = head->zz;
    }
    if(n == 0){
        printf("0");
    }
}

Node*add(Node*p1,Node*p2)
{
    Node*p3,*p4,*p5,*p6;
    p3 = p4 = p5 = (struct node*)malloc(sizeof(struct node)); //p4是表头指针
    while(p1!=NULL || p2!=NULL)
    {
        if(p1 == NULL)                         //当p1指针为空时,说明第一个多项式已经读取完毕,只需将第二个多项式剩余的项数拷入多项式的和的链表中
        {
            p3->xs = p2->xs;
            p3->zs = p2->zs;
            p2 = p2->zz;
        }
        else if(p2 == NULL)                //同上
        {
            p3->xs = p1->xs;
            p3->zs = p1->zs;
            p1 = p1->zz;
        }
        else                                       //p1、p2指针均非空
        {
            if(p1->zs > p2->zs)          //如果p1的指数大于p2的指数
            {
                p3->zs = p1->zs;         //p1的指数拷入和的链表中

                p3->xs = p1->xs;      //p1的系数拷入和的链表中

                p1 = p1->zz;                //p1指针向后移一个
            }
            else if(p1->zs < p2->zs)
            {
                p3->zs = p2->zs;
                p3->xs = p2->xs;
                p2 = p2->zz;
            }
            else if(p1->zs == p2->zs)
            {
                p3->zs = p2->zs;
                p3->xs = p2->xs+p1->xs;
                p1 = p1->zz;
                p2 = p2->zz;
            }
        }
        p6 = p3;                                                             //以下代码为建立新结构体,与存储多项式相似
        p5 = (struct node*)malloc(sizeof(struct node));
        p3->zz = p5;
        p3 = p5;
    }
    p6->zz = NULL;
    free(p5);                                                                //释放p5指针
    return p4;                                                              //返回表头指针
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值