一元多项式相加可实现代码数据结构(C语言)

数据结构 专栏收录该内容
1 篇文章 0 订阅

一元多项式相加可实现代码(c语言)

《数据结构》(C语言版)书上是伪代码,经过不断修改调试,写下可实现的C语言源代码。
创建文件,分为两部分:头文件(Poly.h)和源文件(Poly.c)
一、实验目的
1、了解一元多项式的表示。
2、实现一元多项式的相加
二、实验器材
1、Visual Studio 2019开发环境;
注:开发环境不同,会有细节区分,根据开发环境的不同来调试。
(Visual Studio 2019需要我把 scanf 改为 scanf_s 才可运行)

三、实验内容

  1. 问题描述
    输入两个一元多项式,实现两个一元多项式的相加,并且按降幂排序表示
  2. 结构定义(头文件)
//Poly.h
#define TRUE            1
#define FALSE           0
#define OK              1
#define ERROR           0
#define INFEASIBLE      -1
#define OVERFLOW        -2
#define LIST_INIT_SIZE  100
typedef int Status;
struct node {            //项结点
    float   coef;      //系数
    int     expn;       //指数
};
//结构体定义
typedef struct Polynomial {
    struct node  elem;
    struct Polynomial* next;
}*PolyList;
//函数声明
void CreatePolyn(PolyList* ha, int n);
void ShowSqList(PolyList ha);
void SortPolyn(PolyList head, int n);
PolyList add(PolyList ha, PolyList hb);


3.源代码

//Poly.c
#include<stdio.h>
#include<stdlib.h>
#include"Poly.h"
#include"malloc.h"
//创建一元多项式链表
void CreatePolyn(PolyList* ha, int n)
{
    float coe;
    int   exp;
    PolyList p;         //创建临时多项式链表
    *ha = NULL;           //首先为空时ha指向空

    while (n--) {
        scanf_s("%f%d", &coe, &exp);
        p = (PolyList)malloc(sizeof(struct Polynomial));
        p->elem.coef = coe;
        p->elem.expn = exp;
        p->next = *ha;
        *ha = p;
    }
}

//输出一元多项式
void ShowSqList(PolyList ha)
{
    if (ha == NULL)
        printf("F(x)=0");
    else
    {
        printf("多项式F(x)=%.0fX^(%d)", ha->elem.coef, ha->elem.expn);
        ha = ha->next;
        while (ha != NULL)
        {
            if (ha->elem.coef > 0)
                printf("+");
            printf("%.0fX^(%d)", ha->elem.coef, ha->elem.expn);
            ha = ha->next;
        }
    }
    printf("\n");
}

//冒泡排序链表
void SortPolyn(PolyList head, int n)
{
    int i, j;
    struct node temp;
    PolyList p1, p2;
    for (p1 = head, i = 0;i < n - 1;i++, p1 = p1->next)
        for (p2 = p1->next, j = 0;j < n - i - 1;j++, p2 = p2->next)
            if (p1->elem.expn < p2->elem.expn) //按指数从大到小排序
            {
                temp = p2->elem;
                p2->elem = p1->elem;
                p1->elem = temp;
            }
}

//多项式相加
PolyList add(PolyList ha, PolyList hb)
{
    int t = 0;
    int polynsize = 0;
    PolyList p, hc = NULL;
    while (ha && hb)
    {
        if (ha->elem.expn == hb->elem.expn)
        {//两指数相同时,系数相加
            t = ha->elem.coef + hb->elem.coef;
            if (t)
            {//系数和不为零,则插入和多项式hc链表中
                p = (PolyList)malloc(sizeof(struct Polynomial));
                p->elem.coef = t;
                p->elem.expn = ha->elem.expn;
                p->next = hc;
                hc = p;

                ha = ha->next;
                hb = hb->next;
                polynsize++;
            }
            else
            {//系数和为零,则ha、hb结点后移
                ha = ha->next;
                hb = hb->next;
            }
        }
        else if (ha->elem.expn > hb->elem.expn)
        {//ha的指数大则先行插入hc
            p = (PolyList)malloc(sizeof(struct Polynomial));
            p->elem = ha->elem;
            p->next = hc;
            hc = p;

            ha = ha->next;
            polynsize++;
        }
        else
        {//hb的指数大则先行插入hc
            p = (PolyList)malloc(sizeof(struct Polynomial));
            p->elem = hb->elem;
            p->next = hc;
            hc = p;

            hb = hb->next;
            polynsize++;
        }
    }
    while (ha)
    {//ha不为空,则将当前ha剩余项全部插入hc
        p = (PolyList)malloc(sizeof(struct Polynomial));
        p->elem = ha->elem;
        p->next = hc;
        hc = p;

        ha = ha->next;
        polynsize++;
    }
    while (hb)
    {//hb不为空,则将当前hb剩余项全部插入hc
        p = (PolyList)malloc(sizeof(struct Polynomial));
        p->elem = hb->elem;
        p->next = hc;
        hc = p;

        hb = hb->next;
        polynsize++;
    }
    SortPolyn(hc, polynsize);//排序hc
    return hc;
}

int main()
{
    PolyList ha, hb, hc;      //多项式ha,hb,hc
    int m, n;                //多项式ha,hb的项数

    scanf_s("%d", &m);
    CreatePolyn(&ha, m);      //输入并创建ha
    scanf_s("%d", &n);
    CreatePolyn(&hb, n);      //输入并创建hb
    printf("\n");

    printf("原始两个多项式\n");
    ShowSqList(ha);
    ShowSqList(hb);
    printf("\n");

    SortPolyn(ha, m);
    SortPolyn(hb, n);
    printf("按指数从高到低排序后两个多项式\n");
    ShowSqList(ha);
    ShowSqList(hb);
    printf("\n");

    hc = add(ha, hb);
    printf("和多项式\n");
    ShowSqList(hc);                 //输出和多项式hc
    return 0;
}

/*测试数据(随便输)
第一行ha的项数
第二行为第i项对应系数与指数,i++,i从1开始
第三行hb的项数
第四行为第i项对应系数与指数,i++,i从1开始
3
1 3 2 2 4 1
4
2 2 5 1 -1 3 6 6
*/

实现效果:
实现效果如图

有问题欢迎留言共同探讨!!!

  • 2
    点赞
  • 0
    评论
  • 14
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

参与评论 您还未登录,请先 登录 后发表或查看评论
©️2022 CSDN 皮肤主题:1024 设计师:我叫白小胖 返回首页

打赏作者

Ler A

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值