您的位置:首页 > 理论基础 > 数据结构算法

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

2017-10-25 15:40 375 查看
/*
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来进行基本的输入输出等操作
b627

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






内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: