线性表---一元多项式相加
2012-11-04 15:54
302 查看
线性表链式存储实现一元多项式相加。
//Define.h内为基本定义
#include<stdio.h>
#include<Define.h> #include<stdlib.h> typedef int ElemType; typedef struct LNode { float coef; //系数 ElemType expn; //指数 struct LNode *next; }LNode, *LinkList; typedef struct { float coef; //系数 ElemType expn; //指数 }term; typedef LinkList polynomail; //有序链表表示多项式 Status InitPolyn(polynomail *P); //初始化链表 Status MakeNode(polynomail *P, term e); //开辟新的节点,用e赋值 void CreatPolyn(polynomail *P, int m); //建立新的链表,输入m项的系数和指数 void DestroyPolyn(polynomail *P); //销毁链表 Status PrintPolyn(polynomail P); //打印输出链表 int PolynLength(polynomail P); //得到链表的长度 Status SetCurElem(polynomail *P, term e); //用e给链表P的节点赋值 Status LocateElem(polynomail P, term e, polynomail *q, Status (*compare)(term, term)); int cmp (term a, term b); Status InsFirst(polynomail *p, polynomail *s); //插入 Status DelFirst(polynomail *p, polynomail *q); //删除 void AddPolyn(polynomail *Pa, polynomail *Pb); //多项式的加法, 并且销毁Pb Status InitPolyn(polynomail *P) { (*P) = (LinkList)malloc(sizeof(LNode)); (*P)->next = NULL; if ((*P) == NULL) { return ERROR; } (*P)->coef = 0.0; (*P)->expn = -1; printf("初始化成功!\n"); return OK; } Status SetCurElem(polynomail *P, term e) { if ((*P) == NULL) { return ERROR; } (*P)->coef = e.coef; (*P)->expn = e.expn; return OK; } Status cmp(term a, term b) { if (a.expn < b.expn) { return -1; } else if (a.expn == b.expn) { return 0; } else { return 1; } } Status LocateElem(polynomail P, term e, polynomail *q, Status (*compare)(term, term)) //小于 { polynomail p, prior; term x; for (p = P->next, prior = P; p != NULL; p = p->next, prior = prior->next) { x.coef = p->coef; x.expn = p->expn; if (cmp(x, e) == 0) { (*q) = p; return TRUE; } else if (cmp(x, e) == 1) { (*q) = prior; return FALSE; } } (*q) = prior; //重要 return FALSE; } Status MakeNode(polynomail *p, term e) { (*p) = (polynomail)malloc(sizeof(LNode)); (*p)->next = NULL; if ((*p) == NULL) { return ERROR; } else { (*p)->coef = e.coef; (*p)->expn = e.expn; return TRUE; } } Status InsFirst(polynomail *p, polynomail *s) { (*s)->next = (*p)->next; (*p)->next = (*s); return OK; } Status DelFirst (polynomail *p, polynomail *q) //删除 { (*p)->next = (*q)->next; (*q)->next = NULL; return OK; } void CreatPolyn(polynomail *P, int m) { int i; polynomail head, q, s; term e; head = (*P); e.coef = 0.0; e.expn = -1; SetCurElem(&head, e); for (i = 1; i <=m; i ++) { scanf("%f%d", &e.coef, &e.expn); if (! LocateElem (*P, e, &q, (* cmp))) { if (MakeNode (&s, e)) { InsFirst(&q, &s); } } else { q->coef += e.coef; //优化 } } // free(s); } void AddPolyn(polynomail *Pa, polynomail *Pb) { float sum; term a, b; polynomail ha, hb, qa, qb; ha = (*Pa); hb = (*Pb); qa = ha->next; qb = hb->next; while (qa && qb) { a.coef = qa->coef; a.expn = qa->expn; b.coef = qb->coef; b.expn = qb->expn; switch (cmp (a, b)) //参数是term型 { case -1: ha = qa; qa = qa->next; break; case 0: sum = a.coef + b.coef; if (sum != 0) { qa->coef = sum; ha = qa; } else /* { DelFirst (&hb, &qb); free(qb); qb = hb ->next; qa = ha->next; break; }*/ { DelFirst(&ha, &qa); free(qa); } DelFirst(&hb, &qb); free(qb); qb = hb->next; qa = ha->next; break; case 1: DelFirst(&ha, &qb); InsFirst(&ha, &qb); qb = hb->next; ha = ha->next; break; } } if ((*Pb) != NULL) { // qa->next = qb; ha->next = qb; } free(hb); } Status PrintPolyn(polynomail P) //打印输出链表 { polynomail p; p = P->next; if (p == NULL) { printf("F(x) = 0\n"); return 0; } printf("F(x) = "); while(p) { // if (p->next == NULL) if (p == P->next) { if (p->coef < 0 && p->coef == -1) { printf("-x^(%d)", p->expn); } else if (p->coef < 0 && p->coef != -1) { printf("%.1fx^(%d)", p->coef, p->expn); } else if (p->coef == 1) { printf("x^(%d)", p->expn); } else if (p->expn == 1) { printf("%.1fx", p->coef); } else if (p->expn == 0) { printf("%.1f", p->coef); } else { printf("%.1fx^(%d)", p->coef, p->expn); } } else { if (p->coef < 0 && p->coef == -1) { printf("-x^(%d)", p->expn); } else if (p->coef < 0 && p->coef != -1) { printf("%.1fx^(%d)", p->coef, p->expn); } else if (p->coef == 1) { printf("+x^(%d)", p->expn); } else if (p->expn == 1) { printf("+%.1fx", p->coef); } else if (p ->expn == 0) { printf("+%.1f", p->coef); } else { printf("+%.1fx^(%d)", p->coef, p->expn); } } p = p->next; } printf("\n"); return OK; } Status main(void) { int m; polynomail Pa, Pb; InitPolyn(&Pa); InitPolyn(&Pb); printf("请输入要输入Pa的项数:"); scanf("%d", &m); printf("请依次输入Pa中%d组数据:\n", m); CreatPolyn(&Pa, m); PrintPolyn(Pa); printf("请输入要输入Pb的项数:"); scanf("%d", &m); printf("请依次输入Pb中%d组数据:\n", m); CreatPolyn(&Pb, m); PrintPolyn(Pb); AddPolyn(&Pa, &Pb); printf("多项式Pa和Pb相加的结果为:\n"); PrintPolyn(Pa); return 0; }
相关文章推荐
- 线性表应用举例——一元多项式相加问题
- 一元多项式的表示及相加(抽象数据类型Polynomial的实现)
- 实验2 一元多项式相加
- 数据结构学习笔记 --- 线性表 (一元多项式的表示及相加)
- 一元多项式相加
- 数据结构——一元多项式的表示及相加
- 利用单链表实现一元多项式的表示及相加
- 一元多项式相加
- 一元多项式的相加(单链表的应用)
- 一元多项式的表示及相加 【链表的应用】
- 一元多项式相加程序(C语言)
- 单链表实现一元多项式相加
- 【实验】一元多项式的相加与相乘
- 数据结构 一元多项式的创建、显示、相加、相减、相乘
- 数据结构--线性表--一元多项式加法运算
- 一道 google曾出过的笔试题:编程实现对数学一元多项式的相加和相乘操作(1)
- 链表形式 写出两个一元多项式相加的算法
- 一元多项式相加,链表存储实现 ,不使用头结点
- 链表应用-- 一元多项式相加
- 链表表示的 一元多项式,无参构造器,有参构造器,相加,遍历