实现两个多项式相加&相减运算
- 算法思路:创建两个链表,其中包含数据域(系数、指数),以及指向下一个结点的指针域。将两个多项式链表按照指数递减的规则排序,对比两个链表中的数据,如果指数相等则进行相加/相减操作,如果指数不相等则复制该结点的值。
#include<stdio.h>
#include<malloc.h>
#define MAX 100
typedef struct
{
double coef;
int exp;
}PolyArray;
typedef struct pnode
{
double coef;
int exp;
struct pnode* next;
}PolyNode;
void CreatePolyR(PolyNode*& L, PolyArray a[], int n)
{
PolyNode* s, * r;
int i;
L = (PolyNode*)malloc(sizeof(PolyNode));
L->next = NULL;
r = L;
for (i = 0; i < n; i++)
{
s = (PolyNode*)malloc(sizeof(PolyNode));
s->coef = a[i].coef;
s->exp = a[i].exp;
r->next = s;
r = s;
}
r->next = NULL;
}
void DispPoly(PolyNode* L)
{
PolyNode* p = L->next;
while (p != NULL)
{
if (p->coef > 0) printf("+");
if (p->exp == 0) printf("%g", p->coef);
else if (p->exp == 1) printf("%gx", p->coef);
else printf("%gx^%d", p->coef, p->exp);
p = p->next;
}
printf("\n");
}
void DestoryPoly(PolyNode*& L)
{
PolyNode* pre = L, * p = pre->next;
while (p != NULL)
{
free(pre);
pre = p;
p = pre->next;
}
free(pre);
}
void Sort(PolyNode*& L)
{
PolyNode* p = L->next, * pre, * q;
if (p != NULL)
{
q = p->next;
p->next = NULL;
p = q;
while (p != NULL)
{
q = p->next;
pre = L;
while (pre->next != NULL && pre->next->exp > p->exp)
pre = pre->next;
p->next = pre->next;
pre->next = p;
p = q;
}
}
}
void Add(PolyNode* ha, PolyNode* hb, PolyNode*& hc)
{
PolyNode* pa = ha->next, * pb = hb->next, * s, * r;
double c;
hc = (PolyNode*)malloc(sizeof(PolyNode));
r = hc;
while (pa != NULL && pb != NULL)
{
if (pa->exp > pb->exp)
{
s = (PolyNode*)malloc(sizeof(PolyNode));
s->exp = pa->exp;
s->coef = pa->coef;
r->next = s;
r = s;
pa = pa->next;
}
else if(pa->exp < pb->exp)
{
s = (PolyNode*)malloc(sizeof(PolyNode));
s->exp = pb->exp;
s->coef = pb->coef;
r->next = s;
r = s;
pb = pb->next;
}
else
{
c = pa->coef + pb->coef;
if (c != 0)
{
s = (PolyNode*)malloc(sizeof(PolyNode));
s->exp = pa->exp;
s->coef = c;
r->next = s;
r = s;
}
pa = pa->next;
pb = pb->next;
}
}
if (pb != NULL) pa = pb;
while (pa != NULL)
{
s = (PolyNode*)malloc(sizeof(PolyNode));
s->exp = pa->exp;
s->coef = pa->coef;
r->next = s;
r = s;
pa = pa->next;
}
r->next = NULL;
}
void Sub(PolyNode* ha, PolyNode* hb, PolyNode*& hd)
{
PolyNode* pa = ha->next, * pb = hb->next, * s, * r;
double c;
hd = (PolyNode*)malloc(sizeof(PolyNode));
r = hd;
while (pa != NULL && pb != NULL)
{
if (pa->exp > pb->exp)
{
s = (PolyNode*)malloc(sizeof(PolyNode));
s->exp = pa->exp;
s->coef = pa->coef;
r->next = s;
r = s;
pa = pa->next;
}
else if (pa->exp < pb->exp)
{
s = (PolyNode*)malloc(sizeof(PolyNode));
s->exp = pb->exp;
s->coef = 0-pb->coef;
r->next = s;
r = s;
pb = pb->next;
}
else
{
c = pa->coef - pb->coef;
if (c != 0)
{
s = (PolyNode*)malloc(sizeof(PolyNode));
s->exp = pa->exp;
s->coef = c;
r->next = s;
r = s;
}
pa = pa->next;
pb = pb->next;
}
}
if (pb != NULL) pa = pb;
while (pa != NULL)
{
s = (PolyNode*)malloc(sizeof(PolyNode));
s->exp = pa->exp;
s->coef = pa->coef;
r->next = s;
r = s;
pa = pa->next;
}
r->next = NULL;
}
int main()
{
PolyNode* ha, * hb, * hc, * hd;
PolyArray a[] = { {3,1},{2,0},{1,3},{4,4} };
PolyArray b[] = { {3,4},{2,3},{1,0},{5,2},{ 3,6} };
CreatePolyR(ha, a, 4);
CreatePolyR(hb, b, 5);
printf("原多项式A:");
DispPoly(ha);
printf("\n");
printf("原多项式B:");
DispPoly(hb);
printf("\n");
Sort(ha);
Sort(hb);
printf("有序多项式A:");
DispPoly(ha);
printf("\n");
printf("有序多项式B:");
DispPoly(hb);
printf("\n");
Add(ha, hb, hc);
printf("多项式相加:");
DispPoly(hc);
printf("\n");
Sub(ha, hb, hd);
printf("多项式相减:");
DispPoly(hd);
printf("\n");
return 0;
}
程序分析:
- 运行结果:
实现两个多项式相乘
- 算法思路:创建两个链表,其中包含数据域(系数、指数),以及指向下一个结点的指针域。将链表中数据域进行相乘后得到新的链表,将新链表按照指数递减的规则排序。定义两个指针,一个指向首结点,一个指向第二个结点,如果前一个结点的指数与下一个结点的指数相等,则将两个结点的系数相加,释放掉一个结点。两个多项式相乘可能会出现系数为0的项,最后要进行删除。
void Mul(PolyNode* ha, PolyNode* hb, PolyNode*& hc)
{
PolyNode* pa = ha->next, * pb, * s, * tc;
hc = (PolyNode*)malloc(sizeof(PolyNode));
tc = hc;
while (pa != NULL)
{
pb = hb->next;
while (pb != NULL)
{
s = (PolyNode*)malloc(sizeof(PolyNode));
s->coef = pa->coef * pb->coef;
s->exp = pa->exp + pb->exp;
tc->next = s;
tc = s;
pb = pb->next;
}
pa = pa->next;
}
tc->next = NULL;
}
void Comb(PolyNode*& L)
{
PolyNode* pre = L->next, * p;
if (pre == NULL) return;
p = pre->next;
while (p != NULL)
{
while (p->exp == pre->exp)
{
pre->coef += p->coef;
pre->next = p->next;
free(p);
p = pre->next;
}
pre = p;
p = p->next;
}
}
void DelZero(PolyNode*& L)
{
PolyNode* pre = L, * p = pre->next;
while (p != NULL)
{
if (p->coef == 0.0)
{
pre->next = p->next;
free(p);
}
pre = p;
p = p->next;
}
}
Mul(ha, hb, hc);
Sort(hc);
Comb(hc);
DelZero(hc);
程序分析:
- 运行结果: