[基本功能]
- 输入并建立多项式
- 输出多项式
- 两个多项式相加
- 两个多项式相减
- 两个多项式相乘
- 计算多项式在x处的值
- 求多项式a的导函数
运行基本思路
- 运行程序后需要先输入第一个多项式的项数,如3x4 +2.1x2 输入2
- 选择需要进行的功能
- 根据选择的功能按提示再次输入数据即可
[完整代码]
#include<stdio.h>
#include<stdlib.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_s("%d", &n);
L = (LNode*)malloc(sizeof(LNode));
L->next = NULL;
printf("接下来输入系数和指数(空格隔开)\n");
for (i = 0; i<n; i++)
{
p = (LNode *)malloc(sizeof(LNode));
scanf_s("%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处的值\n");
printf("6.求多项式a的导函数\n");
}
void display(Polynomial *L)
{
printf("多项式内容: \n");
LNode *p = L->next;
while (p != NULL)
{
printf("%f, %d\n", p->coef, p->exp);
p = p->next;
}
}
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)
{
LNode *u = q->next;
q->next = r->next;
r->next = q;
r = q;
q = u;
}
else if (q->exp < p->exp)
{
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)
{
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)
{
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)
{
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)
{
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 = 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 getValue(Polynomial *L)
{
int x;
printf("输入一个值: \n");
scanf_s("%d", &x);
float sum = 0;
LNode *p = L->next;
while (p != NULL)
{
int mul_x = 1;
for (int i = 1; i <= p->exp; i++)
mul_x *= x;
sum += (mul_x * p->coef);
p = p->next;
}
printf("多项式值为: %.4f\n", sum);
}
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;
}
int main()
{
int sign;
Polynomial *La = NULL, *Lb = NULL, *Lc = NULL;
printf("请输入第一个多项式: \n");
create(La);
sort(La);
select();
scanf_s("%d", &sign);
switch (sign)
{
case 1:
display(La);
break;
case 2:
Add(La, Lb, Lc);
printf("多项式相加的和为: \n");
display(Lc);
break;
case 3:
Subtract(La, Lb, Lc);
printf("多项式相减的差为: \n");
display(Lc);
break;
case 4:
Multiply(La, Lb, Lc);
Del(Lc);
sort(Lc);
display(Lc);
break;
case 5:
getValue(La);
break;
case 6:
Diff(La, Lb);
sort(Lb);
display(Lb);
break;
}
system("pause");
return 0;
}
程序运行结果
![在这里插入图片描述](https://img-blog.csdnimg.cn/4c655690b3284408a6123a57ea3b9a28.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6JSs6I-c5LiN6I-c5ZWK,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)