当前位置:文档之家› 数据结构一元多项式的运算

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

目录一、问题分析 (1)1.1 问题描述 (1)1.2 问题的数学模型 (1)1.3 构造数据结构 (1)二、系统分析 (2)2.1 可行性研究 (2)2.2 系统结构与主要功能模块 (2)三、系统设计 (4)3.1系统设计目的与要求 (4)3.2系统设计内容 (4)3.3功能算法描述与数据结构说明 (4)四、系统实现 (7)五、调试及运行结果 (11)六、收获和体会 (12)附录 (13)1 问题分析1.1 问题描述设计一个n元多项式程序,并完成多项式的乘法运算。

从实际的角度出发,这里设计的程序是基于一元n次多项式的数学模型。

1.2 问题的数学模型在数学上,一个一元多项式Pn(x)可按升幂写成:Pn(x)=a 0+a1 x+a2 x^2 +…+a n x^n-1 .它由n+1个系数惟一确定,因此,在计算机里,它可用一个线性表P来表示:Pn=(a0,a1,a2,…,an)每一项的指数i隐含在其系数ai的序号里。

多项式的乘法规则:多次运用单项式与多项式相乘的法则得到的.计算时(a+b)(m+n),先把(m+n)看成一个单项式,(a+b)是一个多项式,运用单项式与多项式相乘的法则,得到(a+b)(m+n)=a(m+n)+b(m+n),然后再次运用单项式与多项式相乘的法则。

1.3 构造数据结构通过分析多项式的特征,不难看出多项式是由单项式构成的,而每个单项式都具有系数和指数,当系数为0时,该项就失去了意义,在计算机内要表示一个多项式,至少以下数据信息:系数信息、指数信息和指向下一个单项式的指针。

通过指针,我们就可以把多个单项式连接起来,形式一个多项式,需要说明的是从广义的角度讲,单项式也是一个多项式。

基于以上的分析,我们定义多项式的数据结构为如下结构体形式:typedef struct Polynomial{float coef;//系数int expn;//指数struct Polynomial *next;//指向下一个结点}*Polyn,Polynomial; //Polyn为结点指针类型2 系统分析2.1 可行性研究该程序主要从技术的角度来分析可行性。

技术上的可行性研究主要分析技术条件能否顺利完成开发工作,硬、软件能否满足开发者的需要等。

该系统采用了Windows XP 操作系统结合Visual C++ 6.0,TC 2.0等软件开发平台已成熟可行。

硬件方面,科技飞速发展的今天,硬件更新的速度越来越快,容量越来越大,可靠性越来越高,其硬件平台也比较能满足此系统的需要。

此外,还有经济可行性,用户使用可行性,法律可行性等可行性研究,这里从简省去。

2.2 系统结构与主要功能模块从实现多项式式运算过程的角度来分析,至少需要这样一些子功能模块。

如:1. 多项式创建功能;2. 多项式运算功能;3. 操作界面显示功能;4. 销毁多项式的功能;5. 多项式复制功能等。

系统的整体流程和主要功能模块如图2-1所示图 2-13 系统设计3.1系统设计目的与要求通过多项式运算程序设计(用C语言实现),使我们进一步掌握和利用C语言进行结构化程序设计的能力;进一步理解和运用结构化程设计的思想和方法;初步掌握开发一个小型系统程序设计的基本方法;学会调试一个较长程序的基本方法;学会利用流程图或N-S图表示算法;以及掌握书写课程设计开发文档的能力(书写课程设计报告)。

总之,通过本课程设计加深对《C语言》及《数据结构》课程所学知识的理解,进一步巩固C语言语法规则,在程序中体现出算法的思想,提高程序的运行效率。

学会编制结构清晰、风格良好、数据结构适当的C语言程序,从而具备解决综合性实际问题的能力。

3.2系统设计内容多项式运算程序具有以下基本功能:1.界面输出,提示如何输入数据。

要求先输入多项式的项数。

2.创建多项式。

接收输入的数据,并保存到链表中。

3.显示程序的功能表,允许使用者选择运算类型。

4.显示已经创建好的多项式。

6.实现加法运算。

7.实现减法运算。

8.实现乘法运算。

9.清除内存内容,销毁创建的链表,退出程序。

3.3功能算法描述与数据结构说明该多项式程序除了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)下面对这些函数逐一介绍。

3.3. 系统主要功能函数的详细设计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相减,其原理根加法类似,将指数相同的指数相减。

与加法不同的是在送在减法中,创建了新的链表来存放结果,并返回该链表的头指针。

8. void PrintPolyn(Polyn P)该函数功能:显示多项式链表。

在该函数中较复杂的是如何控制链表的输出,尤其是第一项的输出,同时还有符号的控制。

在输出第一项时要判断是不是常数项,若是,则不要输出字符x。

9. Polyn MultiplyPolyn(Polyn pa,Polyn pb)函数功能:实现两个多项式相乘,A(X) * B(x) 。

计算时运用单项式与多项式相乘的法则,然后再次运用单项式与多项式相乘的法则。

4 系统实现该程序实现了多项式的创建、多项式的加法、减法、乘法运算以及多项式的清除。

为完成这些功能,还用到了一些辅助函数。

下面讨论重要函数具体实现过程及其参数的意义:1. Polyn CreatePolyn(Polyn head,int m)该函数的两个参数,head表示为创建的链表的头指针,m表示为链表的长度,即多项式的项数。

定义int i计数,当i<m时,for 语句反复提示用户输入该多项式的每一项的指数和系数,并保存。

当i=m时,输入完毕,该链表也创建完毕。

详细的实现过程如下:Polyn CreatePolyn(Polyn head,int m){int i;//用来计数Polyn p;//定义一个p链表p=head=(Polyn)malloc(sizeof(struct Polynomial));head->next=NULL;for(i=0;i<m;i++){p=(Polyn)malloc(sizeof(struct Polynomial));//建立新结点以接收数据printf("请输入第%d项的系数与指数:",i+1);scanf("%f %d",&p->coef,&p->expn);Insert(p,head); //调用Insert函数插入结点}return head;}//CreatePolyn2. void Insert(Polyn p,Polyn h) 该函数具有两个参数,用来实现链表的顺序排列和合并相同的项。

以下是实现插入的关键代码:void Insert(Polyn p,Polyn h){if(p->coef==0) free(p); //系数为0的话释放结点else{//如果系数不为0Polyn q1,q2;q1=h;q2=h->next;while(q2&&p->expn<q2->expn){ //查找插入位置q1=q2;q2=q2->next; }if(q2&&p->expn==q2->expn){ //将指数相同相合并q2->coef+=p->coef;free(p);if(!q2->coef){ //系数为0的话释放结点q1->next=q2->next;free(q2); }}else{ //指数为新时将结点插入p->next=q2;q1->next=p;}}}//Insert3. Polyn AddPolyn(Polyn pa,Polyn pb) 该函数有两个参数,其类型均为polyn,分别表示要相加的两个不同的多项式。

其计算的结果存放在新建的pc所指向的链表中。

函数中调用了int compare(Polyn a,Polyn b)的结果。

下面是实现加法的关键代码:Polyn AddPolyn(Polyn pa,Polyn pb){//求解并建立多项式a+b,返回其头指针Polyn qa=pa->next;Polyn qb=pb->next;Polyn headc,hc,qc;hc=(Polyn)malloc(sizeof(struct Polynomial));//建立头结点hc->next=NULL;headc=hc;while(qa||qb){qc=(Polyn)malloc(sizeof(struct Polynomial));switch(compare(qa,qb)){case 1: {qc->coef=qa->coef;qc->expn=qa->expn;qa=qa->next;break;}case 0: {qc->coef=qa->coef+qb->coef;qc->expn=qa->expn;qa=qa->next;qb=qb->next;break;}case -1:{qc->coef=qb->coef;qc->expn=qb->expn;qb=qb->next;break;}}//switchif(qc->coef!=0){qc->next=hc->next;hc->next=qc;hc=qc;}else free(qc);//当相加系数为0时,释放该结点}//whilereturn headc;}//AddPolynint compare(Polyn a,Polyn b){if(a&&b){if(!b||a->expn>b->expn) return 1;else if(!a||a->expn<b->expn) return -1;else return 0;}else if(!a&&b) return -1;//a多项式已空,但b多项式非空else return 1;//b多项式已空,但a多项式非空}//compare4. Polyn MultiplyPolyn(Polyn pa,Polyn pb) 该函数同加法一样,拥有相同的参数并且同样将新建立的链表pf的指针返回,用来实现输出乘法结果。

相关主题