数据结构 一元多项式的计算

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

项目一一元多项式的计算问题

1.1设计题目与要求

1.1.1设计题目

1)一元多项式计算

任务:能够按照指数降序排列建立并输出多项式;能够完成两个多项式的相加、相减,并将结果输入;

基本要求:在上交资料中请写明:存储结构、多项式相加的基本过程的算法(可以使用程序流程图)、源程序、测试数据和结果、算法的时间复杂度、另外可以提出算法的改进方法;本程序关键点是如何将输入的两个多项式相加、相减操作。

①如何将输入的一元多项式按指数的降序排列

②如何确定要输入的多项式的项数;

③如何将输入的两个一元多项式显示出来。

④如何将输入的两个一元多项式进行相加操作。

⑤如何将输入的两个一元多项式进行相减操作。

本程序是通过链表实现一元多项式的相加减操作。

1.1.2、任务定义

此程序需要完成如下的要求:将多项式按照指数降序排列建立并输出,将两个一元多项式进行相加、相减操作,并将结果输入。

a:输入多项式的项数并建立多项式;

b:输出多项式,输出形式分别为浮点和整数序列,序列按指数升序排列;

c:多项式a和b相加,建立多项式a+b;

d:多项式a和b相减,建立多项式a-b。

e:多项式的输出。

1.2 数据结构的选择和概要设计:

1.2.1数据结构的选用

A:基于链表中的节点可以动态生成的特点,以及链表可以灵活的添加或删除节点的数据结构,为了实现任意多项式的加法,减法,因此选择单链表的结构体,它有一个系数,指数,下一个指针3个元属;例如,图1中的两个线性链表分别表示一元多项式

和一元多项式。从图中可见,每个结点表示多项式中的一项。

图1 多项式表的单链存储结构

B:本设计使用了以下数据结构:

typedef struct node{

int xs; /*系数*/

int zs; /*指数*/

struct node * next; /*next指针*/

}Dnode,* Dnodelist;

C:设计本程序需用到八个模块,用到以下八个子函数如下:

1.Dnodelist Creat_node(void) /*链表初始化*/

2.int Insert_node(Dnodelist D,int xs,int zs) /*插入函数*/

3.Dnodelist Creat_Dmeth(int length) /*创建多项式*/

4.Dnodelist Addresult(Dnodelist D1,Dnodelist D2) /*多项式相加*/

5.Dnodelist Subresult(Dnodelist D1,Dnodelist D2) /*多项式相减*/

6.Dnodelist select(Dnodelist D1,Dnodelist D2) /*选择函数*/

7void Show(Dnodelist D) /*显示(输出)函数*/

8void main()主程序模块调用链一元多项式的各种基本操作模块。

1.2.2 多项式的输入

先输入多项式的项数,采用尾插法的方式,输入多项式中一个项的系数和指数,就产生一个新的节点,建立起它的右指针,并用头节点指向它;

1.2.3 两个多项式的加法

“和多项式”链表中的结点无需另生成,而应该从两个多项式的链表中摘取。其运算规则如下:

假设指针A和B分别指向多项式a和多项式b中当前进行比较的某个结点,则比较两个结点中的指数项,有下列3种情况:

①指针A所指结点的指数值<指针B所指结点的指数值,则应摘取A指针所指结点插入到“和多项式”链表中去;

②指针A所指结点的指数值>指针B所指结点的指数值,则应摘取指针A所指结点插入到“和多项式”链表中去;

③指针A所指结点的指数值=指针B所指结点的指数值,则将两个结点中的系数相加,

若和数不为零,则修改A所指结点的系数值,同时释放B所指结点;反之,从多项式A的链表中删除相应结点,并释放指针A和B所指结点。例如,由图2中的两个链表表示的多项式相加得到的“和多项式”链表如图2所示,图中的长方框表示已被释放的结点。

图2 相加得到的和多项式

上述多项式的相加过程归并两个有序表的过程极其类似,不同之处仅在于,后者在比较数据元素时只出现两种情况。因此,多项式相加的过程也完全可以利用线性链表的基本操作来完成。

1.2.4流程图

(1)在主函数中调用函数进行多项式的输入、输出,运用选择语句来选择加法、减法进行操作,流程图如图3:

图3 主函数流程图

1.3 系统设计

1.3.1 功能算法描述与数据结构说明

该多项式程序除了main()函数外,主要有以下函数:

void Insert(Polyn p,Polyn h)

Polyn CreatePolyn(Polyn head,int m)

void DestroyPolyn(Polyn p)

void PrintPolyn(Polyn P)

int compare(Polyn a,Polyn b)

Polyn AddPolyn(Polyn pa,Polyn pb)

Polyn SubtractPolyn(Polyn pa,Polyn pb)

Polyn MultiplyPolyn(Polyn pa,Polyn pb)

1.3.2 系统主要功能函数的详细设计

1. main()函数

main函数用来实现提示使用者输入、显示功能列表、调用其他运算函数实现运算功能。

在main()函数中,定义m、n用来保存两个多项式的项数,pa、pb、pc、pd、pf定义程序所需链表的头指针。在程序开始要求输入两个多项式的项数,随后根据项数创建两个链表以保存多项式,再显示出功能列表后通过if语句来实现功能的选择,从而对整个程序流程进行控制。

2. Polyn CreatePolyn(Polyn head,int m)

该函数功能是创建新的多项式链表。int m保存的多项式的项数,使用for语句,控制输入多项式的每一项。当创建的链表长度为m时,将不再提示用户继续输入多项式的系数和指数。在该函数中要用到分配空间的函数malloc()为新建链表分配空间。

3. void DestroyPolyn(Polyn p)

该函数的功能是销毁掉创建的两个链表,释放内存。以辅助退出程序。

4. void Insert(Polyn p,Polyn h)

该函数功能:将新的节点p插入到现有链表的后面,并确保多项式的指数exp是升序。将s 节点插入到head所指向的链表。在该函数的操作中,要注意指针是如何移动的。

5. Polyn AddPolyn(Polyn pa,Polyn pb)

该函数功能:实现两个多项式pa、pb相加,并将计算结果存储于新建立的pc中,它的原理是将指数相同的单项式相加,系数相加后为0,则pa、pb的指针都后移。在加法计算中要求pa,与pb的幂次序都是升序,否则可能得到错误的结果。

该函数调用了int compare(Polyn a,Polyn b)的结果,用来判断多项式在同一指数下a、b 是否有为系数为0。同样也使用了malloc()关键字,为新链表创建空间。

6. int compare(Polyn a,Polyn b)

该函数功能:判断两个多项式在同一指数下是否有其中一个为系数为0。用来辅助加法和乘法运算。

7. Polyn SubtractPolyn(Polyn pa,Polyn pb)

该函数功能:实现两个多项式pa、pb相减,其原理根加法类似,将指数相同的指数相减。与加法不同的是在送在减法中,创建了新的链表来存放结果,并返回该链表的头指针。

相关文档
最新文档