一、实验目的
-
定义线性表的链式存储
-
实现对线性表的基本操作和具体函数定义
二、实验内容
-
定义线性表的链式存储
-
实现对线性表的基本操作和具体函数定义
-
定义输出一元多项式的函数
-
编写主程序调用上面的函数实现一元多项式的加减运算
三、实验数据输入输出要求
输入示例:
3
2 3
3 4
5 7
5
2 1
3 3
-3 4
4 6
5 7
(说明:第一个数据3表示该第一个一元多项式的项数为3,后面的2 3 表示第一项的系数为2 指数为3;按指数递增的次序输入)
输出示例:
一元多项式1: 2x(3)+3x(4)+5x(7)
一元多项式2: 2x(1)+3x(3)-3x(4)+4x(6)+5x(7)
加的结果:2x(1)+5x(3) +4x(6)+10x(7)
减的结果:-2x(1)-1x(3)+6x(4)-4x(6)
四、程序代码
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <math.h>
typedef struct polynode
{ float coef; //系数
int expn; //指数
struct polynode *next;
} polynode,*polylist;
void poly_create(polylist &L); //创建链表
void poly_display(polylist L); //显示链表内容
void poly_add(polylist La, polylist Lb, polylist &Lc); //多项式相加
void poly_subtract(polylist La, polylist Lb, polylist &Lc); //多项式相减
int main()
{
polylist La,Lb,Lc,Ld;
poly_create(La);
poly_display(La);
poly_create(Lb);
poly_display(Lb);
poly_add(La, Lb, Lc);
poly_display(Lc);
poly_subtract(La, Lb, Ld);
poly_display(Ld);
}
void poly_create(polylist& L)
{
polylist p, q;
int n_Count, i, expn;
float coef;
L = p = q = NULL;
scanf("%d", &n_Count);
if (n_Count > 0)
{
p = (polylist)malloc(sizeof(polynode));
scanf("%f%d", &coef, &expn);
p->coef = coef;
p->expn = expn;
p->next = NULL;
L = q = p;
}
for (i = 1; i < n_Count; i++)
{
p = (polylist)malloc(sizeof(polynode));
scanf("%f%d", &coef, &expn);
p->coef = coef;
p->expn = expn;
p->next = NULL;
q->next = p;
q = p;
}
}
void poly_display(polylist L)
{
polylist p;
p = L;
if (p != NULL)
{
printf("%.2fx(%d)", p->coef, p->expn);
p = p->next;
}
while (p != NULL)
{
printf("%+.2fx(%d)", p->coef, p->expn);
p = p->next;
}
printf("\n");
}
void poly_add(polylist La, polylist Lb, polylist& Lc)
{
polylist p, p1, p2, p3;
bool Flag = false;
p1 = La;
p2 = Lb;
Lc = p3 = p = (polylist)malloc(sizeof(polynode));
p->next = NULL;
while (p1 != NULL || p2 != NULL)
{
if (Flag)
{
p = (polylist)malloc(sizeof(polynode));
p->next = NULL;
}
else
Flag = true;
if (p1 != NULL && (p2 == NULL || p1->expn < p2->expn))
{
p->coef = p1->coef;
p->expn = p1->expn;
p1 = p1->next;
}
else if (p1 == NULL || p1->expn > p2->expn)
{
p->coef = p2->coef;
p->expn = p2->expn;
p2 = p2->next;
}
else
{
p->expn = p1->expn;
if (fabs(p1->coef + p2->coef) < 1E-6)
{
p1 = p1->next;
p2 = p2->next;
Flag = false;
continue;
}
else
{
p->coef = p1->coef + p2->coef;
p1 = p1->next;
p2 = p2->next;
}
}
if(p3!=p)
p3->next = p;
p3 = p;
}
if (Flag == false && Lc == p)
Lc = NULL;
if (Flag == false)
{
free(p);
p = NULL;
}
}
void poly_subtract(polylist La, polylist Lb, polylist& Lc)
{
polylist p, p1, p2, p3;
int sign = -1;
bool Flag = false;
p1 = La;
p2 = Lb;
Lc = p3 = p = (polylist)malloc(sizeof(polynode));
p->next = NULL;
while (p1 != NULL || p2 != NULL)
{
if (Flag)
{
p = (polylist)malloc(sizeof(polynode));
p->next = NULL;
}
else
Flag = true;
if (p1 != NULL && (p2 == NULL || p1->expn < p2->expn))
{
p->coef = p1->coef;
p->expn = p1->expn;
p1 = p1->next;
}
else if (p1 == NULL || p1->expn > p2->expn)
{
p->coef = sign * p2->coef;
p->expn = p2->expn;
p2 = p2->next;
}
else
{
p->expn = p1->expn;
if (fabs(p1->coef - p2->coef) < 1E-6)
{
p1 = p1->next;
p2 = p2->next;
Flag = false;
continue;
}
else
{
p->coef = p1->coef - p2->coef;
p1 = p1->next;
p2 = p2->next;
}
}
if (p3 != p)
p3->next = p;
p3 = p;
}
if (Flag == false && Lc == p)
Lc = NULL;
if (Flag == false)
{
free(p);
p = NULL;
}
}