- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
北邮数据结构实验一题目3一元多项式
北京邮电大学信息与通信工程学院
第 PAGE 11页
北京邮电大学电信工程学院
第 PAGE 1页
数据结构实验报告
实验名称: 实验一题目3一元多项式
学生姓名:
班 级:
班内序号:
学 号:
日 期:
1.实验要求
实验目的:
熟悉C++语言的基本编程方法,掌握集成编译环境的测试方法
学习指针、模板类、异常处理的使用
掌握线性表的操作实现方法
培养使用线性表解决实际问题的能力
实验内容:
利用线性表实现一个一元多项式Polynomial
f(x) = a0 + a1x + a2x2 + a3x3 + … + anxn
提示:
Polynomial的结点结构如下:
struct term
{
float coef; //系数
int expn; //指数
};
可以使用链表实现,也可以使用顺序表实现。
要求:
能够实现一元多项式的输入和输出
能够进行一元多项式相加
能够进行一元多项式相减
能够计算一元多项式在x处的值
能够计算一元多项式的导数(选作)
能够进行一元多项式相乘(选作)
编写测试main()函数测试线性表的正确性
2. 程序分析
2.1 存储结构
单链表:
2.2 关键算法分析
头插法构造单链表:
在堆中建立新结点:Node * s = new Node ;
②将a[i]写入到新结点的数据域:s-data = data[i];
③修改新结点的指针域: s-next = front-next;
④修改头结点的指针域,将新结点加入到链表中: front-next = s;
一元多项式相乘
申请三个动态数组coe1、coe2、coe3,其长度为两个多项式最高幂相乘后的幂数;
为coe1与coe2赋初为0;
分别用coe1与coe2分别储存两个多项式的系数,比如说的一个多项式指数为i的系数存在coe1[i]里面,其他没有存过系数的元素均为0(相当于将二项式延长,没有的项则系数为0);
利用柯西乘积完成多项式相乘,用coe3储存乘积结果,即系数,并且系数不为0的项通过申请动态结构数组来储存,最后构造链表,具体代码:
for (int i=0;i=m+P.m;i++)
{
coe3[i]=0;
for (int j=0;j=i;j++)
{
coe3[i]+=coe1[j]*coe2[i-j];
}
if (coe3[i]!=0)
{
n++;
}
}
element *e3=new element[n];
for (int i=0,j=0;i=m+P.m;i++)
{
if (coe3[i]!=0)
{
e3[j].coef=coe3[i];
e3[j].exp=i;
j++;
}
}
C=new Polylist(e3,n);
一元多项式求和:
第一种情况:若p-data.expnq-data.expn,即A链表当前结点p的指数小于B链表的当前结点q的指数,则p结点保留不变,然后p指向A链表的下一个结点继续进行比较。
p_prior=p;
p=p-next;
第二种情况:若p-data.expn<q-data.expn,即A链表当前结点p的指数大于B链表的当前结点q的指数,则应将q结点加入到A链表p结点之前,然后q指向B链表的下一个结点,继续进行比较。
p_prior-next=q;
p_prior=q;
q=q-next;
p_prior-next=p;
第三种情况:若p-data.expn==q-data.expn,即A链表当前结点p的指数等于B链表的当前结点q的指数,则两结点为同类项,应将两结点的系数求和,此时又分为两种情况:
(a)若合并的系数为0,计量同类项抵消,则删除p结点;
(b)若合并的系数不为0,将其重新赋予p结点。
两结点合并后可删除q结点,并且令p和q分别指向各自的下一个结点继续进行比较。
(a)若合并的系数为0:
①p_prior-next=p-next;
②delete p;
p=p_prior-next;
Node*temp=q;
q=q-next;
delete temp;
(b)若合并的系数不为0:
①p_prior=p;
p=p-next;
③Node*temp=q;
④q=q-next;
delete temp;
第四种情况:若p为空且q不为空,则应将q结点及其后续所有结点追加到A链表的最后:p_prior-next=q;
注:减法和加法用的是同一个函数,若是减法则将减数的多项
文档评论(0)