一元多项式相加减(数据结构)

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/gu305524073/article/details/78342239
/*
  Name: 类C通用模块 
  Copyright: BTC 2004
  Author: Zhuang Bo
  Date: 2004
  Description:  
    [Constants]
       TRUE/FALSE/OK/ERROR/INFEASIBLE/DS_OVERFLOW      
    [Types]  
       Status      
    [Functions]
       max(a,b)
       min(a,b)
       read(char/int/float/double/char*)
       write(char/int/float/double/char*)
*/

#ifndef _DS_H_
#define _DS_H_

// 函数结果状态代码
const int TRUE      = 1;
const int FALSE     = 0;
const int OK        = 1;
const int ERROR     = 0;
const int INFEASIBLE    = -1;
const int DS_OVERFLOW      = -2;

// Status 是函数的类型,其值是函数结果状态代码
typedef int Status;

//基本函数
#define max(a,b) (((a)<(b))?(b):(a)) 
#define min(a,b) (((a)<(b))?(a):(b))

#include <stdio.h>
//不用格式串的输入输出(目的是为了方便书写算法)
//    比如输入一个基本类型(char, int, float, double, char*)的
//    变量 x,可以直接用 read(x);输入,而打印则用 write(x);。 
//    对于自定义类型,可以继续扩充。
inline void readM(char& e)     { getchar(); e = getchar(); }
inline void read(char& e)     {  e = getchar(); }
inline void read(int& e)      { scanf("%d", &e); }
inline void read(float& e)    { scanf("%f", &e); }
inline void read(double& e)   { scanf("%lf", &e); }
inline void read(char *e)     { gets(e); }
inline void read(float &e1, int &e2)  {scanf("%f%d",&e1,&e2);}
inline void write(char e)     { printf("%c", e); }
inline void write(int e)      { printf("%d", e); }
inline void write(float e)    { printf("%f", e); }
inline void write(double e)   { printf("%lf", e); }
inline void write(char *e)    { printf("%s",e); }



#endif  // _DS_H_


/* 
   Name: Polynomial.h
   Author: WangHeng
   Data: 3 / 4 / 2017 ;
   Description: 1)调用LinkList.h头文件,用实现链表的各种功能
                  来创建一元多项式的各种算法实现;
                2)调用ds.h来进行基本的输入输出等操作
                3)头文件Polynomial.h主要完成一元多项式的各种操作

*/

#ifndef POLYNOMIAL_H_INCLUDED
#define POLYNOMIAL_H_INCLUDED

#ifndef ElemType
#define ElemType int //数据类型默认为int
#define ELEMTYPE_TAG
#endif 

#include "ds.h"
#include "LinkList.h"

typedef LinkList polynomial;

/*************************************************************************
*  基本操作的函数原型说明
*************************************************************************/

//输入m项的系数和指数,建立表示一元多项式的有序链表P
void CreatPolyn(polynomial &P, int m);

//销毁一元多项式P
void DestroyPolyn(polynomial &P);

//打印输出一元多项式P
void PrintPolyn(polynomial P);

//返回一元多项式P中的项数
int PolynLength(polynomial P);

//完成多项式相加运算,即:Pa = Pa + Pb,并销毁一元多项式Pb
void AddPolyn(polynomial &Pa,polynomial &Pb);

//完成多项式相减运算,即:Pa = Pa - Pb,并销毁一元多项式Pb
void SubtractPolyn(polynomial &Pa,polynomial &Pb);

//完成多项式相乘运算,即:Pa = Pa * Pb,并销毁一元多项式Pb
void MultiplyPolyn(polynomial &Pa,polynomial &Pb);

//完成多项式的求导函数,即:Pa = Pa' 
void Derivative(polynomial &P);

//完成多项式的积分函数, Pa = ∫Pa' dx 
void Calculus (polynomial &P);


/*********************************************************************
* 基本操作的算法描述和实现
*********************************************************************/

//创建一元多项式P,当输入的指数和系数都为0时,输入结束。
// 一元多项式就被创建 。   
void CreatPolyn(polynomial &P)
{

    InitList(P);
    printf(" \n输入系数和指数:\n");
    read(P->coef,P->expn);     //输入系数和指数
                               //这里的read读的是ds.h通用模板中的inline void read(float &e1, int &e2)  {scanf("%f%d",&e1,&e2);}
                               //通用模板中的read可以是任意类型的
    //-------------------TODO------------------//
    while(P->coef!=0||P->expn!=0){
           ListInsert(P,1,P->coef,P->expn);
           printf("\n输入系数的指数:\n");
           read(P->coef,P->expn);
    }
    //------------初始化表达式,不断输入系数和指数,直到读到0,0为止----------//

}

//销毁一元多项式P
void DestroyPolyn(polynomial &P)
{
    DestroyList(P);   //调用LinkList.h头文件中的销毁函数

}

//打印输出一元多项式P
void PrintPolyn(polynomial P)
{
    printf("打印一员多项式的各系数和指数\n ");
    UnionList(P);   //用来合并在一元多项式计算结果中具有相同指数的项
    PrintLinkList(P);   
}

//返回一元多项式P中的项数
int PolynLength(polynomial P)
{
    return ListLength(P);    //合并后的一元多项式的项数
}

//完成多项式相加运算,即:Pa = Pa + Pb,并销毁一元多项式Pb
void AddPolyn(polynomial &Pa,polynomial &Pb)
{
    UnionList(Pa);   //合并一元多项式中具有
    UnionList(Pb);   //相同指数的项


    for (int i=1; i<=ListLength(Pb); i++)
    {
        float co;
        int ex;
        GetElem(Pb, i, co, ex);
        if(LocateElem(Pa, ex) > 0)    //判断Pa中是否具有Pb中相同指数的项,
        {                             //如果有,进行相加 
            int j = LocateElem(Pa, ex);   //记录Pa中相同项的位置
            int k = 0;
            polynomial s = Pa;
            while(k < j)     //查找这一位置
            {
        //-------------------TODO------------------//
             s=s->next;
             k++;
            }

            s->coef += co;    //系数项相加

        }
        else       //不存在相同的指数,将Pb中的该项插入Pa
            ListInsert(Pa, 1, co, ex);
    }
    DestroyList(Pb);    //销毁Pb  
}



//完成多项式相减运算,即:Pa = Pa - Pb,并销毁一元多项式Pb
void SubtractPolyn(polynomial &Pa,polynomial &Pb)
{
    UnionList(Pa);   //合并一元多项式中具有
    UnionList(Pb);   //相同指数的项


    for (int i=1; i<=ListLength(Pb); i++)
    {
        float co;
        int ex;
        GetElem(Pb, i, co, ex);
        if(LocateElem(Pa, ex) > 0)    //判断Pa中是否具有Pb中相同指数的项,
        {                             //如果有,进行相加 
            int j = LocateElem(Pa, ex);   //记录Pa中相同项的位置
            int k = 0;
            polynomial s = Pa;
            while(k < j)     //查找这一位置
            {
        //-------------------TODO------------------//
             s=s->next;
             k++;
            }

            s->coef -= co;    //系数项相加

        }
        else       //不存在相同的指数,将Pb中的该项插入Pa
            ListInsert(Pa, 1, co, ex);
    }
    DestroyList(Pb);    //销毁Pb  

}

//完成多项式相乘运算,即:Pa = Pa * Pb,并销毁一元多项式Pb
void MultiplyPolyn(polynomial &Pa,polynomial &Pb)
{
        UnionList(Pa);   //合并一元多项式中具有
    UnionList(Pb);   //相同指数的项


    for (int i=1; i<=ListLength(Pb); i++)
    {
        float co;
        int ex;
        GetElem(Pb, i, co, ex);
        if(LocateElem(Pa, ex) > 0)    //判断Pa中是否具有Pb中相同指数的项,
        {                             //如果有,进行相加 
            int j = LocateElem(Pa, ex);   //记录Pa中相同项的位置
            int k = 0;
            polynomial s = Pa;
            while(k < j)     //查找这一位置
            {
        //-------------------TODO------------------//
             s=s->next;
             k++;
            }

            s->coef *= co;    //系数项相加
            s->expn+=ex;
        }
        else       //不存在相同的指数,将Pb中的该项插入Pa
            ListInsert(Pa, 1, co, ex);
    }
    DestroyList(Pb);    //销毁Pb
}


//完成多项式的求导函数,即:Pa = Pa' 
void Derivative(polynomial &P)
{

}

//完成多项式的积分函数, Pa = ∫Pa' dx 
void Calculus (polynomial &P)
{

}

#ifdef ELEMTYPE_TAG
#undef ElemType
#undef ELEMTYPE_TAG
#endif

#endif  // POLYNOMIAL_H_INCLUDED

这里写图片描述

这里写图片描述
这里写图片描述

展开阅读全文

没有更多推荐了,返回首页