第二章线性表—— 一元多项式的表示和相加(7)
2022/1/13 23:07:26
本文主要是介绍第二章线性表—— 一元多项式的表示和相加(7),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
1 一元多项式的表示
一元多项式 p(x)=p0+p1x+p2x2+ … +pnxn ,由n+1个系数唯一确定。
则在计算机中可用线性表(p0 ,p1 ,p2 ,… ,pn )表示。
既然是线性表,就可以用顺序表和链表来实现。两种不同实现方式的元素类型定义如下
1 (1)顺序存储表示的类型 2 typedef struct 3 { float coef; /*系数部分*/ 4 int expn; /*指数部分*/ 5 } ElemType ; 6 7 8 9 (2)链式存储表示的类型 10 typedef struct ploy 11 { float coef ; /*系数部分*/ 12 int expn ; /*指数部分*/ 13 struct ploy *next ; 14 } Ploy ;
2 一元多项式的相加
不失一般性,设有两个一元多项式: P(x)=p0+p1x+p2x2+ … +pnxn ,
Q(x)=q0+q1x+q2x2+ … +qmxm (m<n) R(x)=P(x)+ Q(x) R(x)
由线性表R((p0+q0) ,(p1+q1) ,(p2+q2) , … ,(pm+qm) , … , pn)唯一表示。
⑴ 顺序存储表示的相加 线性表的定义
1 typedef struct 2 { ElemType a[MAX_SIZE] ; 3 int length ; 4 }Sqlist ;
用顺序表示的相加非常简单。
访问第5项可直接访问:L.a[4].coef , L.a[4].expn (2) 链式存储表示的相加
(2) 链式存储表示的相加
当采用链式存储表示时,根据结点类型定义,
凡是系数为0的项不在链表中出现,从而可以大大减少链表的长度。
一元多项式相加的实质是:
指数不同: 是链表的合并。
指数相同: 系数相加,和为0,去掉结点,和不为0,修改结点的系数域。
算法之一: 就在原来两个多项式链表的基础上进行相加,相加后原来两个多项式链表就不在存在。
当然再要对原来两个多项式进行其它操作就不允许了。
1 算法描述 2 Ploy *add_ploy(ploy *La, ploy *Lb) 3 /* 将以La ,Lb为头指针表示的一元多项式相加 */ 4 { ploy *Lc , *pc , *pa , *pb ,*ptr ; float x ; 5 Lc=pc=La ; pa=La->next ; pb=Lb->next ; 6 while (pa!=NULL&&pb!=NULL) 7 { if (pa->expn<pb->expn) 8 { pc->next=pa ; pc=pa ; pa=pa->next ; } 9 /* 将pa所指的结点合并,pa指向下一个结点 */ 10 if (pa->expn>pb->expn) 11 { pc->next=pb ; pc=pb ; pb=pb->next ; } 12 /* 将pb所指的结点合并,pb指向下一个结点 */ 13 else 14 { x=pa->coef+pb->coef ; 15 if (abs(x)<=1.0e-6) 16 /* 如果系数和为0,删除两个结点 */ 17 { ptr=pa ; pa=pa->next ; free(ptr) ; 18 ptr=pb ; pb=pb->next ; free(ptr) ; } 19 else /* 如果系数和不为0,修改其中一个结点的系数域,删除另一个结点 */ 20 { pc->next=pa ; pa->coef=x ; 21 pc=pa ; pa=pa->next ; 22 ptr=pb ; pb=pb->next ; free(pb) ; 23 } 24 } 25 } /* end of while */ 26 if (pa==NULL) pc->next=pb ; 27 else pc->next=pa ; 28 return (Lc) ; 29 }
算法之二:
对两个多项式链表进行相加,生成一个新的相加后的结果多项式链表,
原来两个多项式链表依然存在,不发生任何改变,如果要再对原来两个多项式进行其它操作也不影响。
1 算法描述 2 Ploy *add_ploy(ploy *La, ploy *Lb) 3 /* 将以La ,Lb为头指针表示的一元多项式相加,生成一个新的结果多项式 */ 4 { ploy *Lc , *pc , *pa , *pb , *p ; float x ; 5 Lc=pc=(ploy *)malloc(sizeof(ploy)) ; 6 pa=La->next ; pb=Lb->next ; 7 while (pa!=NULL&&pb!=NULL) 8 { if (pa->expn<pb->expn) 9 { p=(ploy *)malloc(sizeof(ploy)) ; 10 p->coef=pa->coef ; p->expn=pa->expn ; 11 p->next=NULL ; 12 /* 生成一个新的结果结点并赋值 */ 13 pc->next=p ; pc=p ; pa=pa->next ; 14 } 15 /* 生成的结点插入到结果链表的最后,pa指向下一个结点 */ 16 if (pa->expn>pb->expn) 17 { p=(ploy *)malloc(sizeof(ploy)) ; 18 p->coef=pb->coef ; p->expn=pb->expn ; 19 p->next=NULL ; 20 /* 生成一个新的结果结点并赋值 */ 21 pc->next=p ; pc=p ; pb=pb->next ; 22 } /* 生成的结点插入到结果链表的最后,pb指向下一个结点 */ 23 if (pa->expn==pb->expn) 24 { x=pa->coef+pb->coef ; 25 if (abs(x)<=1.0e-6) 26 /* 系数和为0,pa, pb分别直接后继结点 */ 27 { pa=pa->next ; pb=pb->next ; } 28 else /* 若系数和不为0,生成的结点插入到结果链表的最后, pa, pb分别直接后继结点 */ 29 { p=(ploy *)malloc(sizeof(ploy)) ; 30 p->coef=x ; p->expn=pb->expn ; 31 p->next=NULL ; 32 /* 生成一个新的结果结点并赋值 */ 33 pc->next=p ; pc=p ; 34 pa=pa->next ; pb=pb->next ; 35 } 36 } 37 } /* end of while */ 38 if (pb!=NULL) 39 while(pb!=NULL) 40 { p=(ploy *)malloc(sizeof(ploy)) ; 41 p->coef=pb->coef ; p->expn=pb->expn ; 42 p->next=NULL ; 43 /* 生成一个新的结果结点并赋值 */ 44 pc->next=p ; pc=p ; pb=pb->next ; 45 } 46 if (pa!=NULL) 47 while(pa!=NULL) 48 { p=(ploy *)malloc(sizeof(ploy)) ; 49 p->coef=pb->coef ; p->expn=pa->expn ; 50 p->next=NULL ; 51 /* 生成一个新的结果结点并赋值 */ 52 pc->next=p ; pc=p ; pa=pa->next ; 53 } 54 return (Lc) ; 55 }
这篇关于第二章线性表—— 一元多项式的表示和相加(7)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2025-01-11有哪些好用的家政团队管理工具?
- 2025-01-11营销人必看的GTM五个指标
- 2025-01-11办公软件在直播电商前期筹划中的应用与推荐
- 2025-01-11提升组织效率:上级管理者如何优化跨部门任务分配
- 2025-01-11酒店精细化运营背后的协同工具支持
- 2025-01-11跨境电商选品全攻略:工具使用、市场数据与选品策略
- 2025-01-11数据驱动酒店管理:在线工具的核心价值解析
- 2025-01-11cursor试用出现:Too many free trial accounts used on this machine 的解决方法
- 2025-01-11百万架构师第十四课:源码分析:Spring 源码分析:深入分析IOC那些鲜为人知的细节|JavaGuide
- 2025-01-11不得不了解的高效AI办公工具API