北邮数据结构上机 一元多项式

合集下载

数据结构实验一题目3一元多项式

数据结构实验一题目3一元多项式

北京邮电大学电信工程学院数据结构实验报告实验名称:实验一题目3一元多项式学生姓名:卢跃凯班级:信通12班班内序号:13号学号:日期:2013/11/131.实验要求1 实验目的通过选择下面两个题目之一进行实现,掌握如下内容:➢掌握二叉树基本操作的实现方法➢学习使用二叉树解决实际问题的能力题目1➢根据二叉树的抽象数据类型的定义,使用二叉链表实现一个二叉树。

➢二叉树的基本功能:➢1、二叉树的建立➢2、前序遍历二叉树➢3、中序遍历二叉树➢4、后序遍历二叉树➢5、按层序遍历二叉树➢6、求二叉树的深度➢7、求指定结点到根的路径➢8、二叉树的销毁➢9、其他:自定义操作➢编写测试main()函数测试线性表的正确性2. 程序分析第1页2.1 存储结构采用二叉树的存储结构,其中每个二叉树的结点定义了一个结构体BiNode<T>*lch;,该结构体包含三个元素,分别是一个T类型的数据域data,一个指向T类型的指针左孩子BiNode<T>*lch;,一个指向T类型的指针右孩子,示意图如图所示。

在对二叉树的层序遍历算法的实现过程中,采用了队列的存储结构。

队列的存储结构示意如图所示:在二叉树的创建中,对于二叉树中每个结点的data 域的赋值,我们事先把这些data 储存在一个数组中,通过对数组元素的调用事先对二叉树中每个结点的data 域的赋值。

2.2 关键算法分析一:二叉树的建立:A.自然语言描述:1 首先判断调用的数组是否为空,如果该数组不为空,则把调用的数组的第一个元素的赋给根节点的data 域。

北京邮电大学信息与通信工程学院2 采用递归的思想,分别将根节点的左右孩子作为根节点,递归调用该函数。

完成对左右子树的赋值。

3如果为空,直接将一个已经初始化好的根节点置为空。

B.代码详细分析:void BiTree<T>::Create (BiNode<T>*&R,T data[],int i){//i表示位置,从1开始if(data[i-1]!=0){R = new BiNode<T>; //创建根结点R->data = data[i-1];Create(R->lch,data,2*i);//创建左子树Create(R->rch,data,2*i+1);//创建右子树}elseR = NULL;}第3页二:前序遍历二叉树:A.自然语言描述:1.首先判断根结点是否为空,如果不为空,输出根结点data域中所存储的值。

数据结构一元多项式报告

数据结构一元多项式报告

一元多项式计算:程序要求:1)、能够按照指数降序排列建立并输出多项式;2)、能够完成两个多项式的相加、相减,并将结果输入。

概要设计:1.功能:将要进行运算的多项式输入输出。

2.数据流入:要输入的多项式的系数与指数。

3.数据流出:合并同类项后的多项式。

4.程序流程图:多项式输入流程图如图3.2.1所示。

5.测试要点:输入的多项式是否正确,若输入错误则重新输入2、多项式的加法(1)功能:将两多项式相加。

(2)数据流入:输入函数。

(3)数据流出:多项式相加后的结果。

(4)程序流程图:多项式的加法流程图如图3.2.2所示。

(5)测试要点:两多项式是否为空,为空则提示重新输入,否则,进行运算。

3、多项式的减法(1)功能:将两多项式相减。

(2)数据流入:调用输入函数。

(3)数据流出:多项式相减后的结果。

(4)程序流程图:多项式的减法流程图如图3.2.3所示。

(5)测试要点:两多项式是否为空,为空则提示重新输入,否则,进行运算。

详细代码:#include<iostream>#include<conio.h>#include<stdlib.h>using namespace std; struct Node{float coef;//结点类型int exp;};typedef Node polynomial;struct LNode{polynomial data;//链表类型LNode *next;};typedef LNode* Link;void CreateLink(Link &L,int n);void PrintList(Link L);void PolyAdd(Link &pc,Link pa,Link pb);void PolySubstract(Link &pc,Link pa,Link pb); void CopyLink(Link &pc,Link pa);void PolyMultiply(Link &pc,Link pa,Link pb);int JudgeIfExpSame(Link pa,Link e);void DestroyLink(Link &L);int CompareIfNum(int i);void DestroyLink(Link &L){Link p;p=L->next;while(p){L->next=p->next;delete p;p=L->next;}delete L;L=NULL;}//创建含有n个链表类型结点的项,即创建一个n项多项式void CreateLink(Link &L,int n){if(L!=NULL){DestroyLink(L);}Link p,newp;L=new LNode;L->next=NULL;(L->data).exp=-1;//创建头结点p=L;for(int i=1;i<=n;i++){newp=new LNode;cout<<"请输入第"<<i<<"项的系数和指数:"<<endl;cout<<"系数:";cin>>(newp->data).coef;cout<<"指数:";cin>>(newp->data).exp;if(newp->data.exp<0){cout<<"您输入有误,指数不允许为负值!"<<endl;delete newp;i--;continue;}newp->next=NULL;p=L;if(newp->data.coef==0){cout<<"系数为零,重新输入!"<<endl;delete newp;i--;continue;}while((p->next!=NULL)&&((p->next->data).exp<(newp->data).exp)){p=p->next; //p指向指数最小的那一个}if(!JudgeIfExpSame( L, newp)){newp->next=p->next;p->next=newp;}else{cout<<"输入的该项指数与多项式中已存在的某项相同,请重新创建一个正确的多项式"<<endl;delete newp;DestroyLink(L);CreateLink(L,n); //创建多项式没有成功,递归调用重新创建break;}}}/*判断指数是否与多项式中已存在的某项相同*/int JudgeIfExpSame(Link L,Link e){Link p;p=L->next;while(p!=NULL&&(e->data.exp!=p->data.exp))p=p->next;if(p==NULL)return 0;else return 1;}/*输出链表*/void PrintList(Link L){Link p;if(L==NULL||L->next==NULL)cout<<"该一元多项式为空!"<<endl;else{p=L->next;//项的系数大于的种情况if((p->data).coef>0){if((p->data).exp==0)cout<<(p->data).coef;else if((p->data).coef==1&&(p->data).exp==1)cout<<"x";else if((p->data).coef==1&&(p->data).exp!=1)cout<<"x^"<<(p->data).exp;else if((p->data).exp==1&&(p->data).coef!=1)cout<<(p->data).coef<<"x";else cout<<(p->data).coef<<"x^"<<(p->data).exp; }//项的系数小于的种情况if((p->data).coef<0){if((p->data).exp==0)cout<<(p->data).coef;else if(p->data.coef==-1&&p->data.exp==1)cout<<"-x";else if(p->data.coef==-1&&p->data.exp!=1)cout<<"-x^"<<p->data.exp;else if(p->data.exp==1)cout<<p->data.coef<<"x";else cout<<(p->data).coef<<"x^"<<(p->data).exp; }p=p->next;while(p!=NULL){if((p->data).coef>0){if((p->data).exp==0)cout<<"+"<<(p->data).coef;else if((p->data).exp==1&&(p->data).coef!=1)cout<<"+"<<(p->data).coef<<"x";else if((p->data).exp==1&&(p->data).coef==1)cout<<"+"<<"x";else if((p->data).coef==1&&(p->data).exp!=1)cout<<"+"<<"x^"<<(p->data).exp;else cout<<"+"<<(p->data).coef<<"x^"<<(p->data).exp; }if((p->data).coef<0){if((p->data).exp==0)cout<<(p->data).coef;else if(p->data.coef==-1&&p->data.exp==1)cout<<"-x";else if(p->data.coef==-1&&p->data.exp!=1)cout<<"-x^"<<p->data.exp;else if(p->data.exp==1)cout<<p->data.coef<<"x";else cout<<(p->data).coef<<"x^"<<(p->data).exp;}p=p->next;}}cout<<endl;}/*把一个链表的内容复制给另一个链表*/void CopyLink(Link &pc,Link pa){Link p,q,r;pc=new LNode;pc->next=NULL;r=pc;p=pa;while(p->next!=NULL){q=new LNode;q->data.coef=p->next->data.coef;q->data.exp=p->next->data.exp;r->next=q;q->next=NULL;r=q;p=p->next;}}/*将两个一元多项式相加*/void PolyAdd(Link &pc,Link pa,Link pb){Link p1,p2,p,pd;CopyLink(p1,pa);CopyLink(p2,pb);pc=new LNode;pc->next=NULL;p=pc;p1=p1->next;p2=p2->next;while(p1!=NULL&&p2!=NULL){if(p1->data.exp<p2->data.exp){p->next=p1;p=p->next;p1=p1->next;}else if(p1->data.exp>p2->data.exp){p->next=p2;p=p->next;p2=p2->next;}else{p1->data.coef=p1->data.coef+p2->data.coef;if(p1->data.coef!=0){p->next=p1;p=p->next;p1=p1->next;p2=p2->next;}else{pd=p1;p1=p1->next;p2=p2->next;delete pd;}}}if(p1!=NULL){p->next=p1;}if(p2!=NULL){p->next=p2;}}/*将两个多项式相减*/void PolySubstract(Link &pc,Link pa,Link pb) {Link p,pt;CopyLink(pt,pb);p=pt;while(p!=NULL){(p->data).coef=(-(p->data).coef);p=p->next;}PolyAdd(pc,pa,pt);DestroyLink(pt);}//清屏函数void Clear(){system("pause");system("cls");}/*将两个一元多项式相乘*/void PolyMultiply(Link &pc,Link pa,Link pb) {Link p1,p2,p,pd,newp,t;pc=new LNode;pc->next=NULL;p1=pa->next;p2=pb->next;while(p1!=NULL){pd=new LNode;pd->next=NULL;p=new LNode;p->next=NULL;t=p;while(p2){newp=new LNode;newp->next=NULL;newp->data.coef=p1->data.coef*p2->data.coef;newp->data.exp=p1->data.exp+p2->data.exp;t->next=newp;t=t->next;p2=p2->next;}PolyAdd(pd,pc,p);CopyLink(pc,pd);p1=p1->next;p2=pb->next;DestroyLink(p);DestroyLink(pd);}}//菜单函数void Menu(){cout<<""<<endl;cout<<endl;cout<<"\t=========================一元多项式的简单运算========================="<<endl;cout<<"\t\t\t\t\t\t\t\t "<<endl;cout<<"\t\t\t [1] 创建要运算的两个一元多项式\t\t "<<endl; cout<<"\t\t\t [2] 将两个一元多项式相加\t\t\t "<<endl; cout<<"\t\t\t [3] 将两个一元多项式相减\t\t\t "<<endl; cout<<"\t\t\t [4] 将两个一元多项式相乘\t\t\t "<<endl; cout<<"\t\t\t [5] 显示两个一元多项式\t\t\t "<<endl;cout<<"\t\t\t [6] 销毁所创建的二个多项式\t\t "<<endl; cout<<"\t\t\t [7] 退出\t\t\t\t\t "<<endl;cout<<"\t\t\t\t\t\t\t\t "<<endl;cout<<"\t=========================一元多项式的简单运算========================="<<endl;cout<<endl;cout<<"\t\t 请选择:";}//判断输入的整数是不是为到的数字int CompareIfNum(int i){if(i>0&&i<8)return 0;else return 1;}void main(){{system("color b");//system("pause");system("color a");//system("pause");}int n;Link L,La=NULL,Lb=NULL;//La,Lb分别为创建的两个多项式int choose;while(1){Menu(); //调用菜单函数cin>>choose;switch(choose){case 1:cout<<"请输入你要运算的第一个一元多项式的项数:"<<endl; cin>>n;if(CompareIfNum(n)==1){cout<<"您的输入有误,请重新输入……"<<endl;Clear();break;}CreateLink(La,n);cout<<"请输入你要运算的第二个一元多项式的项数:"<<endl; cin>>n;if(CompareIfNum(n)==1){cout<<"您的输入有误,请重新输入……"<<endl;Clear();break;}CreateLink(Lb,n);Clear();break;case 2:if(La==NULL||Lb==NULL){cout<<"您的多项式创建有误,请重新选择……"<<endl; Clear();break;}PolyAdd(L,La,Lb);cout<<""<<endl;cout<<"待相加的两个一元多项式为:"<<endl;cout<<""<<endl;cout<<"A的多项式为:";PrintList(La);cout<<""<<endl;cout<<"B的多项式为:";PrintList(Lb);cout<<""<<endl;cout<<"相加后的结果为:";PrintList(L);cout<<""<<endl;Clear();DestroyLink(L);break;case 3:if(La==NULL||Lb==NULL){cout<<"您的多项式创建有误,请重新选择……"<<endl; Clear();break;}PolySubstract(L,La,Lb);cout<<"相减的两个一元多项式为:"<<endl;cout<<""<<endl;cout<<"A的多项式为:";PrintList(La);cout<<""<<endl;cout<<"B的多项式为:";PrintList(Lb);cout<<""<<endl;cout<<"相减后的结果为:";PrintList(L);cout<<""<<endl;Clear();DestroyLink(L);break;case 4:if(La==NULL||Lb==NULL){cout<<"您的多项式创建有误,请重新选择……"<<endl; Clear();break;}PolyMultiply(L,La,Lb);cout<<"相乘的两个一元多项式为:"<<endl;cout<<""<<endl;cout<<"A的多项式为:";PrintList(La);cout<<""<<endl;cout<<"B的多项式为:";PrintList(Lb);cout<<""<<endl;cout<<"相乘后的结果为:";PrintList(L);DestroyLink(L);cout<<""<<endl;Clear();break;case 5:if(La==NULL||Lb==NULL){cout<<"您的多项式创建有误,请重新选择……"<<endl; Clear();break;}cout<<"一元多项式A为:"<<endl;PrintList(La);cout<<""<<endl;cout<<"一元多项式B为:"<<endl;PrintList(Lb);cout<<""<<endl;Clear();break;case 6:if(La&&Lb){DestroyLink(La);DestroyLink(Lb);cout<<"多项式销毁成功!"<<endl;Clear();}else{cout<<"多项式不存在,请重新选择^^^"<<endl;Clear();}break;case 7:exit(0); //exit(0)强制终止程序,返回状态码表示正常结束default:cout<<"您的输入有误,请重新选择操作……"<<endl;Clear();break;}}}。

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

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

数据结构一元多项式的运算正文:1. 引言本文档旨在介绍数据结构中一元多项式的运算方法。

一元多项式是指在一个变量上的多项式,其中每一项由一个系数和一个指数组成。

我们将会讨论一元多项式的表示、存储和基本运算,包括多项式的加法、减法、乘法和求导等操作。

2. 一元多项式的表示和存储2.1 一元多项式的定义一元多项式是指在一个变量x上的多项式,每一项由一个系数和一个指数组成,例如:2x^3 - 5x^2 + 3x + 1.其中,2、-5、3和1分别是系数,3、2、1和0分别是指数。

2.2 一元多项式的表示方法一元多项式可以使用数组、链表或其他数据结构来表示。

在本文中,我们选择使用数组来表示一元多项式。

数组的索引代表指数,数组的元素代表系数。

例如,多项式 2x^3 - 5x^2 + 3x + 1 可以表示为 [1, 3, -5, 2]。

2.3 一元多项式的存储结构为了表示一元多项式,我们可以使用一个数组来存储多项式的系数。

数组的长度应该比多项式的最高指数大1.数组的索引代表指数,数组的元素代表系数。

例如,数组 [1, 3, -5, 2] 表示的多项式 2x^3 - 5x^2 + 3x + 1 中,索引0对应指数为3的项,索引1对应指数为2的项,以此类推。

3. 一元多项式的基本运算3.1 一元多项式的加法一元多项式的加法是指将两个多项式相加,并合并同类项。

具体操作如下:- 将两个多项式的系数相加,并将结果存储在一个新的多项式中。

- 遍历新的多项式,将相邻的相同指数的项合并。

3.2 一元多项式的减法一元多项式的减法是指将一个多项式减去另一个多项式,并合并同类项。

具体操作如下:- 将两个多项式的系数相减,并将结果存储在一个新的多项式中。

- 遍历新的多项式,将相邻的相同指数的项合并。

3.3 一元多项式的乘法一元多项式的乘法是指将两个多项式相乘,并合并同类项。

具体操作如下:- 遍历一个多项式的每一项,与另一个多项式的每一项相乘。

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

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

数据结构一元多项式的运算数据结构一元多项式的运算1、引言1.1 研究背景1.2 研究目的2、一元多项式的定义2.1 一元多项式的概念2.2 一元多项式的表示方法2.3 一元多项式的次数和系数2.4 一元多项式的零多项式和常数项2.5 一元多项式的加法运算2.6 一元多项式的减法运算2.7 一元多项式的乘法运算3、一元多项式的特殊运算3.1 一元多项式的乘方运算3.2 一元多项式的取余运算3.3 一元多项式的求导运算3.4 一元多项式的积分运算3.5 一元多项式的复合运算4、一元多项式的应用4.1 一元多项式在数学中的应用4.2 一元多项式在计算机科学中的应用4.3 一元多项式在工程领域中的应用5、实例分析5.1 实例一:一元多项式的相加减5.2 实例二:一元多项式的乘法运算5.3 实例三:一元多项式的特殊运算应用6、结论附件:附件一:一元多项式的代码实现示例法律名词及注释:1.一元多项式: 指仅有一个未知数的多项式。

2.多项式的次数: 多项式中各项最高次幂的次数。

3.多项式的系数: 多项式中各项中未知数的系数。

4.零多项式: 所有系数均为0的多项式。

5.常数项: 多项式中次数为0的项,即常数项。

6.多项式的加法运算: 将两个多项式相同次项的系数相加。

7.多项式的减法运算: 将两个多项式相同次项的系数相减。

8.多项式的乘法运算: 将两个多项式的各项相乘,并根据指数相加合并同类项。

9.多项式的乘方运算: 将一个多项式自乘n次。

10.多项式的取余运算: 两个多项式相除后的余数部分。

11.多项式的求导运算: 对多项式中的每一项进行求导操作。

12.多项式的积分运算: 对多项式中的每一项进行积分操作。

13.多项式的复合运算: 将一个多项式代入另一个多项式中进行运算。

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

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

数据结构一元多项式的运算第一章引言在计算机科学中,数据结构是指一组数据和数据之间的关系,以及在这组数据上定义的一组操作。

数据结构是计算机算法的基础,它能够提高数据的组织和处理效率。

本文将详细介绍一元多项式的运算,包括多项式的表示方式以及常见的运算操作。

第二章多项式的表示方式多项式可表示为一系列项的和,其中每一项由系数和指数组成。

常见的表示方式有两种:________1.数组表示法:________将多项式的每一项按照指数从小到大的顺序存储在一个数组中。

数组的下标表示项的指数,数组的元素存储项的系数。

例如,多项式 P(x) = 2x^3 + 3x^2 ●4x + 1 可表示为数组 1, -4, 3, 2。

2.链表表示法:________将多项式的每一项作为链表的一个节点,节点包含指数和系数两个属性,通过链表的方式连接起来。

例如,多项式 P(x) = 2x^3 + 3x^2 ●4x + 1 可表示为链表的形式:________2 ->3 -> -4 -> 1---● ---● ---● ----x^3 x^2 x 1第三章多项式的基本运算多项式的基本运算包括多项式的加法、减法、乘法和求导。

1.多项式的加法:________将两个多项式相加,实际上是将对应指数的系数相加。

例如,多项式 P(x) = 2x^3 + 3x^2 ●4x + 1和多项式 Q(x) = x^2 + 2x + 3 相加得到多项式 R(x) = 2x^3 +4x^2 ●2x + 4。

2.多项式的减法:________将一个多项式减去另一个多项式,实际上是将对应指数的系数相减。

例如,将多项式 P(x) 减去多项式 Q(x) 得到多项式 R(x) = 2x^3 + 2x^2 ●6x ●2。

3.多项式的乘法:________将两个多项式相乘,实际上是将一个多项式的每一项与另一个多项式的每一项相乘,然后将结果相加。

例如,将多项式 P(x) = 2x^3 + 3x^2 ●4x + 1 与多项式 Q(x) =x^2 + 2x + 3 相乘得到多项式 R(x) = 2x^5 + 7x^4 ●4x^3 +9x^2 ●5x + 3。

数据结构《一元多项式》

数据结构《一元多项式》

一元多项式相加问题实验报告本实验的目的是进一步熟练掌握应用链表处理实际问题的能力。

一、问题描述通过键盘输入两个形如Po+P₁X¹+P₂X²+…+PX的多项式,经过程序运算后在屏幕上输出它们的相加和。

二、数据结构设计分析任意一元多项式的描述方法可知,一个一元多项式的每一个子项都由“系数-指数”两部份组成,因此可将其抽象为包含系数coef、指数 exp、指针域next 构成的链式线性表。

对多项式中系数为0的子项可以不记录它的指数值,将两个多项式分别存放在两个线性表中,然后经过相加后将所得多项式存放在一个新的线性表中,但是不用再开辟新的存储空间,只依靠结点的挪移来构成新的线性表,期间可以将某些不需要的空间回收。

基于这样的分析,可以采用不带头结点的单链表来表示一个一元多项式。

具体数据类型定义为:struct nodefloat coef;//系数域int exp; //指数域struct node *next;};三、功能函数设计1、输入并建立多项式的功能模块具体函数为node *in f un()此函数的处理较为全面,要求用户按照指数递增的顺序和一定的输入格式输入各个系数不为0的子项,输入一个子项建立一个相关结点,当遇到输入结束标志时住手输入。

关键步骤具体如下:(1)控制用户按照指数递增的顺序输入r=a;while(r!=q->next)if(y<=r->exp)cout<<"请按照指数递增顺序输入,请重新输入";cin>>x>>y;break;r=r->next;从头开始遍历,若遇到目前输入的指数不是最大时,就跳出循环,让用户重新输入。

(2)当输入的系数为零时,不为其分配存储空间存储while(x==0){cin>>x>>y;continue;}即若系数为0,再也不进行动态分配并新建结点,而是重新提取用户输入的下一个子项的系数和指数,利用continue 进入下一次循环。

数据结构课程设计(一元多项式)

数据结构课程设计(一元多项式)
cout<<" ~~~~~~~~~~~~~~~~0.退出~~~~~~~~~~~~~~~\n";
cout<<" ********1.两个一元多项式相加*********\n";
cout<<" ********2.两个一元多项式相乘*********\n";
cout<<" ********3.两个一元多项式相减*********\n";
cout<<p->coef;//其余情况都得打印
if(p->expn!=0) printf("x^%d",p->expn);//如果指数为"0"不打印指数项
else if((p->coef==1)||(p->coef==-1))
cout<<"1";
if(p->next==NULL)
flag=1;//如果现在的链节没有下一个就结束
(6)NODE *multi(NODE *pa,NODE *pb),函数功能是实现多项式的相乘。创建新链表,生成新结点,第一个式子中的每一项都与第二个式子中每一项系数相乘指数相加,直到两个式子中的结点都运算完毕,返回新链表;
(7)void output(NODE *f),函数功能是输出多项式。把运算完毕的新的多项式按结点依次输出,其中,若结点系数为正数则用+连接前后两个结点,若为负数则用-连接,系数为0则不输出指数;
{
if(q->next==NULL)
{
q->next=pb;
flag=1;
}
else
{

数据结构实验报告-一元多项式

数据结构实验报告-一元多项式

数据结构实验报告-一元多项式数据结构课程设计报告课题: 一元多项式姓名:XX学号:201417030218专业班级:XXXX指导教师:XXXX设计时间:2015年12月30日星期三评阅意见:评定成绩:指导老师签名:年月日目录一、任务目标 (3)二、概要设计 (4)三、详细设计 (6)四、调试分析 (8)五、源程序代码 (8)六、程序运行效果图与说明 (15)七、本次实验小结 (16)八、参考文献 (16)一丶任务目标分析 (1) a.能够按照指数降序排列建立并输出多项式b.能够完成两个多项式的相加,相减,并将结果输入要求:程序所能达到的功能:a.实现一元多项式的输入;b.实现一元多项式的输出;c.计算两个一元多项式的和并输出结果;d.计算两个一元多项式的差并输出结果;除任务要求外新增乘法:计算两个一元多项式的乘积并输出结果(2)输入的形式和输入值的范围:输入要求:分行输入,每行输入一项,先输入多项式的指数,再输入多项式的系数,以0 0为结束标志,结束一个多项式的输入。

输入形式:2 3-1 23 01 20 0输入值的范围:系数为int型,指数为float型(3)输出的形式:第一行输出多项式1;第二行输出多项式2;第三行输出多项式1与多项式2相加的结果多项式;第四行输出多项式1与多项式2相减的结果多项式;第五行输出多项式1与多项式2相乘的结果多项式二、概要设计程序实现a. 功能:将要进行运算的二项式输入输出;b. 数据流入:要输入的二项式的系数与指数;c. 数据流出:合并同类项后的二项式;d. 程序流程图:二项式输入流程图;e. 测试要点:输入的二项式是否正确,若输入错误则重新输入。

流程图:三、详细设计(1):存储结构一元多项式的表示在计算机内可以用链表来表示,为了节省存储空间,只存储多项式中系数非零的项。

链表中的每一个结点存放多项式的一个系数非零项,它包含三个域,分别存放该项的系数、指数以及指向下一个多项式项结点的指针。

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

数据结构实验报告实验名称:实验1——线性表学生姓名:班级:班内序号:学号:日期:1.实验要求实验目的:熟悉C++语言的基本编程方法,掌握集成编译环境的测试方法学习指针、模板类、异常处理的使用掌握线性表的操作实现方法培养使用线性表解决实际问题的能力实验内容:利用线性表实现一个一元多项式Polynomial;f(x)=a0+a1x+a2x2+a3x3+…+anxn提示:Polynomial的结点结构如下:struct term{float coef;\\系数int expn;\\指数};可以使用链表实现,也可以使用顺序表实现具体要求如下:能够实现一元多项式的输入和输出能够进行一元多项式相加能够进行一元多项式相减能够计算一元多项式在x处的值能够计算一元多项式的导数(选作)能够进行一元多项式相乘(选作)编写main ()函数测试算法的正确性2. 程序分析由于多项式是线性结构,故选择线性表来实现,在这个程序中我采用的是单链表结构,每个结点代表一个项,多项式的每一项可以用其系数和指数唯一的表示。

如果采用顺序存储,那么对于结点的插入和删除的操作会比较麻烦,而且顺序表的结点个数固定,对于可能发生的情况无法很好的处理,而采用链表就会简单许多,还能自由控制链表的长度。

本程序完成的主要功能:1、输入和输出:需要输入的信息有多项式的项数,用来向系统动态申请内存;多项式各项的系数和指数,用来构造每个结点,形成链表。

输出即是将多项式的内容向屏幕输出。

2、多项式相加与相减:多项式的加减要指数相同即是同类项才能实现,所以在运算时要注意判断指数出现的各种不同的情况,分别写出计算方法。

将每项运算得到的结果都插入到新的链表中,形成结果多项式。

3、多项式在某点的值:由用户输入x 的值,然后求出每项的值相加即可。

4、多项式的求导运算:多项式的求导根据数学知识,就是将每项的系数乘以指数,将指数减1即可,将每项得到的结果插入到结果多项式的链表中。

5、多项式的乘法:根据输入信息八两多项式计算,并输出一个新的多项式。

2.1 存储结构本程序采用的存储结构是单链表结构,其定义的结点包括三部分:系数、指数以及下一个结点的地址。

示意图如下:2.2 关键算法分析1、多项式的输入:自然语言描述:1. 设置多项式的项数n ;2. 按照多项式的项数申请动态结构数组element *e=new element[n]存储多项式的系数和指数;3. 按照指数递增的次序输入各项的系数以及指数,分别存入coef 和exp ;4. 再将输入的系数以及指数赋给每一个结点的coef 和exp 域;5. 利用头插法将每个结点加入链表。

·伪代码:1. 输入项数n ;2. element *e=new element[n];3. 运用for 循环,循环n 次3.1 element *e=new element[n];3.2 cin>>e[i].exp; 3.3 cin>>e[i].coef; 3.4 return e;4. 运用头插法将结点插入链表。

2、多项式的输出·自然语言描述:next coef1 exp1 next Coef2 exp2 next coefn expn next…… front1.获取头结点;2.循环n-1次(n为多项式的项数)2.1将指针的指向后移;2.2依照多项式的各种情况,设置输出方式2.2.1 系数为1且指数不为1和0,输出Xexpn+;2.2.2 系数不为0且指数为0,输出(coef)+;2.2.3 系数不为0且指数为1,输出(coef)X+;2.2.4 系数不为0和1,指数不为0和1,输出(coef)X(expn)+;3.将指针指向移到最后一个节点。

重复2.2中判断,但不输出+号。

源代码如下:Node <element> *p= GetFirst()->next;if(p==NULL){cout<<0;}while(p){if(p->data.exp==0){cout<<p->data.coef;}else{cout<<p->data.coef<<"X"<<p->data.exp;}p=p->next;if((p!=0)&&(p->data.coef>0)){cout<<"+";}}3、多项式的相加相减·自然语言描述:1.指针p和q分别指向a和b两个多项式的头结点的下一个节点;2.将结果多项式的项数置为0;3.只有p或q非空,进行以下循环:3.1申请一个term*型的指针d,将其next域赋为NULL;进行判断:1.3.1如果p和q均非空3.3.3.1如果p和q的指数相等将d的系数赋为p、q系数之和,指数不变,将p、q指向后移;3.3.3.2如果p->expn>q->expn复制q到结果多项式(减法系数为q->coef的相反数)3.3.3.3如果p->expn<q->expn复制p到结果多项式3.3.3.4 判断后将项数++,插入新节点d;1.3.2如果q为空,p仍存在,逐项将p复制到结果多项式。

每进行一次,项数++,p后移。

1.3.3如果p为空,q仍存在,逐项将q复制到结果多项式(减法将系数变为原来的相反数)。

每进行一次,项数++,q后移。

3.2返回结果多项式的项数·代码描述:1.工作指针p、q初始化:Node <element> *p_prior= GetFirst();Node <element> *p=p_prior->next;Node <element> *q=B.GetFirst()->next;2、while(p&&q){if(p->data.exp<q->data.exp){p_prior=p;p=p->next;}else if(p->data.exp>q->data.exp){p_prior->next=q;p_prior=q;q=q->next;p_prior->next=p;}else{p->data.coef+=q->data.coef;if(fabs(p->data.coef)<1e-7){p_prior->next=p->next;delete p;p=p_prior->next;}else{p_prior=p;p=p_prior->next;}Node <element> * temp=q;q=q->next;delete temp;}}if(q)p_prior->next=q;B.GetFirst()->next=NULL;}时间复杂度:O(n)空间复杂度:O(2)对于减法的实现在coef的前面乘以-1,在用加法的算法就行了。

while(q){int i=-1;q->data.coef=i*q->data.coef;q=q->next;}q=B.GetFirst()->next;4、计算在x处的值:·自然语言描述:1.将工作指针指向多项式的第一项;2.将结果sum置为0;3.指针不为空,即进行循环:3.1sum+=p->data.coef*pow(x,p->data.exp);3.2 p=p->next;4.返回sum;·伪代码描述:1.Node <element> *p= GetFirst()->next;2.double sum=0;3.while(p)sum+=p->data.coef*pow(x,p->data.exp);p=p->next;4.cout<<"在"<<x<<"的值是:"<<sum<<endl;时间复杂度:O(n)空间复杂度:S(1)5、求导数1.将指针指到多项式的第一项的结点:Node <element> *p_prior= GetFirst();2.循环n次2.1每项求导的系数为:p->data.coef*=p->data.exp;;指数为:p->data.exp-=1;2.2将新结点插入新链表;2.3指针p后移。

代码如下,注意常数项:Node <element> *p_prior= GetFirst();Node <element> *p=p_prior->next;int m=GetMax();if(p->data.exp==0) //常数求导{p_prior->next=p->next;Node <element> *temp=p;p=p->next;delete temp;}while (p){p->data.coef*=p->data.exp;p->data.exp-=1;if(p->next==NULL){m=p->data.exp;}p=p->next;}时间复杂度:O(n)空间复杂度:S(1)6、两多项式的乘积:1、建立三个动态结构数组存贮相乘两个多项式以及乘以后所得多项式的参数。

double * d1=new double[m+B.GetMax()+1];double * d2=new double[m+B.GetMax()+1];double * d3=new double[m+B.GetMax()+1];2、初始化后依次赋值d1[i]=0;d2[i]=0;for (int i=0;i<=m+B.GetMax();i++)if (i==p->data.exp) //有这一指数项则在i的位置存储此项系数d1[i]=p->data.coef;p=p->next;3、赋给第三个for (int i=0;i<=m+B.GetMax();i++)d3[i]=0;for (int j=0;j<=i;j++) //算法柯西乘法原理d3[i]+=d1[j]*d2[i-j];if (d3[i]!=0) //不为的就自增一项n++;4、导出element *e3=new element[n];for (int i=0,j=0;i<=m+B.GetMax();i++) //构造每一项{if (d3[i]!=0){e3[j].coef=d3[i];e3[j].exp=i;j++;}}时间复杂度:O(n)空间复杂度:S(2)2.3 其他1. 3. 测试主函数流程:测试条件:问题规模n的数量级为1A多项式每项的系数和指数分别为:<1,1> <2,2>B多项式每项的系数和指数分别为:<1,1> <2,2> <3,3>X的值为:2运行出来的结果是:测试结论:通过测试,本程序具有的功能有:多项式的建立、多项式的输入与输出、多项式的相加及相减,多项式求导,多项式求值以及多项式求积。

相关文档
最新文档