实验1 线性表应用-多项式计算

合集下载

1数据结构-实验报告一(线性表的基本操作)

1数据结构-实验报告一(线性表的基本操作)

实验一 线性表的基本操作及其应用一、实验目的1、帮助读者复习C++语言程序设计中的知识。

2、熟悉线性表的逻辑结构。

3、熟悉线性表的基本运算在两种存储结构上的实现。

4、掌握顺序表的存储结构形式及其描述和基本运算的实现。

5、熟练掌握动态链表结构及有关算法的设计二、实验内容求两个多项式的相加运算[问题描述]用单链表存储一元多项式,并实现两个多项式的相加运算。

[基本要求](1)本程序需要基于线性表的基本操作来实现一元多项式的加法,也可以用数组实现。

;(2)两个多项式都有键盘输入相应的系数和指数[测试数据] 由学生任意指定。

三、源代码#include <stdio.h>#include <malloc.h>#define MAX 20 //多项式最多项数typedef struct //定义存放多项式的数组类型{double coef; //系数int exp; //指数} PolyArray[MAX];typedef struct pnode //定义单链表结点类型{double coef; //系数int exp; //指数struct pnode *next;} PolyNode;void DispPoly(PolyNode *L) //输出多项式{bool first=true; //first为true表示是第一项PolyNode *p=L->next;while (p!=NULL){if (first)first=false;else if (p->coef>0)printf("+");if (p->exp==0)printf("%g",p->coef);else if (p->exp==1)printf("%gx",p->coef);elseprintf("%gx^%d",p->coef,p->exp);p=p->next;}printf("\n");}void DestroyList(PolyNode *&L) //销毁单链表{PolyNode *p=L,*q=p->next;while (q!=NULL){free(p);p=q;q=p->next;}free(p);}void CreateListR(PolyNode *&L,PolyArray a,int n) //尾插法建表{PolyNode *s,*r;int i;L=(PolyNode *)malloc(sizeof(PolyNode)); //创建头结点L->next=NULL;r=L; //r始终指向终端结点,开始时指向头结点for (i=0;i<n;i++){s=(PolyNode *)malloc(sizeof(PolyNode));//创建新结点s->coef=a[i].coef;s->exp=a[i].exp;r->next=s; //将*s插入*r之后r=s;}r->next=NULL; //终端结点next域置为NULL}void Sort(PolyNode *&head) //按exp域递减排序{PolyNode *p=head->next,*q,*r;if (p!=NULL) //若原单链表中有一个或以上的数据结点{r=p->next; //r保存*p结点后继结点的指针 p->next=NULL; //构造只含一个数据结点的有序表 p=r;while (p!=NULL){r=p->next; //r保存*p结点后继结点的指针 q=head;while (q->next!=NULL && q->next->exp>p->exp)q=q->next; //在有序表中找插入*p的前驱结点*qp->next=q->next; //将*p插入到*q之后q->next=p;p=r;}}}void Add(PolyNode *ha,PolyNode *hb,PolyNode *&hc) //求两有序集合的并{PolyNode *pa=ha->next,*pb=hb->next,*s,*tc;double c;hc=(PolyNode *)malloc(sizeof(PolyNode)); //创建头结点tc=hc;while (pa!=NULL && pb!=NULL){if (pa->exp>pb->exp){s=(PolyNode *)malloc(sizeof(PolyNode)); //复制结点s->exp=pa->exp;s->coef=pa->coef;tc->next=s;tc=s;pa=pa->next;}else if (pa->exp<pb->exp){s=(PolyNode *)malloc(sizeof(PolyNode)); //复制结点s->exp=pb->exp;s->coef=pb->coef;tc->next=s;tc=s;pb=pb->next;}else //pa->exp=pb->exp{c=pa->coef+pb->coef;if (c!=0) //系数之和不为0时创建新结点{s=(PolyNode *)malloc(sizeof(PolyNode)); //复制结点s->exp=pa->exp;s->coef=c;tc->next=s;tc=s;}pa=pa->next;pb=pb->next;}}if (pb!=NULL) pa=pb; //复制余下的结点while (pa!=NULL){s=(PolyNode *)malloc(sizeof(PolyNode)); //复制结点 s->exp=pa->exp;s->coef=pa->coef;tc->next=s;tc=s;pa=pa->next;}tc->next=NULL;}void main(){PolyNode *ha,*hb,*hc;PolyArray a={{2.3,0},{-2.8,2},{5.6,3},{-10.9,7},{7.6,10}};PolyArray b={{-1.2,0},{8.6,1},{-13.9,3},{15.5,5},{5.6,9}};CreateListR(ha,a,5);CreateListR(hb,b,5);printf("原多项式A: ");DispPoly(ha);printf("原多项式B: ");DispPoly(hb);Sort(ha);Sort(hb);printf("有序多项式A: ");DispPoly(ha);printf("有序多项式B: ");DispPoly(hb);Add(ha,hb,hc);printf("多项式相加: ");DispPoly(hc);DestroyList(ha);DestroyList(hb);DestroyList(hc);}四、测试结果五、心得体会两个简单的的多项式用相加,编程却需要线性表各种用法显得很复杂。

实验一:线性表应用

实验一:线性表应用

实验报告学院(系)名称:计算机与通信工程学院 姓名**学号 ********专业计算机科学与技术班级 2015级*班 实验项目实验一:线性表应用课程名称 数据结构与算法 课程代码 0661013 实验时间2017年3月9日第一节实验地点 7-219 考核标准 实验过程 25分程序运行 20分回答问题15分 实验报告30分 特色 功能5分考勤违纪情况 5分 成绩成绩栏其它批改意见: 教师签字:考核内容 评价在实验课堂中的表现,包括实验态度、编写程序过程等内容等。

□功能完善,□功能不全□有小错□无法运行○正确 ○基本正确○有提示○无法回答○完整 ○较完整○一般 ○内容极少 ○无报告○有 ○无 ○有 ○无一、实验目的? (1)将多项式各项的系数和指数分别存在A、B两个链表的中。

? (2)用指针Pa、Pb分别指向连个链表的首元素。

? (3)遍历两个链表,比较各元素的指数,若相同则相加减,将结果插入新表中,若不相等则将指数较小的插入新表中,继续向后遍历,直到其中一个链表到达表尾。

? (4)将另一表中的剩余元素按指数大小顺序全部插入到新表中。

? (5)新表中的元素按规定格式输出既为相加或相减后的多项式。

? 3、?? (1)通过构造函数创建单链表? (2)通过循环变量temp找到第一个链表的尾部设为p。

? (3)使p的next指向第二个链表的第一个元素? (4)将连接后的两链表输出? 4、? (1)用两个变量minZ,maxZ分别存储输入的最小值和最大值? (2)遍历整个单链表,将小于minZ和大于maxZ的节点删除? (3)输出操作后的单链表? 算法的实现和测试结果:包括算法运行时的输入、输出,实验中出现的问题及解决办法等? 出现问题? 无法返回操作后的单链表? 解决办法? 经老师直到后,在相关函数前面加*成功返回操作后的单链表? 1、3、4、? 算法时间复杂度分析? 1、O(1表长度+2表长度)---------------可视为O(n)? 3、O(1表长度+2表长度)---------------可视为O(n)? 4、O(n)?四、收获与体会线性表分为顺序表和链表,其中顺序表已相当熟悉,主要练了新接触的链表,感觉现在才真正体会到指针的魅力之处。

数据结构线性表多项式加减实验报告

数据结构线性表多项式加减实验报告

数据结构实验报告实验名称:实验一——线性表日期:2013年10月28日1.实验要求实验目的1、熟悉C++语言的基本编程方法,掌握集成编译环境的调试方法2、学习指针、模板类、异常处理的使用3、掌握线性表的操作的实现方法4、学习使用线性表解决实际问题的能力实验内容利用线性表实现一个一元多项式Polynomialf(x) = a0 + a1x + a2x2 + a3x3+ … + a n x nPolynomial的结点结构如下:struct term{float coef; //系数int expn; //指数};要求:1、能够实现一元多项式的输入和输出2、能够进行一元多项式相加3、能够进行一元多项式相减4、能够计算一元多项式在x处的值5、能够计算一元多项式的导数(选作)6、能够进行一元多项式相乘(选作)7、编写测试main()函数测试线性表的正确性2. 程序分析考虑到数据结构的实现,因为多项式是线性结构因此选择线性表,而本次实验中涉及到多项式的加减,要进行节点的添加或者删除,用顺序表显然不能满足要求,而且由于不知道多项式的项数,很容易造成空间的浪费,当两个多项式指数相差很远时,操作要移动很多项,步骤很麻烦繁琐。

综上,我选择了单链表,每个节点有三个部分,分别储存系数、指数、和指针,这样在计算加减或者指数不等时,只需要简单的摘连加链即可,而且不会造成空间的太多浪费。

每次利用尾插法将结点插入基准多项式。

2.1 存储结构本次实验采取的多项式加减算法是将一个多项式作为基准,把另一个多项式加到基准多项式中去,求和后的多项式仍然存储在第一个线性表中,因此用单链表的数据结构更为方便。

单链表存储结构在本次实验中,因为形式的特殊性,每个节点如下图表示:空链表 非空链表其中每个结点前两个分别储存float 型系数coef 和int 型指数expn ,第三个作为指针指向下一个节点(不是最后一个结点时,否则为NUll )2.2 关键算法分析1、输入多项式自然语言描述:1) 指定多项式的项数n2) 建立一个叫term 的struct 结构类型,用来储存指定多项式的系数和指数的数据。

南邮数据结构上机实验一线性表的基本运算和多项式的基本运算资料

南邮数据结构上机实验一线性表的基本运算和多项式的基本运算资料

实验报告(2015 / 2016学年第二学期)课程名称数据结构A实验名称线性表的基本运算和多项式的基本运算实验时间2016 年 3 月10 日指导单位计算机科学与技术系指导教师骆健学生姓名班级学号学院(系) 管理学院专业信息管理与信息系统实习题名:线性表的基本运算班级姓名学号日期2016.03.10一、问题描述深入理解线性表数据结构,熟练掌握顺序表的各种基本操作。

在顺序表类SeqList 中增加成员函数void Reverse(),实现顺序表的逆置;在顺序表类SeqList中增加成员函数bool DeleteX(const T &x),删除表中所有元素值等于x元素。

若表中存在这样的元素,则删除之,且函数返回true,否则函数返回false。

二、概要设计文件Inverse.cpp中定义了Linearlist类, SeqList类继承Linearlist类。

在顺序表类SeqList中通过函数void Reverse()实现顺序表的逆置,通过函数boolDeleteX(const T &x),删除表中所有元素值等于x元素。

三、详细设计1.类和类的层次设计程序使用了两个类, 线性表Linearlist类和顺序表SeqList类和一个主函数mian。

Linearlist类里包括常见的线性表运算,在类SeqList里面新增成员函数void Reverse()和bool DeleteX(const T &x)。

TLinearlist#int n+virtual bool IsEmpty() const = 0;+virtual int Length() const = 0;+virtual bool Find(int i,T& x) const = 0;+virtual int Search(T x) const = 0;+virtual bool Insert(int i,T x) = 0;+virtual bool Delete(int i) = 0;+virtual bool Update(int i,T x) = 0;+virtual void Output(ostream& out) const = 0;TSeqList-int maxLength;-T *elements;+IsEmpty() const;+Length() const;+Find(int i,T& x) const;+Search(T x) const;+Insert(int i,T x);+Delete(int i);+Update(int i,T x);+Output(ostream& out) const;+Reverse();+DeleteX(const T& x);2.核心算法顺序表SeqList类中,私有段封装了两个私有数据成员maxLength和elements,公有段封装了构造、析构、查找、删除、逆置等函数。

实验一 线性表应用---多项式计算

实验一  线性表应用---多项式计算

浙江大学城市学院实验报告课程名称数据结构与算法实验项目名称实验一线性表应用---多项式计算实验成绩指导老师(签名)日期一.实验目的和要求1.进一步掌握线性表的的基本操作。

2.掌握线性表的典型应用----多项式表示与计算。

二. 实验内容1.设用线性表( (a1, e1), (a2, e2), ……, (am, em) ) 表示多项式P(x) = a1*x e1 + a2*x e2+…+ am*x em,其中:a1~am为非零系数,0≤e1<e2<…..<em,请编写用链式存储结构(带表头附加结点的单链表)存储该多项式时,多项式基本操作的实现函数。

多项式基本操作应包括初始化多项式、清除多项式、输出多项式、插入一项、删除一项、多项式求值、多项式相加等。

要求:把多项式线性表的结构定义及多项式基本操作实现函数存放在头文件Linkpoly.h中,主函数存放在主文件test6_1.cpp中,在主函数中通过调用Linkpoly.h中的函数进行测试。

2.选做:编写用顺序存储结构存储多项式时,多项式基本操作的实现函数。

要求:把多项式线性表的结构定义及多项式基本操作实现函数存放在文件Seqpoly.h中,在主文件test6_1.cpp中增加测试语句对Seqpoly.h中的函数进行测试。

3.填写实验报告,实验报告文件取名为report1.doc。

4.上传实验报告文件report1.doc与源程序文件test6_1.cpp及Linkpoly.h、Seqpoly.h(若有)到Ftp服务器上自己的文件夹下。

三. 函数的功能说明及算法思路typedef struct{double coef;int exp;}ElemType;typedef struct Node{ElemType data;struct Node *next;}LNode;//初始化多项式void InitPoly(LNode *&H)//清除多项式void ClearPoly(LNode *&H)//输出多项式void TraversePoly(LNode *H)//插入一项多项式bool InsertPoly(LNode *H,int pos,double a,int e) {if(pos==0) //按指数有序插入{……}else //按pos值插入{……}}//删除一项多项式bool DeletePoly(LNode* H,int pos,double &a, int &e) {if(pos==0) //按系数或指数删除{……}else //按pos值删除{……}}//多项式求值double PolySum(LNode *H,double x)//多项式相加LNode *PolyAdd(LNode *a,LNode *b){while(pa!=a&&pb!=b)//当两个表同时不为空时{if(pa->data.exp==pb->data.exp){if((v=pa->data.coef+pb->data.coef)!=0){……}}else if(pa->data.exp<pb->data.exp)//将pa所指结点插入c链表{}else//将pb所指结点插入c链表{}}while(pa!=a)//将a链表中剩余结点复制到c链表{}while(pb!=b) //将b链表中剩余结点复制到c链表{}}四. 实验结果与分析五. 心得体会【附录----源程序】test6_1.cpp#include<stdio.h>#include<iostream.h> #include<stdlib.h> typedef struct{double coef;int exp;}ElemType;typedef struct Node{ ElemType data;struct Node *next; }LNode;#include"LinkPoly.h"void main(){LNode *a,*b,*c;//初始化InitPoly(a);InitPoly(b);ElemType ra[4]={{5,0},{3,2},{-6,3},{2,5}};ElemType rb[6]={{3,0},{4,1},{-2,2},{3,3},{-2,5},{9,6}};int i;for(i=3;i>=0;i--)InsertPoly(a,1,ra[i].coef,ra[i].exp);for(i=5;i>=0;i--)InsertPoly(b,1,rb[i].coef,rb[i].exp);//遍历cout<<"Poly_A(x)=";TraversePoly(a);cout<<endl;cout<<"Poly_B(x)=";TraversePoly(b);cout<<endl;//求和cout<<"多项式Poly_A与多项式Poly_B相加得:"<<endl;c=PolyAdd(a,b);cout<<"Poly_C(x)=";TraversePoly(c);cout<<endl;int pos;char u,v,w;ElemType T;//插入cout<<"按指数有序插入一项多项式:"<<endl;cout<<"请输入待插入项:";cin>>u>>T.coef>>v>>T.exp>>w;if(InsertPoly(c,0,T.coef,T.exp)){cout<<endl<<"插入后,多项式Poly_C为:"<<endl;cout<<"Poly_C(x)=";TraversePoly(c);}cout<<endl;cout<<"按pos值插入一项多项式:"<<endl;cout<<"请输入pos值:";cin>>pos;cout<<"请输入待插入项:";cin>>u>>T.coef>>v>>T.exp>>w;if(InsertPoly(c,pos,T.coef,T.exp)){cout<<endl<<"插入后,多项式Poly_C为:"<<endl;cout<<"Poly_C(x)=";TraversePoly(c);}cout<<endl;//删除cout<<"请输入待删除项的pos值:";cin>>pos;if(DeletePoly(c,pos,T.coef,T.exp)){cout<<"删除项为"<<"{"<<T.coef<<","<<T.exp<<"}"<<endl<<endl;cout<<"删除后,多项式Poly_C为:"<<endl;cout<<"Poly_C(x)=";TraversePoly(c);}cout<<endl;cout<<"请输入待删除项的系数:";cin>>T.coef;if(DeletePoly(c,0,T.coef,T.exp)){cout<<"删除项为"<<"{"<<T.coef<<","<<T.exp<<"}"<<endl<<endl;cout<<"删除后,多项式Poly_C为:"<<endl;cout<<"Poly_C(x)=";TraversePoly(c);}cout<<endl;cout<<"请输入待删除项的指数:";cin>>T.exp;if(DeletePoly(c,0,T.coef,T.exp)){cout<<"删除项为"<<"{"<<T.coef<<","<<T.exp<<"}"<<endl<<endl;cout<<"删除后,多项式Poly_C为:"<<endl;cout<<"Poly_C(x)=";TraversePoly(c);}cout<<endl;//求值double x;cout<<"请输入待求值的x:";cin>>x;cout<<"Poly_C(x)="<<PolySum(c,x)<<endl<<endl;//清除ClearPoly(a);ClearPoly(b);ClearPoly(c);}Linkpoly.h//初始化多项式void InitPoly(LNode *&H){if((H=new LNode)==NULL)exit(0);H->next=H;}//清除多项式void ClearPoly(LNode *&H){LNode *cp=H->next;LNode *np;while(cp!=H){np=cp->next;delete cp;cp=np;}H->next=H;}//输出多项式void TraversePoly(LNode *H){LNode *p=H->next;if(p!=H){cout<<p->data.coef<<'x'<<'^'<<p->data.exp;p=p->next;while(p!=H){if(p->data.coef>0)cout<<'+';cout<<p->data.coef<<'x'<<'^'<<p->data.exp;p=p->next;}}cout<<endl;}//插入一项多项式bool InsertPoly(LNode *H,int pos,double a,int e){LNode *newptr;if((newptr=new LNode)==NULL)return false;newptr->data.coef=a;newptr->data.exp=e;LNode *cp=H->next;LNode *ap=H;if(pos==0){while(cp!=H){if(e>ap->data.exp&&e<cp->data.exp)break;else if(e==cp->data.exp){cp->data.coef+=a;return true;}else{ap=cp;cp=cp->next;}}newptr->next=cp;ap->next=newptr;}else{int i=0;while(cp!=H){i++;if(i==pos)break;else{ap=cp;cp=cp->next;}}if(cp==H&&i+1<pos){cout<<"pos值无效!"<<endl;return false;}newptr->next=cp;ap->next=newptr;}return true;}//删除一项多项式bool DeletePoly(LNode* H,int pos,double &a, int &e) {if(H->next==H)return false;LNode *cp=H->next;LNode *ap=H;if(pos==0){while(cp!=H){if(a==cp->data.coef||e==cp->data.exp)break;else{ap=cp;cp=cp->next;}}if(cp==H){cout<<"不存在符合条件的项!"<<endl;return false;}}else{int i=0;while(cp!=H){i++;if(i==pos)break;else{ap=cp;cp=cp->next;}}if(cp==H){cout<<"pos值无效!"<<endl;return false;}}a=cp->data.coef;e=cp->data.exp;ap->next=cp->next;delete cp;return true;}//多项式求值double PolySum(LNode *H,double x){int i=0;double sum=0,w=1;LNode *p=H->next;while(p!=H){while(i<p->data.exp){w*=x;i++;}sum+=p->data.coef*w;p=p->next;}return sum;}//多项式相加LNode *PolyAdd(LNode *a,LNode *b){double v;LNode *c;InitPoly(c);LNode *pc=c,*pa=a->next,*pb=b->next;while(pa!=a&&pb!=b){if(pa->data.exp==pb->data.exp){if((v=pa->data.coef+pb->data.coef)!=0){InsertPoly(pc,1,v,pa->data.exp);pc=pc->next;}pa=pa->next;pb=pb->next;}else if(pa->data.exp<pb->data.exp){InsertPoly(pc,1,pa->data.coef,pa->data.exp);pc=pc->next;pa=pa->next;}else{InsertPoly(pc,1,pb->data.coef,pb->data.exp);pc=pc->next;pb=pb->next;}}while(pa!=a){InsertPoly(pc,1,pa->data.coef,pa->data.exp);pc=pc->next;pa=pa->next;}while(pb!=b){InsertPoly(pc,1,pb->data.coef,pb->data.exp);pc=pc->next;pb=pb->next;}return c;}。

数据结构《线性表的应用》实验报告

数据结构《线性表的应用》实验报告

实验报告——线性表应用一、实验目的用单链表储存一元多项式,并实现两个多项式的相加运算。

二、实验内容1.先创建链表,存储多项式;2.输出多项式;3.两个多项式相加;4.输出多项式。

三、程序代码#include <stdio.h>#include <stdlib.h>#include <math.h>//一元多项式链式储存的节点结构typedef struct Polynode{float coef;int exp;struct Polynode * next;} Polynode , * Polylist;//建立一元多项式的链表Polylist polycreate(){Polynode * head,* rear,* s;float c;int e;head=(Polynode* )malloc(sizeof(Polynode));rear=head;scanf("%f,%d",&c,&e);while(c!=0){s=(Polynode * )malloc(sizeof(Polynode));s->coef=c;s->exp=e;rear->next=s;rear=s;scanf("%f,%d",&c,&e);}rear->next=NULL;return(head);}//输出多项式void print(Polynode*L){Polynode*p;p=L->next;printf("a=");if(p&&p->coef!=0)printf("%.2f*x^%d",p->coef,p->exp);while(p->next!=NULL){if((p->next->coef)>0&&p)printf("+");elseprintf("-");p=p->next;printf("%.2f*x^%d",fabs(p->coef),p->exp);}}//多项式相加void polyadd(Polylist polya,Polylist polyb){Polynode*p,*q,*tail,*temp;int sum;p=polya->next;q=polyb->next;tail=polya;while (p!=NULL&&q!=NULL){if(p->exp<q->exp){tail ->next=p; tail=p;p=p->next;}else if (p->exp==q->exp);{sum=p->coef+q->coef;if(sum!=0){p->coef=sum;tail->next=p;tail=p;p=p->next;temp=q;q=q->next;free(temp);}else{temp=p;p=p->next;free(temp);temp=q;q=q->next;free(temp);}}{tail ->next=q;tail=q;q=q->next;}}if(p!=NULL)tail->next=p;elsetail->next=q;}void main(){Polynode*a,*b;printf("输入a的系数和指数:\n");a = polycreate();print(a);printf("\n");printf("输入b的系数和指数:\n");b = polycreate();print(b);printf("\n");polyadd(a,b);printf("两个多项式的和为:\n");print(a);}四、实验结果五、实验过程中遇到的问题及处理方法程序运行时,在中文状态下输入“,”回车后就不能再输入了,应在英文状态下输入“,”。

线性表及多项式操作

线性表及多项式操作
5.多项式操作
多项式的类型定义(struct.h):
typedef struct PNode
{
int coef;
int exp;
struct PNode* link;
} PNode;
typedef struct
{
struct PNode *head;
}polynominal;
多项式的创建(Create.c):
{
if(p->element>q->element)
{
temp=q->element;
q->element=p->element;
p->element=temp;
}
}
}
return l;
}
int main()
{
LinkList L,S,K;
L=Creat();
printf("初始化的单链表为:\n");
{
int j;
Node *p,*q;
if (!L->n)
return ERROR;
if (i<0 || i>L->n-1)
return ERROR;
q=L->head;
for (j=0; j<i; j++) q=q->link;
p=q->link; //p指向ai
q->link=p->link; //从单链表中删除p所指向的结点
L->element[i+1]=x;
L->n++;
return OK;
}
顺序表的删除:
Status Delete(SeqList *L,int i)

数据结构实验报告(一)线性表的应用

数据结构实验报告(一)线性表的应用

数据结构实验报告(⼀)线性表的应⽤实验说明数据结构实验⼀ 线性表的实验——线性表的应⽤⼀、实验⽬的通过本实验使学⽣了解线性表的⼀种简单应⽤,熟悉线性表顺序存储与链式存储的特性,特别训练学⽣编程灵活控制链表的能⼒,为今后编程控制更为复杂的数据结构奠定基础。

⼆、实验内容1.⽤顺序表和链表分别分别编程实现教材中例⼦2-1与2-2。

要求:(1)只能⽤C语⾔编程实现;(2)完全保持书中算法2.1与算法2.2形式,不允许有任何变化,除⾮语法上不允许;所调⽤各函数参照书中19页的功能描述,其中函数名、参数个数及性质、函数功能必须与书中完全⼀致,不能有变化。

2.利⽤线性表表⽰⼀元多项式完成多项式的加、减、乘、求导、求值运算。

要求:(1)输⼊的⼀元多项式可以采⽤只输⼊各项的系数与指数这种简化的⽅式。

如对于多项式2x2+6x5,输⼊可为: 2,2 6,5 这样的简单形式。

(2)遇到有消项时应当处理,如2x2+6x5与3x2-6x5进⾏相加时,结果为5*x^2。

(3)当给定x的值时,能计算表达式相加或相减的结果。

(4)操作的结果放⼊⼀个新线性表中,原来的两个表达式存储表⽰不变,也可以不是产⽣新的线性表,⽽是将两上线性表合并为⼀个。

(5)要求程序功能模块划分合理(每个函数功能单⼀、可重⽤性好),使⽤空间尽可能少,算法尽可能⾼效。

实验报告1.实现功能描述使⽤线性表表⽰⼀元多项式完成多项式的加、减,乘,求导、求值运算。

2.⽅案⽐较与选择(1)因为使⽤的是线性表,所以主要⽅案有数组法和链表法。

(2)从时间复杂度来说,使⽤数组法更优;从空间复杂度来说,链表法更优。

因为数组法是指定好空间的,若式⼦⼤⼩超出设置⼤⼩,那程序必然出错;若式⼦⼤⼩⼩于设置⼤⼩,那就意味着有多余的空间被浪费了。

综合来讲,若计算式⼦较为庞⼤,使⽤链表法更佳;相反,若计算式⼦较⼩,数组法更佳。

3.设计算法描述(1)单个项式的数据存储使⽤了结构体,数组法是在⼀个结构体中定义两个⼀维数组;链表法是通过⼀个结构体作为⼀个节点,通过next指针连接起来。

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

浙江大学城市学院实验报告课程名称数据结构与算法实验项目名称实验一线性表应用---多项式计算学生姓名蓝礼巍专业班级学号实验成绩指导老师(签名)日期一.实验目的和要求1.进一步掌握线性表的的基本操作。

2.掌握线性表的典型应用----多项式表示与计算。

二. 实验内容1.设用线性表( (a1, e1), (a2, e2), ……, (am, em) ) 表示多项式P(x) = a1*x e1 + a2*x e2+…+ am*x em,其中:a1~am为非零系数,0≤e1<e2<…..<em,请编写用链式存储结构(带表头附加结点的单链表)存储该多项式时,多项式基本操作的实现函数。

多项式基本操作应包括初始化多项式、清除多项式、输出多项式、插入一项、删除一项、多项式求值、多项式相加等。

要求:把多项式线性表的结构定义及多项式基本操作实现函数存放在头文件Linkpoly.h中,主函数存放在主文件test6_1.cpp中,在主函数中通过调用Linkpoly.h中的函数进行测试。

2.选做:编写用顺序存储结构存储多项式时,多项式基本操作的实现函数。

要求:把多项式线性表的结构定义及多项式基本操作实现函数存放在文件Seqpoly.h中,在主文件test6_1.cpp中增加测试语句对Seqpoly.h中的函数进行测试。

3.填写实验报告,实验报告文件取名为report1.doc。

4.上传实验报告文件report1.doc与源程序文件test6_1.cpp及Linkpoly.h、Seqpoly.h(若有)到Ftp服务器上自己的文件夹下。

三. 函数的功能说明及算法思路包括每个函数的功能说明,及一些重要函数的算法实现思路void InitPoly(LNode *&HL)初始化void TraversePoly(LNode *HL)输出多项式void ClearPoly(LNode *HL) 删除多项式void InsertPoly(LNode *HL,double a,double e)插入一项bool DeletePoly(LNode *&HL,double &a,double &e,int pos)删除一项double PoluSum(LNode *HL,double x)求值LNode *PolyAdd2(LNode *p1,LNode *p2)加和四. 实验结果与分析包括运行结果截图等五. 心得体会记录实验感受、上机过程中遇到的困难及解决办法、遗留的问题、意见和建议等。

写的时候不仔细,改错就要很久了【附录----源程序】Cpp#include<stdio.h>#include<stdlib.h>#include<iostream.h>#include<math.h>#include"Linkpoly.h"void main(){LNode *head;InitPoly(head);double a,e;while(1){cout<<"若插入一项,请选1."<<endl;cout<<"若删除一项,请选2."<<endl;cout<<"若输出多项式,请选3."<<endl;cout<<"若清除多项式,请选4."<<endl;cout<<"若多项式求值,请选5."<<endl;cout<<"若多项式相加,请选6."<<endl;cout<<"退出,请选0."<<endl;cout<<"请输入0-6"<<endl;int i;cin>>i;if(i==1){cout<<"输入要插入的值"<<endl;cout<<"系数a=:";cin>>a;cout<<"指数e=:";cin>>e;InsertPoly(head,a,e);}else if(i==2){int pos;cout<<"请输入要删除的位置"<<endl;cin>>pos;DeletePoly(head,a,e,pos);cout<<"已删除的值是:"<<a<<","<<e<<endl;}else if(i==3)TraversePoly(head);else if(i==4)ClearPoly(head);else if(i==5){double x;cout<<"请输入X:";cin>>x;if(head->next!=NULL)cout<<"多项式之和是"<<PoluSum(head,x)<<endl;elsecout<<"无多项式"<<endl;}else if(i==6){LNode *b,*c;InitPoly(b);InitPoly(c);int h1,h2,j,z;double k;double ra[50][2],rb[50][2];cout<<"请输入b的项数,h1=: "<<endl;cin>>h1;for(z=0;z<h1;z++)for(j=0;j<=1;j++){cout<<"输入a或e";cin>>k;ra[z][j]=k;}cout<<"请输入c的项数,h2=: "<<endl;cin>>h2;for(z=0;z<h2;z++)for(j=0;j<=1;j++){cout<<"输入a或e";cin>>k;rb[z][j]=k;}int h3;for(h3=0;h3<h1;h3++)InsertPoly(b,ra[h3][0],ra[h3][1]);for(h3=0;h3<h2;h3++)InsertPoly(c,rb[h3][0],rb[h3][1]);cout<<"线性表b:";TraversePoly(b);cout<<"线性表c:";TraversePoly(c);LNode *d=PolyAdd2(b,c);cout<<"线性表d:";TraversePoly(d);ClearPoly(b);ClearPoly(c);ClearPoly(d);}else if(i==0)exit(1);elsecout<<"输入有误,请输入0-6"<<endl;}}H:struct term{double a;double e;};typedef term ElemType;struct LNode{ElemType data;LNode *next;};void InitPoly(LNode *&HL){LNode *newpter;newpter=new LNode;newpter->next=NULL;HL=newpter;}void TraversePoly(LNode *HL){if(HL->next==NULL)cout<<"无多项式!"<<endl;else{HL=HL->next;while(HL->next!=NULL){cout<<HL->data.a;cout<<"X^";cout<<HL->data.e;cout<<"+";HL=HL->next;}cout<<HL->data.a<<"X^"<<HL->data.e<<endl;}}void ClearPoly(LNode *HL){LNode *cp;LNode *np;cp=HL->next;while(cp!=NULL){np=cp->next;delete cp;cp=np;}HL->next=NULL;cout<<"清除成功!"<<endl;}void InsertPoly(LNode *HL,double a,double e){LNode *ap;LNode *cp;cp=HL;ap=NULL;LNode *newpter;newpter=new LNode;newpter->data.a=a;newpter->data.e=e;while(cp!=NULL){if(e<cp->data.e)break;else{ap=cp;cp=cp->next;}}newpter->next=cp;ap->next=newpter;}bool DeletePoly(LNode *&HL,double &a,double &e,int pos) {if(HL->next==NULL){cout<<"无多项式!"<<endl;return false;}if(pos<-1){cerr<<"pos 值有错退出运行"<<endl;return false;}LNode *cp=HL->next;LNode *ap=HL;if(pos==-1)while(cp->next!=NULL){ap=cp;cp=cp->next;}else{int i=0;while(cp!=NULL){i++;if(i==pos){break;}else{ap=cp;cp=cp->next;}}if(cp==NULL){cout<<"pos值无效!"<<endl;return false;}}a=cp->data.a;e=cp->data.e;ap->next=cp->next;delete cp;return true;}double PoluSum(LNode *HL,double x){double sum;sum=0;while(HL->next!=NULL){sum=sum+HL->data.a*pow(x,HL->data.e);HL=HL->next;}sum=sum+HL->data.a*pow(x,HL->data.e);return sum;}LNode *PolyAdd2(LNode *p1,LNode *p2){LNode *p3;p3=new LNode;LNode *t1,*t2,*t3;t1=p1;t2=p2;t3=p3;while(t1&&t2){if(t1->data.e<t2->data.e){t3=t3->next=new LNode;t3->data=t1->data;t1=t1->next;}else if(t1->data.e> t2->data.e){t3=t3->next=new LNode;t3->data=t2->data;t2=t2->next;}else{double a1=t1->data.a+t2->data.a;if(a1!=0){t3=t3->next=new LNode;t3->data.a=a1;t3->data.e=t1->data.e;}t1=t1->next;t2=t2->next;}}while(t1){t3=t3->next=new LNode;t3->data=t1->data;t1=t1->next;}while(t2){t3=t3->next=new LNode;t3->data=t2->data;t2=t2->next;}t3->next=NULL;t3=p3;p3=t3->next;delete t3;return p3;}。

相关文档
最新文档