您的位置:首页 > 其它

链表实现多项式相加

2009-12-08 14:59 375 查看
头文件:

polyn.h

/*
* polyn.h
*/
#ifndef POLYN_H_
#define POLYN_H_
typedef int ElemType;
typedef struct polynnode
{
ElemType coef;
ElemType expn;
struct polynnode *next;
} polyn;
#define NODESZ	sizeof(polyn)
polyn *InitPolyn(polyn *L);
polyn *CreatePolyn(polyn *L, ElemType coefarr[], ElemType expn[], int n);
polyn *InsertPolyn(polyn *L, const int i, const ElemType coef,
const ElemType expn);
polyn *DeletePolyn(polyn *L, const int i, ElemType *coef, ElemType *expn);
int PrintPolyn(const polyn *L);
polyn *AddPolyn(polyn *pa, polyn *pb);
polyn *AddPolynEx(polyn *pa, polyn *pb);
#endif /* POLYN_H_ */


实现源代码:

polyn.c

/*
* polyn.c
*/
#include <stdio.h>
#include <stdlib.h>
#include "polyn.h"
polyn *InitPolyn(polyn *L)
{
L = (polyn *) malloc(NODESZ);
if (NULL == L)
{
printf("ERROR: New allocate failed!/n");
return NULL;
}
L->next = NULL;
return L;
}
// expn ascend
polyn *CreatePolyn(polyn *L, ElemType coefarr[], ElemType expnarr[], int n)
{
if (NULL == L)
{
printf("ERROR: The polyn is NULL!/n");
return NULL;
}
int i;
polyn *r = L;
polyn *s;
for (i = 0; i < n; ++i)
{
s = (polyn *) malloc(NODESZ);
s->coef = coefarr[i];
s->expn = expnarr[i];
r->next = s;
r = s;
}
r->next = NULL;
return L;
}
polyn *InsertPolyn(polyn *L, const int i, const ElemType coef,
const ElemType expn)
{
if (NULL == L)
{
printf("ERROR: The polyn is NULL!/n");
return NULL;
}
int j = 0;
polyn *p = L;
while (p != NULL && j < i - 1)
{
p = p->next;
j++;
}
if (NULL == p || j > i - 1)
{
printf("ERROR: The position is invalid!/n");
return L;
}
polyn *s = (polyn *) malloc(NODESZ);
s->coef = coef;
s->expn = expn;
s->next = p->next;
p->next = s;
return L;
}
polyn *DeletePolyn(polyn *L, const int i, ElemType *coef, ElemType *expn)
{
polyn *p = L;
int j = 0;
while (p->next != NULL && j < i - 1)
{
p = p->next;
j++;
}
if (NULL == p->next || j > i - 1)
{
printf("ERROR: The position is invalid!/n");
return L;
}
polyn *q = p->next;
*coef = q->coef;
*expn = q->coef;
p->next = q->next;
free(q);
return L;
}
int PrintPolyn(const polyn *L)
{
if (NULL == L)
{
printf("ERROR: The polyn is NULL!/n");
return -1;
}
polyn *p = L->next;
while (p != NULL)
{
printf("%dx^%d ", p->coef, p->expn);
p = p->next;
}
printf("/n");
return 0;
}
polyn *AddPolyn(polyn *pa, polyn *pb)
{
polyn *p = pa->next;
polyn *q = pb->next;
polyn *pc = pa;
polyn *pre = pa;
polyn *u = NULL;
ElemType x;
while (p != NULL && q != NULL)
{
if (p->expn < q->expn)
{
pre = p;
p = p->next;
}
else if (p->expn > q->expn)
{
u = q->next;
q->next = p;
pre->next = q;
pre = q;
q = u;
}
else if (p->expn == q->expn)
{
x = p->coef + q->coef;
if (x != 0)
{
p->coef = x;
pre = p;
}
else
{
pre->next = p->next;
free(p);
}
p = pre->next;
u = q;
q = q->next;
free(u);
}
}//end while
if (q != NULL)
{
pre->next = q;
free(pb);
}
return pc;
}
polyn *AddPolynEx(polyn *pa, polyn *pb)
{
polyn *r = pa;
polyn *s = pb;
polyn *u = NULL;
ElemType x;
while (r->next != NULL && s->next != NULL)
{
if (r->next->expn < s->next->expn)
{
r = r->next;
}
else if (r->next->expn > s->next->expn)
{
u = s->next;
s->next = u->next;
u->next = r->next;
r->next = u;
r = u;
}
else if (r->next->expn == s->next->expn)
{
x = r->next->coef + s->next->coef;
if(x!=0)
{
r->next->coef=x;
r=r->next;
}
else
{
u=r->next;
r->next=u->next;
free(u);
}
u=s->next;
s->next=s->next->next;
free(u);
}
}//end while
if(s->next!=NULL)
{
r->next=s->next;
free(pb);
}
return pa;
}


测试主程序:

Polynomial.c

/*
============================================================================
Name        : Polynomial.c
Author      :
Version     :
Copyright   : Copyright@DK
Description : Hello World in C, Ansi-style
============================================================================
*/
#include <stdio.h>
#include <stdlib.h>
#include "polyn.h"
int main(void)
{
int coef1[] =
{ 1, 2, 3, 4, 5, 1 };
int expn1[] =
{ 0, 2, 5, 6, 7, 12 };
int coef2[] =
{ 3, 1, 2, 1, -4, 1, 1 };
int expn2[] =
{ 0, 1, 3, 4, 6, 8, 13 };
polyn *pa;
pa = InitPolyn(pa);
pa = CreatePolyn(pa, coef1, expn1, 6);
PrintPolyn(pa);
polyn *pb;
pb = InitPolyn(pb);
pb = CreatePolyn(pb, coef2, expn2, 6);
PrintPolyn(pb);
printf("================/n");
polyn *pc=NULL;
pc=AddPolyn(pa,pb);
PrintPolyn(pc);
printf("================/n");
polyn *pa2;
pa2 = InitPolyn(pa2);
pa2 = CreatePolyn(pa2, coef1, expn1, 6);
PrintPolyn(pa2);
polyn *pb2;
pb2 = InitPolyn(pb2);
pb2 = CreatePolyn(pb2, coef2, expn2, 6);
PrintPolyn(pb2);
printf("================/n");
polyn *pd=NULL;
pd=AddPolynEx(pa2,pb2);
PrintPolyn(pd);
printf("================/n");

return EXIT_SUCCESS;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: