数据结构实验报告,一元多项式资料
北邮数据结构实验一元多项式实验报告

数据结构实验报告实验名称:实验一—线性表实现一个多项式学生姓名:黄锦雨班级:2011211109班内序号:20学号:2011210263日期:2012年10月31日实验目的:1.熟悉C++语言的基本编程方法,掌握集成编译环境的调试方法2.学习指针、模板类、异常处理的使用3.掌握线性表的操作的实现方法4.学习使用线性表解决实际问题的能力实验内容:利用线性表实现一个一元多项式Polynomialf(x) = a0 + a1x + a2x2 + a3x3+ … + a n x n要求:1.能够实现一元多项式的输入和输出2.能够进行一元多项式相加3.能够进行一元多项式相减4.能够计算一元多项式在x处的值5.能够计算一元多项式的导数(选作)6.能够进行一元多项式相乘(选作)7.编写测试main()函数测试线性表的正确性2. 程序分析由于多项式是线性结构,故选择线性表来实现,在这个程序中我采用的是单链表结构,每个结点代表一个项,多项式的每一项可以用其系数和指数唯一的表示。
如果采用顺序存储,那么对于结点的插入和删除的操作会比较麻烦,而且顺序表的结点个数固定,对于可能发生的情况无法很好的处理,而采用链表就会简单许多,还能自由控制链表的长度。
两个多项式要进行多次的计算,为了保护原始的数据,方便进行以后的计算,故选择把结果存储在一个新建的链表里。
2.1本程序完成的主要功能:1.输入和输出:需要输入的信息有多项式的项数,用来向系统动态申请内存;多项式各项的系数和指数,用来构造每个结点,形成链表。
输出即是将多项式的内容向屏幕输出。
2.多项式相加与相减:多项式的加减要指数相同即是同类项才能实现,所以在运算时要注意判断指数出现的各种不同的情况,分别写出计算方法。
将每项运算得到的结果都插入到新的链表中,形成结果多项式。
3.多项式的求导运算:多项式的求导根据数学知识,就是将每项的系数乘以指数,将指数减1即可,将每项得到的结果插入到结果多项式的链表中。
数据结构实验报告-一元多项式

数据结构实验报告-一元多项式
实验目的
1.使用C语言编写一元多项式运算的程序
2.理解和掌握链表的基本概念和操作
3.熟悉链表在实际问题中的应用
实验内容
1.设计一元多项式数据结构,支持多项式的输入、输出、加、减、乘、求导等计算。
2.使用链表来实现多项式数据结构。
3.编写测试程序,测试多项式数据结构的正确性和效率。
实验步骤
1.设计一元多项式数据结构,包括多项式中的每一项所包含的系数和指数,以及链表节点结构体定义。
typedef struct node
{
float coef; // 系数
int expn; // 指数
struct node *next; // 指向下一个节点的指针
} Node, *pNode;
2.按照上述定义的结构体,实现多项式的输入函数。
3.利用链表实现多项式的加法函数。
6.编写测试程序,测试多项式数据结构的正确性和效率。
实验结果
1.输入第一个多项式为 3x^3+2x^2+3 第二个多项式为 2x^3+x^2+4x+1
2.经过程序的处理,两个多项式的加法结果为 5.00x^3+
3.00x^2+
4.00x+4.00
两个多项式的乘法结果为
6.00x^6+10.00x^5+5.00x^4+10.00x^3+14.00x^2+19.00x+3.00
第一个多项式求导结果为 9.00x^2+4.00x
1.链表可以有效地实现多项式数据结构的存储和操作,具有较好的效率和灵活性。
2.通过本次实验,能够更加深入地理解数据结构中链表的应用,有助于提高编程能力和实际问题解决能力。
数据结构实验报告实验一题目3一元多项式

数据结构实验报告实验名称:实验一题目3 一元多项式学生姓名:许虎班级:信通20班内序号:10学号:78日期:2012年11月2日1.实验要求实验目的:利用线性表实现一个一元多项式Polynomialf(x) = a0 + a1x + a2x2 + a3x3+ … + a n x n并实现相应功能。
实验内容:使用一元多项式类存储多项式元素,通过定义并实现相关函数完成相应的功能,并通过设计的main函数测试了其正确性。
用户可自行输入正确的多项式进行相关运算,得到相应结果。
相关函数实现的功能:1.能够实现一元多项式的输入和输出2.能够进行一元多项式相加3.能够进行一元多项式相减4.能够计算一元多项式在x处的值5.能够计算一元多项式的导数6.能够进行两个一元多项式相乘2. 程序分析2.1 存储结构存储结构:单链表(带头节点)单链表示意图如下:在本程序中使用结构类型element(赋给模版类型T)数组data储存数据成员,包含coef(系数)和exp(指数)两个成员,但仍为一维数组。
在节点构造类型Node(运用了模版类)中定义了指针域next指向下一个结点,直到链表尾将next置空,front头指针为该链表类私有数据成员,如此得到多项式链表(单链表)。
2.2 关键算法分析1、关键算法:1)一元多项式类求和函数(1)初始化工作指针p_prior(指向A链表头结点),p(p->next),q(指向B链表第一个结点)。
(2)若p和q都不为空,则循环下列操作:(3)若p->data.exp<q->data.exp,则p_prior=p;p=p->next。
(4)否则,若p->data.exp>q->data.exp,则:将q结点加入到A链表p结点之前,q指向B链表下移个结点。
(5)否则,p->data.coef=p->data.coef+q->data.coef;(6)若p->data.coef==0,删除p结点,p指向下一个结点,删除q结点,q指向下一个结点。
数据结构一元多项式报告

一元多项式计算:程序要求: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;}}}。
数据结构实验报告-一元多项式

数据结构课程设计报告课题: 一元多项式姓名:XX学号:************专业班级: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):存储结构一元多项式的表示在计算机内可以用链表来表示,为了节省存储空间,只存储多项式中系数非零的项。
链表中的每一个结点存放多项式的一个系数非零项,它包含三个域,分别存放该项的系数、指数以及指向下一个多项式项结点的指针。
创建一元多项式链表,对一元多项式的运算中会出现的各种可能情况进行分析,实现一元多项式的相加、相减操作。
数据结构课程设计报告一元多项式加减乘除精

数据结构课程设计报告一元多项式加减乘除精多项式想加减与乘与升降序学院计算机科学与技术专业信息安全学号 12070学生姓名陶宝中辅导教师姓名12月 22 日一、设计目的与内容了解数据结构的与算法的设计方法,独立分析和设计一元多项式加减与乘除的程序编码,经过程序编写掌握软件开发过程的问题分析,系统设计,程序编码,测试等基本方法和技能,提高综合运用所学理论知识和方法独立分析和解决问题的能力,经过这次实践将实验问题中的所涉及的对象在计算机中表示出来并对她们进行处理,掌握线除。
任务与分析本课题主要的目的是分别采用顺序和动态存储结构实现一元多项式的加法、减法和乘法。
并将操作结果分别按升序和降序输出程序的主要功能一元多项式创立建立一元多项式的顺序表和链式表,按程序提示输入每个项数据结束创立。
借助元素在存储器中的相对位置来表示数据元素之间的关系,顺序表中第i个位置表示一元多项式的第i项的系数为第i个位置存放的内容,指数为i-1。
创立一个一元多项式顺序表,对一元多项式的运算中会出现的各种情况进行分析,实现一元多项式的相加、相减、相乘操作。
用链表来表示只存储多项式中系数非零的项。
链表中的每一个结点存放多项式的一个term项结构和指向下一个节点的指针域,term又包括系数和指数两个域分别存放该项的系数、。
创立一元多项式链表,对一元多项式的运算中会出现的各种可能情况进行分析,实现一元多项式的相加、相减、相乘操作。
一元多项式的加法对于两个一元多项式中所有指数相同的项,对应系数相加,若其和不为零,则构成“和多项式”中的一项;对于两个一元多项式中所有指数不相同的项,则分别复抄到和多项式中去。
一元多项式的减法对于两个一元多项式中所有指数相同的项,对应系数相减,若其差不为零,则构成“和多项式”中的一项;对于两个一元多项式中所有指数不相同的项,将其按减法规则复抄到差多项式中去。
一元多项式的乘法将乘法运算分解为一系列的加法运算利用两个一元多项式相加的算法实现。
数据结构《一元多项式》

一元多项式相加问题实验报告本实验的目的是进一步熟练掌握应用链表处理实际问题的能力。
一、问题描述通过键盘输入两个形如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 进入下一次循环。
数据结构实验报告-一元多项式的加法运算

问题描述:设Pn (x)和Qm(x)分别两个一元多项式。
试编写程序实现一元多项式的加法运算。
一、需求分析:1、本程序需要基于线性表的基本操作来实现一元多项式的加法,也可以用数组实现。
2、两个多项式都有键盘输入相应的系数和指数。
3、//第一个多项式为9x15+ 7x8+5x3+3x输入4 //表示第一个多项式的项数9, 15(回车) //表示9x157, 8 (回车)5, 3 (回车)3, 1 (回车)输出9x^15+ 7x^8+5x^3+3x^1//第二个多项式为 -7x8+6x3+2输入3 //表示第二个多项式的项数6, 3(回车) //表示9x15-7, 8(回车)2, 0 (回车)输出-7x^8+ 6x^3+2x^0求和结果9x^15+11x^3+3x^1+ 2x^0二、概要设计:抽象数据类型为实现上述程序的功能,应以整数存储用户的输入,以及计算的结果。
实现多项式的运算,利用数组的方式需开辟一个二维数组,利用链表的方式须创造两个链表。
算法的基本思想数组实现:定义一个结构体数组,p存储系数,q存储指数。
分别输出两次输入的多项式。
将两次输入的多项式的指数按从大到小的顺序进行排列,同时相应的系数要进行交换。
输出时如果进行判断。
如果当前该项与下一项的的系数相同,将两项系数相加后输出,并跳过下一项。
如果不相等,直接输出。
输出时需注意的问题:当系数为0时,该项不输出当系数为负数时,不要再在前面输出+。
程序的流程程序由三个模块组成:输入模块:完成两个多项式的输入。
处理模块:将多项式按其指数大小进行排列。
输出模块:输出合并后的多项式。
三、详细设计算法的具体步骤:数组方法:struct code{int p,q;}a[1000],b[1000];//结构体数组,可以用二维数组代//替for(i=0;i<n;i++){for(j=i+1;j<n;j++){if(a[j].q>a[i].q) {temp=a[j].q;//指数排序a[j].q=a[i].q;a[i].q=temp;temp=a[j].p;//系数跟着变化a[j].p=a[i].p;a[i].p=temp;}}//对输入的指数进行排序,相应的系数跟着变化cout<<a[0].p<<"x^"<<a[0].q; //先输出第一项if(a[i].p>0)else if(a[i].p<0)cout<<a[i].p<<"x^"<<a[i].q;cout<<'+'<<a[i].p<<"x^"<<a[i].q;//完成运算符和其他项的输//出,然后类似于上面,对第二个多项式进行相应的操作。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18: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):存储结构一元多项式的表示在计算机内可以用链表来表示,为了节省存储空间,只存储多项式中系数非零的项。
链表中的每一个结点存放多项式的一个系数非零项,它包含三个域,分别存放该项的系数、指数以及指向下一个多项式项结点的指针。
创建一元多项式链表,对一元多项式的运算中会出现的各种可能情况进行分析,实现一元多项式的相加、相减操作。
(2):数据链表由于采用链表的方法,我们可以建立3条链;一条用于存放多项式HA —条用于存放多项式HB还有一条用于存放新形成的HC此外,我们的程序应具备以下几个功能:建立链表,撤销链表,打印链表,按要求插入一个新的结点,复制链表;为了使上面程序结构分析进一步细化,为了使程序结构更加清晰,我们可以把上面的内容都编写成函数形式。
1、建立链表该程序建立链表的函数与大多数建立链表的操作基本一致,但是由于实体是一元多项式的关系。
我们更希望,在处理客户输入的数据的同时,能对数据进行适当的处理。
也就是数学上所说的,“对一元多项式进行化简,并按照降幂排序。
”由于在前面的练习中,我们得知,在链表中插入一个结点的函数,具有对链表的成员进行排序与合并的功能。
如此一来,我们可以巧妙地处理,在建立链表的同时,调用”在链表中插入一个结点的函数”,对新建立的链表进行化简。
该函数的算法描述如下;声明指针变量,并作为头指针的指针变量赋初值NULL;创建一个新的结点,并输入链表的信息;若输入的系数值与函数值同不为0 时,调用”在链表中插入一个结点的insert 函数”,将结点插入链表中;(注:这里建立链表的函数与以往的不同,我们是通过假想有一条空链,不断地调用insert 函数来实现建立链表的功能。
简言之;链表中成员的链接全都靠insert 函数来实现,而该函数仅仅是不断地提供建立链表所要的数据罢了。
)若还要继续插入结点,转到步骤 2 继续进行;否则,程序结束,把头指针返回主程序。
2、撤销链表撤销链表是为了把链表所占用的地址回收起来,防止造成浪费。
我们该程序可以采用从链表的始端逐步销去结点。
在这个过程中,我们需要链表的头地址作为形式参数,还需要建立一个指针用来指向新头地址。
该函数的算法描述如下:指针变量;并把头地址指针赋给新指针变量;把头地址指针指向下一个结点;删除新指针变量;若还要继续删除结点,转到步骤 1 继续执行;否则,结束程序。
3、按要求插入一个新的结点由于前面的建立链表的creat 函数,调用了该函数,所以我们这个函数的设计思想也明朗多了,由于建立的链表是有序的,并且需要合并指数相同的结点,所以要新结点需要按指数值降幂的顺序插入链表中。
判断链表是否为空,如果为空则直接插入即可;否则按照要插入结点指数值的大小在链表中寻找他要插入的位置,对于插入位置有第一个节点、最后一个结点和链表中间这三种情况分别进行处理。
函数的形式参数:链表的头地址,指向要插入结点的指针;返回结果:插入结点后新链表的头地址。
该函数的算法描述如下:声明指针变量并令它指向连头结点;判断指向要插入结点的指针是否为空;如果是,则不需要插入新结点,直接返回头地址,程序结束;否则再判断链表是否为空;如果是,则直接插入结点,然后返回链表的头地址,程序结束;否则,在链表中寻找待插入结点的插入位置:1,若链表中存在着与“插入的结点”的指数相同的情况,我们依然插入链中,只是把该结点的系数修改为” 0”,把链中的结点系数修改为”两系数之和”。
(为了方便,我们并没有把结点进行删除的操作,只是在输出的操作里加入权限设置。
)2 ,若链表中不存在着与“插入的结点”的指数相同的情况,我们正常地插入链中。
返回插入结点后链表的头地址,程序结束。
4、主函数主函数主要负责输出界面的指引语句,并合理地调用各个函数,还要有适当的循环操作以及停止循环的语句,以致可以方便地达到合并两个一元多项式的功能。
四、调试分析(1)调试过程中遇到的问题是如何解决的以及对设计与实现的回顾讨论和分析:在输入诸如“ 0,3 ”,“ 2,0 ”时,程序无法正常运行或总是出错.解决:对指数或系数为0 的情况应单独讨论。
为此,建立了delZeroCoef 函数来解决问题。
(2)算法的时间复杂度及改进算法的时间复杂度:一元多项式的加法运算的时间复杂度为O(m+n), 减法运算的时间复杂度为O(m-n),其中m n分别表示二个一元多项式的项数。
问题和改进思想:在设计该算法时,出现了一些问题,例如在建立链表时头指针的设立导致了之后运用到相关的指针时没能很好的移动指针出现了数据重复输出或是输出系统缺省值,不能实现算法。
实现加法时该链表并没有向通常那样通过建立第三个链表来存放运算结果,而是再度利用了链表之一来进行节点的比较插入删除等操作。
为了使输入数据按指数降序排列,可在数据的输入后先做一个节点的排序函数,通过对链表排序后再进行之后加减运算。
五、源程序代码#include<stdlib.h>#include<stdio.h>#include<ctype.h> typedef struct LNode { float coef; int expn; structLNode *next; }LNode;LNode* InitPolyn(LNode *La,int n) { if(n <= 0) return NULL;LNode *h = La = (LNode*)malloc(sizeof(LNode)), *Lb;La->coef = 0.0; int i;printf(" 依次输入%d 个非零项(每项前一个为系数,后一个为指数) \n",n);for (i = 1; i <= n; ++i) { scanf("%f%d",&La->coef,&La->expn);if(La->coef) Lb = La;La = La->next = (LNode*)malloc(sizeof(LNode));}Lb->next = NULL; free(La); return h;}LNode* selsort(LNode *h) { LNode *g, *La, *Lb; if(!h) return NULL; float f; int i, fini = 1;for(g = h;g->next&&fini;g = g->next) { fini = 0;for(La = h,Lb = h->next;Lb;La = La->next,Lb = Lb->next) if (La->expn <Lb->expn) { f = La->coef;i = La->expn;La->coef = Lb->coef;La->expn = Lb->expn;Lb->coef = f;Lb->expn = i; fini = 1;}} for(g = h,La = g->next;La;) if(g->expn==La->expn) { g->coef += La->coef; g->next = La->next; Lb = La;La = La->next;free(Lb);}else if(g->next) {g = g->next;La = La->next;} return h;}void PrintfPoly(LNode *La) {LNode *Lb = La; if(!Lb) { putchar('0'); return;} if(Lb->coef!=1) { printf("%g",Lb->coef); if(Lb->expn==1) putchar('X'); else if(Lb->exp n) pri ntf("X A%d",Lb->exp n);}else if(!Lb->expn) putchar('1'); else if(Lb->expn==1) putchar('X');else printf("XA%d",Lb->expn);Lb = Lb->next; while (Lb) { if(Lb->coef > 0) putchar('+');if(Lb->coef!=1) { printf("%g",Lb->coef); if(Lb->expn==1) putchar('X'); else if(Lb->expn) printf("XA%d",Lb->expn);}else if(!Lb->expn) putchar('1'); else if(Lb->expn==1) putchar('X');else printf("XA%d",Lb->expn);Lb = Lb->next;}}Compare(LNode *a, LNode *b) { if (a->expn < b->expn) return -1; if(a->expn > b->expn) return 1; return 0;}LNode* AddPolyn(LNode *Pa, LNode *Pb) {LNode *h, *qa = Pa, *qb = Pb, *La, *Lb; float sum;h = La = (LNode*)malloc(sizeof(LNode)); La->next = NULL; while (qa && qb) { switch (Compare(qa,qb)) { case -1: La->next = qb;La = qb;qb = qb->next; break;case 0: sum = qa->coef + qb->coef;if (sum != 0.0) {La->next = qa; qa->coef = sum;La = qa;qa = qa->next;} else { Lb = qa; qa = qa->next; free(Lb);}Lb = qb; qb = qb->next; free(Lb); break;case 1: La->next = qa;La = qa;qa = qa->next; break;}}if (Pa) La->next = qa;if (Pb) La->next = qb;Lb = h; h = h->next; free(Lb); return h;}LNode* Add(LNode *Pa, LNode *Pb) { int n;puts(" 再输入 1 个一元多项式的项数"); scanf("%d",&n);Pb = InitPolyn(Pb,n);Pb = selsort(Pb);PrintfPoly(Pa);if(Pb && Pb->coef>0) printf(" + ");PrintfPoly(Pb);Pa = AddPolyn(Pa,Pb); printf(" = ");Pa = selsort(Pa);PrintfPoly(Pa);return Pa;}LNode* SubtractPolyn(LNode *Pa, LNode *Pb) { LNode *La = Pb;while(La) {La->coef *= -1;La = La->next;}return AddPolyn(Pa,Pb);}LNode* Subtract(LNode *Pa, LNode *Pb) { int n;puts("\n 再输入 1 个一元多项式的项数"); scanf("%d",&n);Pb = InitPolyn(Pb,n);Pb = selsort(Pb);PrintfPoly(Pa); printf(" - "); putchar('(');PrintfPoly(Pb);putchar(')'); Pa = SubtractPolyn(Pa,Pb); printf(" = ");Pa = selsort(Pa);PrintfPoly(Pa);return Pa;}LNode* MultiplyPolyn(LNode *Pa, LNode *Pb) { if(!Pb) return NULL;LNode *pa = Pa, *p, *q, *r, *s, *t; r = p =(LNode*)malloc(sizeof(LNode)); while(pa) { p->coef = pa->coef; p->expn = pa->expn;q = p;p = p->next = (LNode*)malloc(sizeof(LNode)); pa = pa->next;} q->next = NULL; free(p); pa = Pa;t = s = (LNode*)malloc(sizeof(LNode)); while(pa) { q = s;s = s->next = (LNode*)malloc(sizeof(LNode)); pa = pa->next;} q->next = NULL; free(s); pa = Pa;while(pa) { pa->coef *= Pb->coef;pa->expn += Pb->expn; pa = pa->next;}Pb = Pb->next; while(Pb) { p = r; s = t;while(p) { s->coef = p->coef * Pb->coef;s->expn = p->expn + Pb->expn; p = p->next;s = s->next;}Pa = AddPolyn(Pa,t);Pb = Pb->next;} return Pa;}LNode* Multiply(LNode *Pa, LNode *Pb) { int n;puts("\n 再输入 1 个一元多项式的项数"); scanf("%d",&n);Pb = InitPolyn(Pb,n);Pb = selsort(Pb); putchar('(');PrintfPoly(Pa);putchar(')');prin tf(" x "); putchar('(');PrintfPoly(Pb);putchar(')'); printf(" = ");Pa = MultiplyPolyn(Pa,Pb);Pa = selsort(Pa);PrintfPoly(Pa);return Pa;}void main() {LNode *A,*B;char s[2];int i,n;printf("\t\t\tOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO\n"); printf("\t\t\t 一元多项式计算\n ");printf("\t\t\tOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO\n"); printf("\t\t\t ### 王伟###\n");puts("\n 输入 1 个一元多项式的项数"); scanf("%d",&n);A = InitPolyn(A,n);A = selsort(A);PrintfPoly(A);p: puts("\n1: 加\n2:减\n3:乘\n4:退出");getchar();q: gets(s);if(s[1]!='\0' || !isdigit(*s)) { puts("Error ,请重新输入!");goto q; }i = *s-48; switch(i) { case 1:A = Add(A,B);goto p;;case 2:A = Subtract(A,B);goto p;;case 3:A = Multiply(A,B);goto p;case 4:break;default:puts("Error, 请重新输入!");goto q; }}六、程序运行效果图与说明例:x^2+3xA4(1)按照需要操作的多项式输入第1个多项式的项数例中多项式项数为2,输入2,回车;(2)依次输入两个非零项,两个项之间用空格间开即可,每项输入,前一个为系数,后一个为指数,例中多项式第一项系数为1输入1空格,指数为2,输入2,空格,第二项系数为3,输入3,空格,指数为4,输入4,回车;即显示x^2+3xA4例:计算(x A2+3x A4)与(5x A6+7x A8)的乘积(1)选择需要操作的运算,例如要计算多项式乘多项式xA2+3xA4,选择3,回车;(2)再按照步骤(2)输入多项式,回车;(3)输出(xA2+3xA4)X(5xA6+7xA8)= 2似人12+22乂八10+5乂八8七、本次实验小结通过本次学习制作一元多项式的实验报告,我发现了自己存在的不足,同时也知道了学无止境,亲自动手,使我的实际操作有了很大提升,通过跟室友同学之间的交流,弄清楚了许多知识点,这也是值得高兴的,但还有一些无法得到解决,我希望自己在以后的程序设计中更进一步,如果我们好好利用,专业课程对我们以后是有莫大帮助的在这里再一次感谢帮助过我的同学,互相学习才能取长补短。