1. // c2-6.h 抽象数据类型Polynomial的实现(见图2.45)
  2. typedef struct // 项的表示,多项式的项作为LinkList的数据元素
  3. {
  4. float coef; // 系数
  5. int expn; // 指数
  6. }term,ElemType; // 两个类型名:term用于本ADT,ElemType为LinkList的数据对象名

图246 是根据c2-5.h 和c2-6.h 定义的多项式7.3+22X7 的存储结构。

  1. // bo2-7.cpp 多项式(存储结构由c2-6.h定义)的基本操作及算法2.22,2.23等(8个)
  2. #include"c2-5.h"
  3. #include"bo2-6.cpp"
  4. typedef LinkList polynomial;
  5. #define DestroyPolyn DestroyList // 与bo2-6.cpp中的函数同义不同名
  6. #define PolynLength ListLength // 与bo2-6.cpp中的函数同义不同名
  7. void OrderInsertMerge(LinkList &L,ElemType e,int(* compare)(term,term))
  8. { // 按有序判定函数compare()的约定,将值为e的结点插入或合并到升序链表L的适当位置
  9. Position q,s;
  10. if(LocateElem(L,e,q,compare)) // L中存在该指数项
  11. {
  12. q->data.coef+=e.coef; // 改变当前结点系数的值
  13. if(!q->data.coef) // 系数为0
  14. { // 删除多项式L中当前结点
  15. s=PriorPos(L,q); // s为当前结点的前驱
  16. if(!s) // q无前驱
  17. s=L.head;
  18. DelFirst(L,s,q);
  19. FreeNode(q);
  20. }
  21. }
  22. else // 生成该指数项并插入链表
  23. {
  24. MakeNode(s,e); // 生成结点
  25. InsFirst(L,q,s);
  26. }
  27. }
  28. int cmp(term a,term b) // CreatPolyn()的实参
  29. { // 依a的指数值<、=或>b的指数值,分别返回-1、0或+1
  30. if(a.expn==b.expn)
  31. return 0;
  32. else
  33. return (a.expn-b.expn)/abs(a.expn-b.expn);
  34. }
  35. void CreatPolyn(polynomial &P,int m) // 算法2.22
  36. { // 输入m项的系数和指数,建立表示一元多项式的有序链表P
  37. Position q,s;
  38. term e;
  39. int i;
  40. InitList(P);
  41. printf("请依次输入%d个系数,指数:\n",m);
  42. for(i=1;i<=m;++i)
  43. { // 依次输入m个非零项(可按任意顺序)
  44. scanf("%f,%d",&e.coef,&e.expn);
  45. if(!LocateElem(P,e,q,cmp)) // 当前链表中不存在该指数项,cmp是实参
  46. {
  47. MakeNode(s,e); // 生成结点并插入链表
  48. InsFirst(P,q,s);
  49. }
  50. }
  51. }
  52. void PrintPolyn(polynomial P)
  53. { // 打印输出一元多项式P
  54. Link q;
  55. q=P.head->next; // q指向第1个结点
  56. printf(" 系数指数\n");
  57. while(q)
  58. {
  59. printf("%f %d\n",q->data.coef,q->data.expn);
  60. q=q->next;
  61. }
  62. }
  63. void AddPolyn(polynomial &Pa,polynomial &Pb) // 算法2.23
  64. { // 多项式加法:Pa=Pa+Pb,并销毁一元多项式Pb
  65. Position ha,hb,qa,qb;
  66. term a,b;
  67. ha=GetHead(Pa);
  68. hb=GetHead(Pb); // ha和hb分别指向Pa和Pb的头结点
  69. qa=NextPos(ha);
  70. qb=NextPos(hb); // qa和qb分别指向Pa和Pb中当前结点(现为第1个结点)
  71. while(!ListEmpty(Pa)&&!ListEmpty(Pb)&&qa)
  72. { // Pa和Pb均非空且ha没指向尾结点(qa!=0)
  73. a=GetCurElem(qa);
  74. b=GetCurElem(qb); // a和b为两表中当前比较元素
  75. switch(cmp(a,b))
  76. {
  77. case -1:ha=qa; // 多项式Pa中当前结点的指数值小
  78. qa=NextPos(ha); // ha和qa均向后移1个结点
  79. break;
  80. case 0: qa->data.coef+=qb->data.coef; // 两者的指数值相等,修改Pa当前结点的系数值
  81. if(qa->data.coef==0) // 删除多项式Pa中当前结点
  82. {
  83. DelFirst(Pa,ha,qa);
  84. FreeNode(qa);
  85. }
  86. else
  87. ha=qa;
  88. DelFirst(Pb,hb,qb);
  89. FreeNode(qb);
  90. qb=NextPos(hb);
  91. qa=NextPos(ha);
  92. break;
  93. case 1: DelFirst(Pb,hb,qb); // 多项式Pb中当前结点的指数值小
  94. InsFirst(Pa,ha,qb);
  95. ha=ha->next;
  96. qb=NextPos(hb);
  97. }
  98. }
  99. if(!ListEmpty(Pb))
  100. {
  101. Pb.tail=hb;
  102. Append(Pa,qb); // 链接Pb中剩余结点
  103. }
  104. DestroyPolyn(Pb); // 销毁Pb
  105. }
  106. void AddPolyn1(polynomial &Pa,polynomial &Pb)
  107. { // 另一种多项式加法的算法:Pa=Pa+Pb,并销毁一元多项式Pb
  108. Position qb;
  109. term b;
  110. qb=GetHead(Pb); // qb指向Pb的头结点
  111. qb=qb->next; // qb指向Pb的第1个结点
  112. while(qb)
  113. {
  114. b=GetCurElem(qb);
  115. OrderInsertMerge(Pa,b,cmp);
  116. qb=qb->next;
  117. }
  118. DestroyPolyn(Pb); // 销毁Pb
  119. }
  120. void Opposite(polynomial Pa)
  121. { // 一元多项式Pa系数取反
  122. Position p;
  123. p=Pa.head;
  124. while(p->next)
  125. {
  126. p=p->next;
  127. p->data.coef*=-1;
  128. }
  129. }
  130. void SubtractPolyn(polynomial &Pa,polynomial &Pb)
  131. { // 多项式减法:Pa=Pa-Pb,并销毁一元多项式Pb
  132. Opposite(Pb);
  133. AddPolyn(Pa,Pb);
  134. }
  135. void MultiplyPolyn(polynomial &Pa,polynomial &Pb)
  136. { // 多项式乘法:Pa=Pa×Pb,并销毁一元多项式Pb
  137. polynomial Pc;
  138. Position qa,qb;
  139. term a,b,c;
  140. InitList(Pc);
  141. qa=GetHead(Pa);
  142. qa=qa->next;
  143. while(qa)
  144. {
  145. a=GetCurElem(qa);
  146. qb=GetHead(Pb);
  147. qb=qb->next;
  148. while(qb)
  149. {
  150. b=GetCurElem(qb);
  151. c.coef=a.coef*b.coef;
  152. c.expn=a.expn+b.expn;
  153. OrderInsertMerge(Pc,c,cmp);
  154. qb=qb->next;
  155. }
  156. qa=qa->next;
  157. }
  158. DestroyPolyn(Pb); // 销毁Pb
  159. ClearList(Pa); // 将Pa重置为空表
  160. Pa.head=Pc.head;
  161. Pa.tail=Pc.tail;
  162. Pa.len=Pc.len;
  163. }
  1. // main2-7.cpp 检验bo2-7.cpp的主程序
  2. #include"c1.h"
  3. #include"c2-6.h"
  4. #include"bo2-7.cpp"
  5. void main()
  6. {
  7. polynomial p,q;
  8. int m;
  9. printf("请输入第1个一元多项式的非零项的个数:");
  10. scanf("%d",&m);
  11. CreatPolyn(p,m);
  12. printf("请输入第2个一元多项式的非零项的个数:");
  13. scanf("%d",&m);
  14. CreatPolyn(q,m);
  15. AddPolyn(p,q);
  16. printf("2个一元多项式相加的结果:\n");
  17. PrintPolyn(p);
  18. printf("请输入第3个一元多项式的非零项的个数:");
  19. scanf("%d",&m);
  20. CreatPolyn(q,m);
  21. AddPolyn1(p,q);
  22. printf("2个一元多项式相加的结果(另一种方法):\n");
  23. PrintPolyn(p);
  24. printf("请输入第4个一元多项式的非零项的个数:");
  25. scanf("%d",&m);
  26. CreatPolyn(q,m);
  27. SubtractPolyn(p,q);
  28. printf("2个一元多项式相减的结果:\n");
  29. PrintPolyn(p);
  30. printf("请输入第5个一元多项式的非零项的个数:");
  31. scanf("%d",&m);
  32. CreatPolyn(q,m);
  33. MultiplyPolyn(p,q);
  34. printf("2个一元多项式相乘的结果:\n");
  35. PrintPolyn(p);
  36. DestroyPolyn(p);
  37. }

运行结果如下:

一元多项式的表示及相加(抽象数据类型Polynomial的实现)的更多相关文章

  1. 数据结构算法C语言实现(六)---2.4一元多项式的表示及相加

    一.简述 利用链表表示稀疏多项式,并基于之前的一些操作(编程实现上还是有所不同的)组合新的操作实现一元多项式的表示及相加. 二.ADT 抽象数据类型一元多项式的定义 ADT Polyomail{ 数据 ...

  2. Week1绪论--抽象数据类型

    一.作业题目 1.构造有理数T,元素e1,e2分别被赋以分子.分母值 2.销毁有理数T 3.用e(引用类型参数)返回有理数T的分子或分母,当入参i为1时返回分子, i为2是返回分母. 4.将有理数T的 ...

  3. 抽象数据类型ADT

    ADT(Abstract Data Type) 类型由什么组成? 一个类型(type)指定两类信息,一个属性集和一个操作集. 假设要定义一个新的数据类型.首先,要提供存储数据的方式,可能是通过设计一个 ...

  4. C语言泛型编程--抽象数据类型

    一.数据类型: 在任何编程语言中,数据类型作为一个整体,ANSI-C包含的类型为:int.double.char……,程序员很少满意语言本身提供的数据类型,一个简单的办法就是构造类似:array.st ...

  5. ORACLE抽象数据类型

    ORACLE抽象数据类型 *抽象数据类型*/1,抽象数据类型 概念包含一个或多个子类型的数据类型不局限于ORACLE的标准数据类型可以用于其他数据类型中 2,创建抽象数据类型 的语法(必须用NOT F ...

  6. ADT(abstract data types)抽象数据类型

    1.What is it? An abstract data type is a set of objects together with a set of operations. 抽象数据类型是带有 ...

  7. 数据结构 集合_集合(数学)抽象数据类型的C语言实现

    链表是实现集合的一种理想的方式.将List以typedef的方式重命名为Set.这样做能保留链表简洁的特性,还能使集合具有了一些多态的特性. 使用这种方法的最大好处就是可以使用list_next来遍历 ...

  8. 【Python&数据结构】 抽象数据类型 Python类机制和异常

    这篇是<数据结构与算法Python语言描述>的笔记,但是大头在Python类机制和面向对象编程的说明上面.我也不知道该放什么分类了..总之之前也没怎么认真接触过基于类而不是独立函数的Pyt ...

  9. DS博客作业01--日期抽象数据类型设计与实现

    1.思维导图及学习体会 1.1第一章绪论知识点思维导图 1.2 学习体会 这次博客园和大作业是我在编程学习中的有意义的进步,第一次尝试使用vs,并且通过同学的一些网站的推荐,和热心同学的帮忙,简单学会 ...

随机推荐

  1. 使用inotify-tools与rsync构建实时备份系统

    使用inotifywait监控文件变动 inotifywait是 inotify-tools 包中提供的一个工具,它使用 inotify API 来监控文件/目录中的变动情况. 在archlinux上 ...

  2. 38.VUE学习之-全局组件和局部组件

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http ...

  3. 学习python第十二天,函数4 生成器generator和迭代器Iterator

    在Python中,这种一边循环一边计算的机制,称为生成器:generator 要创建一个generator,有很多种方法.第一种方法很简单,只要把一个列表生成式的[]改成(),就创建了一个genera ...

  4. POJ:2431-Expedition

    Expedition Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 20089 Accepted: 5786 Descripti ...

  5. P2580 于是他错误的点名开始了(trie)

    P2580 于是他错误的点名开始了 题目背景 XS中学化学竞赛组教练是一个酷爱炉石的人. 他会一边搓炉石一边点名以至于有一天他连续点到了某个同学两次,然后正好被路过的校长发现了然后就是一顿欧拉欧拉欧拉 ...

  6. web在线调试

    xx <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta h ...

  7. Spring mvc+hibernate+freemarker(实战)

    Spring mvc+hibernate+freemarker(实战) 博客分类: Spring Spring mvchibernatefreemarkerwebjava  今天我为大家做了一个 sp ...

  8. 快速登录机器&数据库

    本文来自网易云社区. 作者:盛国存 背景 我们日常在使用ApiDoc维护管理api文档,提高了api文档的整体维护性.但在老旧接口中,补充接口注解无疑是一次繁重的体力劳动.仔细查看,大多数接口的格式 ...

  9. 怎么设置才能让外网ip可以访问mysql数据库[转]

    转自: http://www.hongyanliren.com/89.html 使用mysql中,很多人都会遇到这样的问题:在vps服务器或者云服务器上安装了mysql后,使用其他工具在外网ip之下根 ...

  10. css3实现圆角边框渐变

    <button class="border">112233</button> 创建button .border{ position: relative; b ...