【问题描述】: 设计一个一元稀疏多项式运算器,能实现对一元稀疏多项式的创建、销毁、清空、复制、 四则运算、打印输出、求导、求幂、求定积分等功能。
【实验目的】 线性表是最简单、最常用的一种数据结构。一元稀疏多项式可以用一个线性链表表示。 指针的概念和使用方法,是程序设计的基本功,同时也是学生学习程序设计时深感困难知识 点。这个问题不解决,直接影响本课程后续内容的学习。本实验的目的在于训练其操作指针的能力,进而掌握线性链表的特性和常用的操作算法。
【基本要求】 要求一元稀疏多项式运算器能实现以下基本功能:(1) 创建多项式 (2) 显示多项式 (3) 销毁多项式 (4) 清空多项式 (5) 复制多项式 (6) 两个稀疏多项式的求和 (7) 两个稀疏多项式的求差 (8) 两个稀疏多项式的求积 (9) 求稀疏多项式的 n 阶导函数 (10)计算稀疏多项式在 x=a 处的值 (11)计算稀疏多项式在区间[a..b]上的定积分 (12)稀疏多项式的 n 次幂
//一元稀疏多项式计算器
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
typedef struct LNode
{
float coef; //系数
int exp; //指数
struct LNode *next;
}LNode, Polynomial;
//创建一个多项式
void create(Polynomial *&L)
{
int i, n;
LNode *p;
printf("请输入该多项式的项数: \n");
scanf("%d", &n);
L = (LNode*)malloc(sizeof(LNode));
L->next = NULL;
printf("接下来输入系数和指数(空格隔开)\n");
for (i = 0; i<n; i++)
{
p = (LNode *)malloc(sizeof(LNode));
scanf("%f %d", &p->coef, &p->exp);
p->next = L->next;
L->next = p;
}
}
//将多项式按指数降序排序
void sort(Polynomial *&L)
{
LNode *r, *p, *q, *u;
p = L->next;
L->next = NULL;
while (p != NULL)
{
r = L;
q = L->next;
while (q != NULL && (q->exp > p->exp))
{
r = q;
q = q->next;
}
u = p->next;
r->next = p;
p->next = q;
p = u;
}
}
//输入第二个多项式
void insert_next(Polynomial *&L)
{
printf("请输入第二个多项式: \n");
create(L);
sort(L);
}
//选择进行何种操作
void select()
{
printf("请选择操作方式: \n");
printf("1.输出多项式\n");
printf("2.两个多项式相加\n");
printf("3.两个多项式相减\n");
printf("4.两个多项式相乘\n");
printf("5.计算多项式在x=a处的值\n");
printf("6.求多项式a的导函数\n");
printf("7,销毁多项式\n");
printf("8,清空多项式\n");
printf("9,复制多项式\n");
printf("10,求多项式在[a,b]上的定积分\n");
printf("11,求多项的n阶导函数\n");
printf("12,稀疏多项式的n次幂\n");
}
//显示多项式,不显示x
void display(Polynomial *L)
{
printf("多项式内容: \n");
LNode *p = L->next;
while (p != NULL)
{
printf("%f, %d\n", p->coef, p->exp);
p = p->next;
}
}
//显示多项式,显示x
void Print(Polynomial *head)
{
if(head)
{
Polynomial *p=head;
if(p->next)
{
p=p->next;
while(p&&p->next)
{
if(!p->coef)
p=p->next;
else if(p->exp>1)
{
if(p->coef!=1&&p->coef>0)
{
printf("%fx^%d+",p->coef,p->exp);
p=p->next;
}
else if(p->coef!=-1&&p->coef<0)
{
printf("(%fx^%d)+",p->coef,p->exp);
p=p->next;
}
else if(p->coef==-1)
{
printf("(-x^%d)+",p->exp);
p=p->next;
}
else
{
printf("x^%d+",p->exp);
p=p->next;
}
}
else if(p->coef!=1&&p->coef>0)
{
printf("%fx+",p->coef);
p=p->next;
}
else if(p->coef==-1)
{
printf("(-x)+");
p=p->next;
}
else if(p->coef!=-1&&p->coef<0)
{
printf("(%fx)+",p->coef);
p=p->next;
}
else
{
printf("x+");
p=p->next;
}
}
if(p->exp)
{
if(p->exp==1)
{
if(p->coef!=-1&&p->coef<0)
printf("(%fx)",p->coef);
else if(p->coef==-1)
printf("(-x)");
else if(p->coef!=1&&p->coef>0)
printf("%fx",p->coef);
else
printf("x");
}
else if(p->coef<0&&p->coef!=-1)
printf("(%fx^%d)",p->coef,p->exp);
else if(p->coef==-1)
printf("(-x^%d)",p->exp);
else if(p->coef!=1&&p->coef>0)
printf("%fx^%d",p->coef,p->exp);
else
printf("x^%d",p->exp);
}
else
{
if(p->coef>=0)
printf("%f",p->coef);
else if(p->coef<0)
printf("(%f)",p->coef);
}
}
}
else
printf("多项式无法打印");
}
//多项式相加
void Add(Polynomial *L1, Polynomial *&L2, Polynomial *&L3)
{
insert_next(L2);
LNode *p = L1->next;
LNode *q = L2->next;
L3 = (LNode *)malloc(sizeof(LNode));
L3->next = NULL;
LNode *r = L3;
while (p != NULL&&q != NULL)
{
if (p->exp < q->exp)//p的指数小于q的指数,q先进去
{
LNode *u = q->next;
q->next = r->next;
r->next = q;
r = q;
q = u;
}
else if (q->exp < p->exp)//q的指数小于p的指数,p先进去
{
LNode *u = p->next;
p->next = r->next;
r->next = p;
r = p;
p = u;
}
else//两指数相等,系数相加
{
float temp = p->coef + q->coef;
if (temp != 0.0)
{
LNode *m = (LNode *)malloc(sizeof(LNode));
m->coef = temp;
m->exp = p->exp;
m->next = r->next;
r->next = m;
r = m;
}
p = p->next;
q = q->next;
}
}
while (q != NULL)
{
LNode *u = q->next;
q->next = r->next;
r->next = q;
r = q;
q = u;
}
while (p != NULL)
{
LNode *u = p->next;
p->next = r->next;
r->next = p;
r = p;
p = u;
}
r->next = NULL;
}
//多项式相减
void Subtract(Polynomial *L1, Polynomial *&L2, Polynomial *&L3)
{
insert_next(L2);
LNode *p = L1->next;
LNode *q = L2->next;
L3 = (LNode *)malloc(sizeof(LNode));
L3->next = NULL;
LNode *r = L3;
while (p != NULL&&q != NULL)
{
if (p->exp < q->exp)//p的指数小于q的指数,q先进去,对系数进行更改
{
float temp = (-1) * q->coef;
LNode *m = (LNode *)malloc(sizeof(LNode));
m->coef = temp;
m->exp = p->exp;
r->next = m->next;
r->next = m;
r = q;
q = q->next;
}
else if (q->exp < p->exp)//q的指数小于p的指数,p先进去
{
LNode *u = p->next;
r->next = p->next;
r->next = p;
r = p;
p = u;
}
else//两指数相等,系数相加
{
float temp = p->coef - q->coef;
if (temp != 0.0)
{
LNode *m = (LNode *)malloc(sizeof(LNode));
m->coef = temp;
m->exp = p->exp;
r->next = m->next;
r->next = m;
r = m;
}
p = p->next;
q = q->next;
}
}
while (q != NULL)//同理,q中有剩余,则改变符号
{
float temp = (-1) * q->coef;
LNode *m = (LNode *)malloc(sizeof(LNode));
m->coef = temp;
m->exp = p->exp;
r->next = m->next;
r->next = m;
r = q;
q = q->next;
}
while (p != NULL)
{
LNode *u = p->next;
r->next = p->next;
r->next = p;
r = p;
p = u;
}
r->next = NULL;
}
//多项式相乘
void Multiply(Polynomial *L1, Polynomial *&L2, Polynomial *&L3)
{
LNode *p = L1->next;
LNode *q = L2->next;
L3 = (LNode *)malloc(sizeof(LNode));
L3->next = NULL;
LNode *r = L3;
while (p != NULL)
{
q = L2->next;
while (q != NULL)
{
int temp_coef = p->coef * q->coef;
int temp_exp = p->exp + q->exp;
LNode *m = L3->next;
while (m != NULL)
{
if (m->exp != temp_exp)
m = m->next;
else
{
m->coef += temp_coef;
break;
}
}
if (m == NULL)
{
LNode *s = (LNode *)malloc(sizeof(LNode));
s->coef = temp_coef;
s->exp = temp_exp;
r->next = s->next;
r->next = s;
r = s;
r->next = NULL;
}
q = q->next;
}
p = p->next;
}
r->next = NULL;
}
//去除系数为空的项
void Del(Polynomial *&L)
{
LNode *p = L->next;
LNode *r = L;
while (p != NULL)
{
if (p->coef == 0)
r->next = p->next;
r = p;
p = p->next;
}
}
//多项式求值
void Evaluate(Polynomial* L)
{
if(!L->next||!L)
printf("\n进行运算的多项式不能没有项\n");
else
{
Polynomial *p=L->next;
float x,val=0;
printf("请输入未知数的值");
scanf("%f",&x);
printf("\n");
while(p)
{
double temp=p->exp;
val+=p->coef*pow(x,temp);
p=p->next;
}
printf("x=%f时,多项式的值为%f\n",x,val);
}
}
//多项式求导
void Diff(Polynomial *L1, Polynomial *&L2)
{
L2 = (LNode *)malloc(sizeof(LNode));
L2->next = NULL;
LNode *p = L1->next;
LNode *r = L2;
while (p != NULL)
{
if (p->exp != 0)
{
float coef1 = p->exp * p->coef;
int exp1 = p->exp - 1;
LNode *m = (LNode *)malloc(sizeof(LNode));
m->coef = coef1;
m->exp = exp1;
r->next = m->next;
r->next = m;
r = m;
}
p = p->next;
}
r->next = NULL;
}
//销毁稀疏多项式
void Destroy(Polynomial* L){
Polynomial *p,*q;
p=L;
while(p!=NULL)
{
q=p->next;
free(p);
p=q;
}
L=NULL;
}
//清空稀疏多项式
void Clear(Polynomial* L)//多项式链表清空
{
Polynomial *p;
p=L->next;
L->exp=0;
Destroy(p);
L->next=NULL;
}
//复制稀疏多项式
void Copy(Polynomial* L,Polynomial* &q) {
q = (Polynomial*)malloc(sizeof(Polynomial));
q->next = NULL;
Polynomial *p = L->next;
while (p != NULL) {
LNode *newNode = (LNode*)malloc(sizeof(LNode));
newNode->coef = p->coef;
newNode->exp = p->exp;
newNode->next = q->next;
q->next = newNode;
p = p->next;
}
}
//多项式求导
void Differentiate(Polynomial *L)
{
LNode *p = L->next;
LNode *q = NULL;
while (p != NULL)
{
if (p->exp != 0)
{
LNode *new_node = (LNode *)malloc(sizeof(LNode));
new_node->coef = p->coef * p->exp;
new_node->exp = p->exp - 1;
new_node->next = NULL;
if (q == NULL)
{
L->next = new_node;
q = new_node;
}
else
{
q->next = new_node;
q = new_node;
}
}
p = p->next;
}
}
//反复调用求导的函数求高阶导
void Derivation(Polynomial* head)
{
int n,i;
printf("请输入求导阶数\n");
scanf("%d",&n);
Polynomial* node=head;
for(i=0;i<n;i++){
Differentiate(node);
}
Print(node);
}
//求多项式的n次幂
void Power(Polynomial *L, int n) {
Polynomial *result = (Polynomial *)malloc(sizeof(Polynomial));
result->next = NULL;
Polynomial *temp = (Polynomial *)malloc(sizeof(Polynomial));
temp->next = NULL;
printf("请输入n的值\n");
scanf("%d",&n);
result = L;
for (int i = 1; i < n; i++) {
Multiply(result, L, temp);
result = temp;
}
LNode *p = result->next;
while (p != NULL) {
p=p->next;
Print(result);
}
}
//求定积分
void Integrate(Polynomial *L, float a, float b)
{
printf("请输入a,b的值\n");
scanf("%f %f",&a,&b);
LNode *p = L->next;
float val = 0;
while (p)
{
val += (p->coef / (p->exp + 1)) * pow(b, p->exp + 1) - (p->coef / (p->exp + 1)) * pow(a, p->exp + 1);
p = p->next;
}
printf("积分的值为%.3f\n",val);
}
int main()
{
int sign;
Polynomial *La = NULL, *Lb = NULL, *Lc = NULL, *Ld=NULL;
printf("请输入多项式一: \n");
create(La);
sort(La);
int k=0;
while(k<15){
select();
scanf("%d", &sign);
switch (sign)
{
case 1:
Print(La);
break;
case 2:
Add(La, Lb, Lc);
printf("多项式的和为: \n");
Print(Lc);
break;
case 3:
Subtract(La, Lb, Lc);
printf("多项式的差为: \n");
Print(Lc);
break;
case 4:
insert_next(Lb);
Multiply(La, Lb, Lc);
Del(Lc); //删去系数为0的项
sort(Lc);
Print(Lc);
break;
case 5:
Evaluate(La);
break;
case 6:
Diff(La, Lb);
sort(Lb);
Print(Lb);
break;
case 7:
Destroy(La);
printf("已销毁\n");
break;
case 8:
Clear(La);
printf("已清空");
break;
case 9:
Copy(La,Lb);
Print(Lb);
break;
case 10:
int a,b;
Integrate(La,a,b);
break;
case 11:
Derivation(La);
Print(La);
break;
case 12:
int n;
Power(La,n);
break;
}
printf("\n");
system("pause");
k++;
}
return 0;
}