数据结构——一元多项式相加(C语言版本)

本关任务:设计一种单链表存储结构,每个结点存储一项的系数和指数,类型都是整型,编写完成产生多项式的函数、多项式相加及输出多项式的函数。

相关知识

为了完成本关任务,你需要掌握:

  1. 如何存储一个一元多项式;

  2. 如何对一元多项式进行加法操作。

存储一元多项式

在数学上,一元多项式的形式:

pn​(x)=p0​+p1​x1+p2​x2+...+pn​xn

可由线性表(p0​,p1​,...pn​)表示。一般情况下,一元多项式只表示非0系数项,采用链式存储,对应链表结点数据结构可采取:(设多项式的系数和指数都是整型)

struct node
{
    int exp; //表示指数
    int coef; //表示系数
    struct node *next; //指向下一个结点的指针
};

多项式相加运算规则

两个一元多项式中所有指数相同的项,对于系数相加,若和不为0,则构成结果多项式中的一项,对于两个多项式中所有指数不同的项,则分别复制到结果多项式中。

举例:

p(x)=5+2x+3x5−2x7

Q(x)=12x+2x7+13x15

则结果多项式为:

R(x)=5+14x+3x5+13x15

____________________________________________________________________________

输入输出一元多项式

输入时逐项、按顺序输入一元多项式的系数、指数,输入系数为0时表述输入结束。

例如:

p(x)=5+2x+3x5−2x7

输入: 5 0 2 1 3 5 -2 7 0 0

输出时采取以下格式,若预期输出的多项式为:

p(x)=5+2x+3x5−2x7

则输出:5x^0 + 2x^1 + 3x^5 -2x^7

____________________________________________________________________________

编程要求

在右侧编辑器补充代码,实现相应函数。 创建多项式函数要求能在函数中输入多项式的各项 输入时逐项、按顺序输入一元多项式的系数、指数,输入系数为0时表述输入结束。

测试说明

平台会对你编写的代码进行测试:

_____________________________________________________________________________

测试输入:

5 0 2 1 3 5 -2 7 0 0 12 1 2 7 13 15 0 0

预期输出:

5x^0 + 14x^1 + 3x^5 + 13x^15

____________________________________________________________________________

测试输入:

6 -1 5 0 7 9 0 0 -15 -2 9 9 18 12 0 0

预期输出:

-15x^-2 + 6x^-1 + 16x^9 + 18x^12


开始你的任务吧,祝你成功!

头文件LAB1.H

#ifndef _LAB1_H_
#define  _LAB1_H_
#include <stdlib.h>
#include <stdio.h>


//存放多项式某项的结点结构
struct node
{
    int coef ; //表示系数
    int exp ;  // 表示指数
    struct node *next;  //指向下一个结点的指针
};

typedef  struct node * PNODE ;

/*
  函数功能:生成多项式
  函数名:createPoly
  函数参数:无
  返回值:指向多项式的头指针
*/
PNODE createPoly(void)
{
    //在此处填写代码,能实现创建一个多项式并返回多项式头指针的函数
    //注意:头指针不存放多项式的项。
    /**********  Begin **********/
    PNODE head = (PNODE)malloc(sizeof(struct node));
    PNODE tail = head;
    int exp,coef;
    scanf("%d %d ",&coef,&exp);
    while(coef!=0){
        PNODE newnode = (PNODE)malloc(sizeof(struct node));
        if(newnode!=NULL){
            newnode->exp = exp;
            newnode->coef = coef;
        }
        newnode->next = NULL;
        tail->next = newnode;
        tail = newnode;
        scanf("%d %d",&coef,&exp);
    }
    return head;
    /**********  End  **********/
}

/*
  函数功能:进行多项式相加
  函数名:addPoly
  函数参数:polyAddLeft :加法左边多项式头指针, polyAddRight:加法右边多项式头指针
  返回值:指向结果多项式的头指针
*/
PNODE addPoly(PNODE polyAddLeft , PNODE polyAddRight)
{
    //在此处填写代码,能实现创两个多项式相加并返回结果多项式头指针的函数
    /**********  Begin **********/
    //为了方便操作,定义新的指针时刻表示链表的尾指针
    PNODE head1 = polyAddLeft->next;
    PNODE head2 = polyAddRight->next;

    //这是新链表的尾指针
    PNODE tail = polyAddLeft; //tail = 左链表的头指针。表示当前新链表的尾指针就
    while(head1!=NULL&&head2!=NULL){
        if(head1->exp < head2->exp){ //如果左链表结点次幂 小于 右链表,说明右链表中不存在可以和它相运算的项,它直接作为运算结果其中一向!
            //直接把左链表的结点连接到  新链表上
            tail->next = head1;

            //更新新链表的尾指针
            tail = tail->next;

            //此时相当于把左节点的结点剪下来,然后放到新链表上,所以左链表需要向右移动一格。
            head1 = head1->next;
        }
        else if(head1->exp > head2->exp){//如果左链表结点次幂 大于 右链表,说明左链表中不存在可以和它相运算的项,它直接作为运算结果其中一向!
            tail->next = head2; //直接把右链表结点连接到新链表中
            tail = tail->next;  //更新新链表的尾指针
            head2 = head2->next;//右链表移动一格(相当于删除去次幂小的那个结点)
        }
        else{ //假如次幂相等。
            head1->coef += head2->coef;  //则系数相加然后放在左链表中
            tail->next = head1;

            //更新新链表的尾指针
            tail = tail->next;

            //左右两条链表同时向右移动一个结点
            head1 = head1->next;
            head2 = head2->next;
        }
    }

    //判断哪边链表到最后不为空,如果不为空,直接连接到新链表后边即可。
    if(head1!=NULL)
    {
        tail->next = head1;
    }
    else tail->next = head2;

    //返回新链表的头指针
    return polyAddLeft;

    /**********  End **********/
}

/*while
  函数功能:输出多项式
  函数名:printPoly
  函数参数:待输出多项式的头指针poly
  返回值:无
*/
void printPoly(PNODE poly)
{
    //在此处填写代码,能实现按格式输出多项式的功能,输出格式样例见说明
    /**********  Begin **********/
    PNODE print_node = poly->next;
    printf("%dx^%d",print_node->coef,print_node->exp);
    print_node = print_node->next;

    while(print_node!=NULL){
        if(print_node->coef == 0);
        else{
            printf("+%dx^%d",print_node->coef,print_node->exp);
        }
        print_node = print_node->next;
    }
    /**********  End **********/
}

void destroyPoly(PNODE poly)
{
    //释放存储多项式的链表空间
    PNODE now = poly->next;
    while(now!=NULL) {
        free(poly);
        poly = now;
        now = now->next;
    }
}
#endif

主函数:main.h 

#include "../linklist.h"

int main(void)
{
	PNODE  polyAddLeft, polyAddRight ,polyAddResult ;
	
	polyAddLeft = createPoly();
	
 	
 	polyAddRight = createPoly();
 	
 	polyAddResult = addPoly(polyAddLeft,polyAddRight);
 	printPoly(polyAddResult);
    destroyPoly(polyAddLeft);
    destroyPoly(polyAddRight);
    destroyPoly(polyAddResult);
	
}

  • 19
    点赞
  • 179
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值