项目6 - 多项式求和

用单链表存储一元多项式,并实现两个多项式的加法。

提示: 
1、存储多项式的数据结构 
  多项式的通式是pn(x)=anxn+an−1xn−1+...+a1x+a0。n次多项式共有n+1项。直观地,可以定义一个数组来存储这n+1个系数。以多项式p(x)=−3.4x10−9.6x8+7.2x2+x为例,存储这个多项式的数组如下图: 
 
  可以看出,这种方案适合对某些多项式的处理。但是,在处理一些次数高但项数少的多项式时,存在浪费空间的现象,会有很多闲置的0。 
  可以使用如下定义的单链表结构存储多项式:链表中的每一个结点是多项式中的一项,结点的数据域包括指数和系数两部分,由指针域连接起多项式中的各项。 

typedef struct pnode //定义单链表结点类型,保存多项式中的一项,链表构成多项式 { 
double coef; //系数,浮点数 
int exp; //指数,正整数* 
struct pnode *next; //指向下一项的指针 
} PolyNode; 

  用于表示多项式的链表将如下图所示,在建立多项式的链表时,已经令结点按指数由大到小的顺序排列。 

2、多项式加法在链表存储结构下的实现 
  链表存储结构下,多项式加法的实现 在如上定义的单链表存储结构基础上,讨论实现多项式加法的算法。 
  两个多项式相加,其规则是对具有相同指数的项,令其系数相加。设两个待相加的多项式的链表的头指针分别为head1(第一个多项式)和head2(第二个多项式),两者的和保存到链表head1中。只需要先将head1和head2链表的首结点作为当前结点(分别用p1和p2指向)开始检测,在遍历链表的过程中,分情况作如下处理: 
  (1)若两个多项式中当前结点的指数值相同,则它们的系数相加,结果保存到p1结点,并将p2结点删除。如果相加后的系数不为0,p1指向第一个多项式的下一个结点,准备随后的工作,否则,不保存系数为0的项,将当前p1结点删除。 
  (2)当两个多项式中对应结点的指数值不相等时,若p1指向的结点的指数大,则p1简单地指向下一结点即可;而p2指向的结点大时,需要将p2结点插入到p1前,然后p2再重新指回到第二个多项式中的下一结点,继续进行处理。 
  (3)检测过程直到其中的任一个链表结束。若p1不为空,第一个多项式中的剩余项已经在链表中,不作处理,如果p2不为空,只需要将p2链接到相加后的第一个多项式末尾。 
  上面的讨论假设多项式链表中,已经按指数由大到小排序,在加法之前,采取多种手段保证这一前提成立。

实现源代码:

//*Copyright  (c)2017,烟台大学计算机与控制工程学院*
//*All rights reservrd.*
//*文件名称 :main.cpp*
//*作者:田长航*
//*完成时间:2017年10月23日*
//*版本号:v1.0*
//*问题描述:测试函数*
//*输入描述:无*
//*程序输出:无
#include <stdio.h>
#include <malloc.h>
#define MAX 20          //多项式最多项数
typedef struct      //定义存放多项式的数组类型
{double coef;        //系数int exp;            //指数
} PolyArray;typedef struct pnode    //定义单链表结点类型,保存多项式中的一项,链表构成多项式
{double coef;        //系数int exp;            //指数struct pnode *next;
} PolyNode;void DispPoly(PolyNode *L)  //输出多项式
{bool first=true;        //first为true表示是第一项PolyNode *p=L->next;while (p!=NULL){if (first)first=false;else if (p->coef>0)printf("+");if (p->exp==0)printf("%g",p->coef);else if (p->exp==1)printf("%gx",p->coef);elseprintf("%gx^%d",p->coef,p->exp);p=p->next;}printf("\n");
}void DestroyList(PolyNode *&L)  //销毁单链表
{PolyNode *p=L,*q=p->next;while (q!=NULL){free(p);p=q;q=p->next;}free(p);
}void CreateListR(PolyNode *&L, PolyArray a[], int n) //尾插法建表
{PolyNode *s,*r;int i;L=(PolyNode *)malloc(sizeof(PolyNode)); //创建头结点L->next=NULL;r=L;                        //r始终指向终端结点,开始时指向头结点for (i=0; i<n; i++){s=(PolyNode *)malloc(sizeof(PolyNode));//创建新结点s->coef=a[i].coef;s->exp=a[i].exp;r->next=s;              //将*s插入*r之后r=s;}r->next=NULL;               //终端结点next域置为NULL
}void Sort(PolyNode *&head)      //按exp域递减排序
{PolyNode *p=head->next,*q,*r;if (p!=NULL)                //若原单链表中有一个或以上的数据结点{r=p->next;              //r保存*p结点后继结点的指针p->next=NULL;           //构造只含一个数据结点的有序表p=r;while (p!=NULL){r=p->next;          //r保存*p结点后继结点的指针q=head;while (q->next!=NULL && q->next->exp>p->exp)q=q->next;      //在有序表中找插入*p的前驱结点*qp->next=q->next;    //将*p插入到*q之后q->next=p;p=r;}}
}void Add(PolyNode *ha,PolyNode *hb,PolyNode *&hc)  //求两有序集合的并,完成加法
{PolyNode *pa=ha->next,*pb=hb->next,*s,*tc;double c;hc=(PolyNode *)malloc(sizeof(PolyNode));        //创建头结点tc=hc;while (pa!=NULL && pb!=NULL){if (pa->exp>pb->exp){s=(PolyNode *)malloc(sizeof(PolyNode)); //复制结点s->exp=pa->exp;s->coef=pa->coef;tc->next=s;tc=s;pa=pa->next;}else if (pa->exp<pb->exp){s=(PolyNode *)malloc(sizeof(PolyNode)); //复制结点s->exp=pb->exp;s->coef=pb->coef;tc->next=s;tc=s;pb=pb->next;}else                //pa->exp=pb->exp{c=pa->coef+pb->coef;if (c!=0)       //系数之和不为0时创建新结点{s=(PolyNode *)malloc(sizeof(PolyNode)); //复制结点s->exp=pa->exp;s->coef=c;tc->next=s;tc=s;}pa=pa->next;pb=pb->next;}}if (pb!=NULL) pa=pb;    //复制余下的结点while (pa!=NULL){s=(PolyNode *)malloc(sizeof(PolyNode)); //复制结点s->exp=pa->exp;s->coef=pa->coef;tc->next=s;tc=s;pa=pa->next;}tc->next=NULL;
}int main()
{PolyNode *ha,*hb,*hc;PolyArray a[]= {{1.2,0},{2.5,1},{3.2,3},{-2.5,5}};PolyArray b[]= {{-1.2,0},{2.5,1},{3.2,3},{2.5,5},{5.4,10}};CreateListR(ha,a,4);CreateListR(hb,b,5);printf("原多项式A:   ");DispPoly(ha);printf("原多项式B:   ");DispPoly(hb);Sort(ha);Sort(hb);printf("有序多项式A: ");DispPoly(ha);printf("有序多项式B: ");DispPoly(hb);Add(ha,hb,hc);printf("多项式相加:  ");DispPoly(hc);DestroyList(ha);DestroyList(hb);DestroyList(hc);return 0;
}

运行结果截图如下:


数据结构上机实践第四周项目7 - 多项式求和相关推荐

  1. 数据结构上机实践第四周项目6- 循环双链表应用

    数据结构实践--循环双链表应用 线性表都是单向的?链表都是单向的? 本次实践将利用循环双链表进行实际应用,感受这种数据结构的好处 要求如下: 设非空线性表ha和hb都用带头节点的循环双链表表示.设计一 ...

  2. 数据结构上机实践第四周项目5 - 猴子选大王

    数据结构实践--猴子选大王 首先呢,小普及一下 读者:难道你当我不知道 读者想对小编说: 进入正题,项目要求如下: 一群猴子,编号是1,2,3 -m,这群猴子(m个)按照1-m的顺序围坐一圈.从第1只 ...

  3. 数据结构上机实践第四周项目4 - 建设双链表算法库

    数据结构之自建算法库--双链表 各种算法结构都有各自的用途,在实际中我们会碰到各种工程,单链表有时无法或者不能很好的满足我们的需求,这个时候,双链表不失为一种好的数据结构.本次实践将建立双链表算法库, ...

  4. 数据结构上机实践第四周项目3 - 单链表应用

    [项目3 - 单链表应用] 算法的建立就是为了应用所服务的,学会方法,真正能应用才是王道. 应用要求如下: 完成下面的应用时,除项目中给出的特殊要求,其余工作均可利用项目2完成的算法支持.  1.设计 ...

  5. 数据结构上机实践第四周项目2 - 建设“单链表”算法库

    项目2 - 建设"单链表"算法库 本次实践的目的以多文件组织的形式建设"单链表算法库",以便在后续的工程中使用. 文中的多文件组织方式不再细说,可以点击此处参照 ...

  6. 数据结构上机实践第四周项目1 - 建立单链表

    [项目1 - 建立单链表] 本次项目的目标是定义单链表存储结构,用头插法和尾插法建立单链表,并显示建立好以后的结果. 测试主函数及函数声明源代码如下: //*Copyright (c)2017,烟台大 ...

  7. 数据结构上机实践第二周项目2- 程序的多文件组织

    [项目2 - 程序的多文件组织] 学习数据结构,目标就是要编制出有相当规模的程序的.将所有的代码放在一个文件中的做法,不能适用现阶段的需求了. 通过这个项目,确认有能力用多文件组织程序.方便以后各章, ...

  8. 数据结构上机实践第九周项目3 - 利用二叉树遍历思想解决问题

    利用二叉树遍历思想解决问题 学以致用,知行合一,学了知识就要会运用,否则跟背课文没什么区别,上次实践,做了二叉树递归遍历的算法实现,本次实践,将利用遍历思想解决问题,将遍历思想真正的运用到实际问题需求 ...

  9. 数据结构上机实践第九周项目1 - 二叉树算法库

    二叉树算法库 学了新的内容就应该有新的应用,本次实践将进行二叉树算法库的建立,来适应更多工程的需求,丰富算法库. 注:在main函数中,创建的用于测试的二叉树如下 首先本次建立算法库实践将会运用到多文 ...

最新文章

  1. win7无法打开计算机共享文件,win7不能共享文件的解决方法
  2. js粘贴板为什么获取不到图片信息_JavaScript 学习笔记(3):图片库
  3. 【转】ABP源码分析二十一:Feature
  4. android activity从新打开,【Android开发-8】生命周期,Activity中打开另一个Activity
  5. android申请多个运行时权限,Android 6.0(API 23) 运行时权限(二)之权限申请
  6. 使用dos下的命令行,也可以完成wifi连接。
  7. python导入excel模块_python使用openpyxl模块操作excel
  8. 脚本录制软件python 按键精灵 tc_GitHub - yang-dongxu/KeymouseGo: 类似按键精灵的鼠标键盘录制和自动化操作...
  9. 安装python版opencv遇到ModuleNotFoundError: No module named ‘skbuild‘
  10. 《电磁场与电磁波》课程笔记(一)——矢量与坐标系
  11. UltraCompare比较文件时出现UTF8_ConvertorForMac无转换符号!
  12. ai钢笔工具怎么描线_ps钢笔工具怎么用——绘制直线、平滑曲线、转折曲线
  13. Fedora 安装 QQ音乐
  14. 《自然语言处理技术综述(第三版)》(1)----正则表达式
  15. 从零搭建Spring Boot脚手架:增加通用的功能2
  16. MT7628平台编程设计指南资料
  17. 什么是 MIME ?
  18. js dialer app分析,
  19. 基于C++的Qt计算器
  20. Ae 效果快速参考:表达式控制

热门文章

  1. opencv 多边形近似物体形状
  2. [Python] zip() 函数
  3. ES(Elasticsearch)基本查询总结(含docker安装,python操作)
  4. 数据库——关系数据理论学习笔记
  5. $.getJSON无法对外部变量进行赋值的问题
  6. 库存管理与订单的控制
  7. 谷歌技术quot;三宝quot;之MapReduce
  8. 最多只能选择两个多选框的jQuery功能实现
  9. Shut Down(or Closing) Your Windows and Open The Unix
  10. [转载] Python 中 pass 语句的作用是什么?