链表实现多项式相加
2009-12-08 14:59
375 查看
头文件:
polyn.h
实现源代码:
polyn.c
测试主程序:
Polynomial.c
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; }
相关文章推荐
- C语言实现多项式的相加(链表)
- 数据结构学习的简单问题(三):用链表实现多项式相加
- 用单链表实现一元多项式相加 C++代码
- Java链表形式实现多项式相加
- C语言单链表实现多项式相加
- 用链表实现一元稀疏多项式的相加
- (链表实现)写出两个一元多项式相加的算法
- 使用链表实现两个多项式相加和相乘
- 多项式相加(链表的汇编语言实现)
- 一元多项式相加,链表存储实现 ,不使用头结点
- 链表实现的多项式相加相乘
- (链表实现)写出两个一元多项式相加的算法
- 数据结构C语言描述——用单链表实现多项式的相加
- 链表(篇5)用链表实现多项式相加
- (链表实现)写出两个一元多项式相加的算法
- 学习《数据结构》有感之以字符串形式输入链表实现多项式相加
- 链表 实现多项式相加相乘polynomial
- 一元多项式的相加 数据结构链表实现
- 链表实现多项式相加
- 用链表实现多项式的相加