实验1 线性表操作(一元多项式运算)

一、实验目的
  1. 定义线性表的链式存储

  2. 实现对线性表的基本操作和具体函数定义

二、实验内容
  1. 定义线性表的链式存储

  2. 实现对线性表的基本操作和具体函数定义

  3. 定义输出一元多项式的函数

  4. 编写主程序调用上面的函数实现一元多项式的加减运算

三、实验数据输入输出要求
输入示例:
3
2 3
3 4
5 7
5
2 1
3 3
-3 4
4 6
5 7

(说明:第一个数据3表示该第一个一元多项式的项数为3,后面的2 3 表示第一项的系数为2 指数为3;按指数递增的次序输入)

输出示例:

一元多项式1: 2x(3)+3x(4)+5x(7)

一元多项式2: 2x(1)+3x(3)-3x(4)+4x(6)+5x(7)

加的结果:2x(1)+5x(3) +4x(6)+10x(7)

减的结果:-2x(1)-1x(3)+6x(4)-4x(6)

四、程序代码
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <math.h>
typedef  struct  polynode
 {   float    coef;      //系数
     int     expn;      //指数
     struct  polynode  *next;
  } polynode,*polylist;

void poly_create(polylist &L);   //创建链表
void poly_display(polylist L);   //显示链表内容
void poly_add(polylist La, polylist Lb, polylist &Lc);       //多项式相加 
void poly_subtract(polylist La, polylist Lb, polylist &Lc);    //多项式相减

int main()
{  
polylist La,Lb,Lc,Ld;
poly_create(La);
poly_display(La);
poly_create(Lb);
poly_display(Lb);
poly_add(La, Lb, Lc);
poly_display(Lc); 
poly_subtract(La, Lb, Ld);
poly_display(Ld);
}

void poly_create(polylist& L)
{
    polylist p, q;
    int n_Count, i, expn;
    float coef;

    L = p = q = NULL;
    scanf("%d", &n_Count);
    if (n_Count > 0)
    {
        p = (polylist)malloc(sizeof(polynode));
        scanf("%f%d", &coef, &expn);
        p->coef = coef;
        p->expn = expn;
        p->next = NULL;
        L = q = p;
    }
    for (i = 1; i < n_Count; i++)
    {
        p = (polylist)malloc(sizeof(polynode));
        scanf("%f%d", &coef, &expn);
        p->coef = coef;
        p->expn = expn;
        p->next = NULL;
        q->next = p;
        q = p;
    }

}

void poly_display(polylist L)
{
    polylist p;

    p = L;
    if (p != NULL)
    {
        printf("%.2fx(%d)", p->coef, p->expn);
        p = p->next;
    }
    while (p != NULL)
    {
        printf("%+.2fx(%d)", p->coef, p->expn);
        p = p->next;
    }
    printf("\n");

}

void poly_add(polylist La, polylist Lb, polylist& Lc)
{
    polylist p, p1, p2, p3;
    bool Flag = false;

    p1 = La;
    p2 = Lb;

    Lc = p3 = p = (polylist)malloc(sizeof(polynode));
    p->next = NULL;

    while (p1 != NULL || p2 != NULL)
    {
        if (Flag)
        {
            p = (polylist)malloc(sizeof(polynode));
            p->next = NULL;
        }
        else
            Flag = true;

        if (p1 != NULL && (p2 == NULL || p1->expn < p2->expn))
        {
            p->coef = p1->coef;
            p->expn = p1->expn;
            p1 = p1->next;
        }
        else if (p1 == NULL || p1->expn > p2->expn)
        {
            p->coef = p2->coef;
            p->expn = p2->expn;
            p2 = p2->next;
        }
        else
        {
            p->expn = p1->expn;
            if (fabs(p1->coef + p2->coef) < 1E-6)
            {
                p1 = p1->next;
                p2 = p2->next;
                Flag = false;
                continue;
            }
            else
            {
                p->coef = p1->coef + p2->coef;
                p1 = p1->next;
                p2 = p2->next;
            }
        }

        if(p3!=p)
            p3->next = p;
        p3 = p;
    }

    if (Flag == false && Lc == p)
        Lc = NULL;
    if (Flag == false)
    {
        free(p);
        p = NULL;
    }

}

void poly_subtract(polylist La, polylist Lb, polylist& Lc)
{
    polylist p, p1, p2, p3;
    int sign = -1;
    bool Flag = false;

    p1 = La;
    p2 = Lb;

    Lc = p3 = p = (polylist)malloc(sizeof(polynode));
    p->next = NULL;

    while (p1 != NULL || p2 != NULL)
    {
        if (Flag)
        {
            p = (polylist)malloc(sizeof(polynode));
            p->next = NULL;
        }
        else
            Flag = true;

        if (p1 != NULL && (p2 == NULL || p1->expn < p2->expn))
        {
            p->coef = p1->coef;
            p->expn = p1->expn;
            p1 = p1->next;
        }
        else if (p1 == NULL || p1->expn > p2->expn)
        {
            p->coef = sign * p2->coef;
            p->expn = p2->expn;
            p2 = p2->next;
        }
        else
        {
            p->expn = p1->expn;
            if (fabs(p1->coef - p2->coef) < 1E-6)
            {
                p1 = p1->next;
                p2 = p2->next;
                Flag = false;
                continue;
            }
            else
            {
                p->coef = p1->coef - p2->coef;
                p1 = p1->next;
                p2 = p2->next;
            }
        }

        if (p3 != p)
            p3->next = p;
        p3 = p;
    }

    if (Flag == false && Lc == p)
        Lc = NULL;
    if (Flag == false)
    {
        free(p);
        p = NULL;
    }

}

五、运行结果及分析

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值