哈工大数据结构实验一 线性结构及其应用

代码思路等待更新中。。。。

实验项目:线性表的链式存储结构与应用
实验题目:一元多项式计算器
实验内容:
设计线性表的动态或者静态链式存储结构,并实现一个一元多项式的计算器。
实验要求:
以动态或者静态链表存储一元多项式,在此基础上按要求完成对一元多项式
的运算。(为保证多项式的值的准确性,多项式的系数可以用分数表示,涉及到
两个分数相除时,结果也可以用分数表示。)

  1. 能够输入多项式(可以按各项的任意输入顺序,建立按指数降幂排列的多项
    式)和输出多项式(按指数降幂排列),以文件形式输入和输出,并显示。
  2. 能够给出计算两个多项式加法、减法、乘法和除法运算的结果多项式,除法
    运算的结果包括商多项式和余数多项式。
  3. 能够计算一元多项式的 k 阶导函数。
  4. 能够计算多项式在某一点 x=x 0 的值,其中 x 0 是一个浮点型常量,返回结果为
    浮点数。
  5. 要求尽量减少乘法和除法运算中间结果的空间占用和结点频繁的分配与回收
    操作。(提示:利用循环链表结构或者可用空间表的思想,把循环链表表示
    的多项式返还给系统或者可用空间表,从而解决上述问题)。

逻辑设计

在这里插入图片描述

(1)函数read1():从文件“shuru1.txt”读入第一个一元多项式,依次读取第一个多项式的项数和各个项的系数和指数。
在这里插入图片描述

(2)函数read2():和函数read1()类似,读入第二个多项式

在这里插入图片描述

(3)函数polyll(float c, int e, Polynomial pRear):建立一个新的节点,该节点的系数为c,指数为e,并插入到节点pRear的后面,函数返回的是插入后的节点。
在这里插入图片描述

(4)函数OutPrint(Polynomial P):将多项式P打印出来
在这里插入图片描述

(5)Polynomial sort(Polynomial a):将多项式a进行降幂排序,返回指向降幂排序后的第一个节点。
在这里插入图片描述

**(6)void shuchu1(Polynomial P)😗*将多项式P按降幂排序输出到文件“shuchu1.txt”中。
在这里插入图片描述

(7)void shuchu2(Polynomial P):将多项式P按降幂排序输出到文件“shuchu2.txt”中。
在这里插入图片描述

(8)Polynomial polyadd(Polynomial a, Polynomial b):将多项式a和多项式b相加,返回相加后的指向多项式节点的第一个指针。思路:依次比较多项式a和多项式b的节点的指数,如果指数相同,则把系数相加,若系数结果不为0,则调用函数polyll(),把改节点插入到新的多项式中。如果a的指数大,则把a的节点直接插入至新的多项式中。并依次循环比较至有一个多项式为空为止。再把另一个多项式剩下的节点依次插入至新的多项式中。
在这里插入图片描述在这里插入图片描述

(9)Polynomial polysub(Polynomial a, Polynomial b):将多项式a和多项式b相减,返回相减后的指向多项式节点的第一个指针。思路和加法类似。知识系数相加变为系数相减。
在这里插入图片描述在这里插入图片描述

(10)Polynomial PolyMult(Polynomial a, Polynomial b):将两个多项式相乘,返回指向乘积多项式的第一个节点的指针。思路:新建一个节点,设置两重循环,分别是第一个多项式的节点和第二个节点不为空时进行循环,把多项式a和多项式b所有的项的指数想加,系数相乘,再调用polyll函数建立新的节点。(该乘积后的多项式不是降序的,后面会使用sort()函数重新降幂排序)
在这里插入图片描述

(11)float qiuzhi(Polynomial a,float x):进行多项式求值,输入的值为x,将x的值带入多项式a中,返回带入多项式求出的值。
在这里插入图片描述

(12)Polynomial PolyDer(Polynomial a, int n):对多项式a求n阶导数
在这里插入图片描述

(13)Polynomial PolyDiv(Polynomial a,Polynomial b):多项式的除法,分别打印多项式a除以多项式b的商和余式。多项式除法基本原理:首先创建一个节点用来存储多项式的商,首先比较多项式a和多项式b的最高指数的大小关系,如果a的指数小,则商就是0,余式就是多项式a,否则用多项式a的最高项除以多项式b的最高项得到一个项,把该项插到商的多项式的节点的后面,然后调用polysub()用多项式a减去得到的项乘以多项式b(调用了PolyMult),该减法得到的多项式再当做多项式a和多项式b进行比较,重复上述循环即可。
在这里插入图片描述在这里插入图片描述

(14)main():首先使用函数read1()和read2()读入多项式,用P1和P2指向第一个节点。再使用sort()函数进行降幂排序,然后使用函数shuchu1()和shuchu2()输出降幂排序结构到文件中。然后用一个switch语句来进行一元多项式的选择不同的操作。具体的见程序图。
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200923195307222.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTQwNjE1NQ==,size_16,color_FFFFFF,t_70#pic_center在这里插入图片描述在这里插入图片描述

结构体设计

typedef struct PolyNode* Polynomial;//给结构体重新命名
struct PolyNode
{//建立链表结构体 
         float coef;// 系数
         int expon;        //指数 
         Polynomial link;//指向下一个节点的指针
};
符号多项式的操作,已经成为表处理的典型用例。在数学上,一个一元多项式Pn(x)可按升幂写 成: Pn(x) = p0+ p1x+ p2x2+….+ pnxn 它由n+1个系数唯一确定,因此,在计算机里,它可用一个线 性表P来表示: P = (p0 ,p1 ,p2 ,… pn)每一项的指数i隐含在其系数pi的序号里。 假Qm(x)是一元m次多项式,同样可用线性表Q来表示:Q = (q0 ,q1 ,q2 ,… qm)。 不失一般性,m<n,则两个多项式相加的结果 Rn(x) = Pn(x)+Qm(x)可用线性表R表示:R = (p0+q0 , p1+q1 , p2 +q2 , … , pm +qm , pm+1 ,… pn)。显然,我们可以对P、Q和R采用顺序存储结构, 使得多项式相加的算法定义十分简洁。至此,一元多项式的表示及相加问题似乎已经解决了。 然而在通常的应用中,多项式的次数可能很高且变化很大,使得顺序存储结构的最大长度很难 决定。特别是在处理形如:S(x) = 1+3x10000+2x20000的多项式时,就要用一长度为20001的线性表来 表示,表中仅有三个非零元素,这种对内存空间的浪费是应当避免的,但是如果只存储非零系数项 则显然必须同时存储相应的指数。 一般情况下的一元n次多项式可写成: Pn(x) = p1x e1 + p2x e2 + … + pmx em 其中 pi,是指数为 ei 的项的非零系数,且满足 0 ≤ e1 < e2 < …< em = n,若用一个长度为 m 且 每个元素有两个数据项(系数项和指数项)的线性表便可唯一确定多项式 Pn(x)。 ((p1 ,e1) , (p2 ,e2) , … ,(pm,em)) 在最坏情况下,n+1(=m)个系数都不为零,则比只存储每项系数的方案要多存储一倍的数据。但 是,对于 S(x)类的多项式,这种表示将大大节省空间。 本题要求选用线性表的一种合适的存储结构来表示一个一元多项式,并在此结构上实现一元多 项式的加法,减法和乘法操作
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值