函数声明(poly.h头文件)
//一元多项式的链式表达,利用带头节点的单链表实现
//多项式的插入和删除操作是比较频繁.用链式结构比顺序结构更好
//链表按照指数升序排列
typedef struct
{
double cofe;//系数
int expn;//指数
}term;//存放系数和指数的数对
typedef struct PNode
{
term data;
struct PNode* next;
}PNode, * Poly;//Poly == PNode *
//初始化
void InitPoly(Poly po);
//插入数据,cofe:系数,expn:指数.插入遵循指数升序
bool Insert(Poly po, double cofe, int expn);
//输出数据
void Show(Poly po);
//销毁多项式
void Destroy(Poly po);
//多项式加法,po1 += po2;
bool Add(Poly po1, Poly po2);
//多项式减法,po1 -= po2;
bool Sub(Poly po1, Poly po2);
//多项式乘法,po1 *= po2;
bool Mutil(Poly po1, Poly po2);
函数定义(poly.cpp文件)
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
#include"poly.h"
/*初始化*/
void InitPoly(Poly po)
{
assert(po != NULL);
if (po == NULL)
{
return;
}
po->next = NULL;
}
//在多项式po里面查找指数为expn的前驱
static PNode* SearchPrio(Poly po, int expn)
{
PNode* p;
for (p = po; p->next != NULL; p = p->next)
{
if (p->next->data.expn >= expn)
{
return p;
//break;
}
}
return p;
}
//插入数据, cofe:系数, expn : 指数.插入遵循指数升序
bool Insert(Poly po, double cofe, int expn)
{
#define EPS 0.0000001
PNode* p = SearchPrio(po, expn);
PNode* q;
if (p->next != NULL && p->next->data.expn == expn)//合并同类项
{
q = p->next;
q->data.cofe += cofe;
if (-EPS <= q->data.cofe && q->data.cofe <= EPS)//系数为0就删除
{
p->next = q->next;
free(q);
}
}
else//创建新节点,插在p后面
{
q = (PNode*)malloc(sizeof(PNode));
q->data.cofe = cofe;
q->data.expn = expn;
q->next = p->next;
p->next = q;
}
return true;
}
//输出数据
void Show(Poly po)
{
PNode* p = po->next;
printf("%-4.1fx^%d", p->data.cofe, p->data.expn);
po = po->next;
for (p = po->next; p != NULL; p = p->next)
{
if (p->data.cofe < 0)
{
printf("%-4.1fx^%d", p->data.cofe, p->data.expn);
}
else
{
printf("+%-4.1fx^%d", p->data.cofe, p->data.expn);
}
}
printf("\n");
}
//销毁多项式
void Destroy(Poly po)
{
PNode* p ;
while (po->next != NULL)
{
p = po->next;
po->next = p->next;
free(p);
}
}
//多项式加法,po1 += po2;
bool Add(Poly po1, Poly po2)
{
if (po1 == NULL || po2 == NULL)
return false;
for (PNode* p = po2->next; p != NULL; p = p->next)
{
Insert(po1, p->data.cofe, p->data.expn);
}
return true;
}
//多项式减法,po1 -= po2;
bool Sub(Poly po1, Poly po2)
{
if (po1 == NULL || po2 == NULL)
return false;
for (PNode* p = po2->next; p != NULL; p = p->next)
{
p->data.cofe = -p->data.cofe;
Insert(po1, p->data.cofe, p->data.expn);
}
return true;
}
//多项式乘法,po1 *= po2;
bool Mutil(Poly po1, Poly po2)
{
if (po1 == NULL || po2 == NULL)
return false;
PNode po3;
InitPoly(&po3);
for (PNode*p2 = po2->next; p2 != NULL; p2 = p2->next)//遍历po2的所有项,将其乘以po1的所有项
{
for(PNode* p1 = po1->next; p1 != NULL; p1 = p1->next)
{
Insert(&po3, (p2->data.cofe * p1->data.cofe ), (p1->data.expn + p2->data.expn));
}
}
Destroy(po1);
po1->next = po3.next;
po3.next = NULL;
return true;
}