/*
*Copyright (c) 2017,烟台大学计算机与控制工程学院
*All rights reserved.
*文件名称:项目7- 用单链表存储一元多项式,并实现两个多项式的加法。
*作    者:邵雪源
*完成日期:2017年12月13日
*版 本 号: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;
}

提示:
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链接到相加后的第一个多项式末尾。

  上面的讨论假设多项式链表中,已经按指数由大到小排序,在加法之前,采取多种手段保证这一前提成立。

第四周实践项目7 多项式求和相关推荐

  1. 数据结构上机实践第四周项目7 - 多项式求和

    项目6 - 多项式求和 用单链表存储一元多项式,并实现两个多项式的加法. 提示:  1.存储多项式的数据结构  多项式的通式是pn(x)=anxn+an−1xn−1+...+a1x+a0.n次多项式共 ...

  2. 第四周实践项目6 循环双链表应用

    /* *Copyright (c) 2017,烟台大学计算机与控制工程学院 *All rights reserved. *文件名称:项目6-设非空线性表ha和hb都用带头节点的循环双链表表示.设计一个 ...

  3. 第四周实践项目5 猴子选大王(循环链表)

    /* *Copyright (c) 2017,烟台大学计算机与控制工程学院 *All rights reserved. *文件名称:项目5-一群猴子,编号是1,2,3 -m,这群猴子(m个)按照1-m ...

  4. 第四周实践项目4 建立算法库——双链表

    /* *Copyright (c) 2017,烟台大学计算机与控制工程学院 *All rights reserved. *文件名称:项目4-数据结构之自建算法库--双链表 *作 者:邵雪源 *完成日期 ...

  5. 第四周实践项目3单链表:逆置、连接与递增判断(包含三个程序)

    /* *Copyright (c) 2017,烟台大学计算机与控制工程学院 *All rights reserved. *文件名称:项目3-1.设计一个算法,将一个带头结点的数据域依次为a1,a2,- ...

  6. 第四周实践项目2 算法库——单链表

    /*首先设计测试函数,可以涉及初始化线性表.销毁线性表.输出线性表.插入数据元素对应的函数*/ #include <stdio.h> #include <malloc.h> t ...

  7. Cognitive Inference:认知推理下的常识知识库资源、常识推理测试评估与中文实践项目索引...

    作者 | 刘焕勇 责编 | 李雪敬 出品 | CSDN博客 CognitiveInference Cognitive Inference,认知推理.常识知识库.常识推理与常识推理评估的系统项目,以现有 ...

  8. 认知推理下的常识知识库资源、常识测试评估与中文实践项目索引

    作者 | 刘焕勇 责编 | 李雪敬 出品 | CSDN博客 Cognitive Inference Cognitive Inference,认知推理.常识知识库.常识推理与常识推理评估的系统项目,以现 ...

  9. 清华大学《大数据系统基础A/B》课程实践项目宣讲会来了

    9月15.16日,清华大学大数据能力提升项目必修课<大数据系统基础A/B>课程实践项目宣讲会以线下+线上的方式顺利举行.授课教师软件学院院长王建民教授.闻立杰副教授和宋韶旭副教授分别对大数 ...

最新文章

  1. 如何使用TensorFlow中的Dataset API
  2. 6000字详解数据仓库建设
  3. 1014. 福尔摩斯的约会
  4. springcloud(五) Hystrix 降级,超时
  5. Leaf:美团分布式ID生成服务开源
  6. java 负数 位移运算_Java中的位移运算
  7. Arduino系列硬件资源介绍
  8. 外媒:已有5家芯片厂商获准继续向华为供货
  9. UNIX 环境高级编程
  10. 2021-10-22 学习笔记:和弦对照信息表
  11. 关于 AI 的数百个问题,清华男神刘云浩教授的 3 万字回复给整得明明白白|附抽奖送书...
  12. 计算机路由器无线级联配置,不同品牌无线路由器 无线级联 配置案例
  13. 开发过程中沟通的重要性
  14. 雅虎微软交易局中局:巴茨开始绝望主妇式攻击
  15. 720云VR全景支持入驻高德地图,打造新一代沉浸式文旅消费体验
  16. IDEA和Eclipse的debug怎么实现?出于好奇心,我越挖越深!
  17. 软文营销保持好奇心才能吸引读者采取行动
  18. 计算机的未来展望英语作文,关于展望未来英语作文5篇
  19. ElasticSearch 2 (25) - 语言处理系列之同义词
  20. 数据结构 严薇敏 堆 的实现及其使用方法详解

热门文章

  1. 文件上传下载小结一(转载)
  2. 一个关于nvarchar字段排序,中英文混合排序的问题
  3. minijson使用_java layuimini使用json传值
  4. jsonProperty
  5. (四)Java B2B2C o2o多用户商城 springcloud架构-断路器(Hystrix)
  6. 大家都在晒的支付宝3分钱付款截图,让千万人有了“半毛钱”关系
  7. win server 2008 R2 安装IIS
  8. C++:基类和派生类
  9. 中小企业实施ERP更多是需要发展的眼光与坚定的决策
  10. Route Flap Dampening