一元稀疏多项式实验报告(罗忠霖)
一元稀疏多项式设计报告.doc
![一元稀疏多项式设计报告.doc](https://img.taocdn.com/s3/m/04894718a8114431b90dd88d.png)
目录一、需求分析 (4)1、程序的功能 (4)2、输入输出的要求 (4)二、概要设计 (4)三、详细设计 (4)1、数据类型 (4)2、模块的类C码算法 (5)3、函数调用关系 (12)四、调试分析以及设计体会 (14)1、调试分析 (14)2、调试分析中遇到的问题及解决方法 (16)3、心得体会 (17)五、使用说明 (18)六、附录 (19)1、参考书目 (19)2、源程序代码(带注释) (19)七、计算机科学与技术课程设计评分表 (28)1)需求分析A.程序的功能。
a.输入并建立多项式;b.输出多项式,输出形式为整数序列:n,c1,e1,c2,e2,…,cn,en,其中n是多项式的项数,ci,ei,分别是第i项的系数和指数,序列按指数降序排列;c.多项式a和b相加,建立多项式a+b;d.多项式a和b相减,建立多项式a-b;e.计算多项式在x处的值;B.输入输出的要求。
每输入一个系数和指数确定一个一元多项式2)概要设计a.程序模块组成以及每个模块的功能。
主程序中通过调用void create(polynmial &L) 创建存储在单链表中的多项式,调用void display(polynmial L);输出显示多项式,调用void sort(polynomial &L);和void reverse(polynomial &L)对多项式进行排序,使其按降序排列,调用void add(polynomial La, polynomial Lb, polynomial&Lc)和void subtract(polynomial La, polynomial Lb, polynomial &Ld)对两个多项式进行加减操作b.数据结构和数据库结构多项式的系数为浮点型,多项式的指数为整型;用带表头结点的单链表存储多项式,多项式的项数存放在头结点中;多项式之间进行加减运算。
一元稀疏多项式的加法运算数据结构实习
![一元稀疏多项式的加法运算数据结构实习](https://img.taocdn.com/s3/m/9dd6cef1482fb4daa48d4b5b.png)
实习一线性表、栈和队列及其应用——一元稀疏多项式的加法运算【问题描述】设计一个实现一元稀疏多项式相加运算的演示程序。
【基本要求】(1)输入并建立两个多项式;(2)多项式a与b相加,建立和多项式c;(3)输出多项式a,b,c。
输出格式:比如多项式a为:A(x)=c1xe1+c2xe2+…+ cmxem,其中,ci和ei分别为第i项的系数和指数,且各项按指数的升幂排列,即0≤e1<e2<…<em。
多项式b,c类似输出。
【测试数据】(1)(1+x+x2+x3+x4+x5)+(-x3-x4)=(1+x+x2+x5)(2)(x+x100)+(x100+x200)=(x+2x100+x200)(3)(2x+5x8-3x11)+(7-5x8+11x9)=(7+2x+11x9-3x11)一.需求分析1.输入的形式和输入值的围:输入是从键盘输入的,输入的容为多项式的系数和指数,其中多项式的每一项分别以一个系数和指数的形式输入,不带未知数X,系数为任意的实数,指数为任意的整数。
要结束该多项式的输入时,输入的指数和系数都为0.2. 输出的形式从屏幕输出,显示用户输入的多项式,并显示多项式加减以后的多项式的值,并且多项式中将未知数X表示了出来. 形式为:+c1X^e1+c2X^e2+…+ciX^ei+…(ci和ei分别是第i 项的系数和指数,序列按指数升序排列。
)当多项式的某一项的系数为+1或者-1时侧该项多项式的输出形式为X^ei或-X^ei;当该项的系数为正时输出+ciX^ei,当为负数时则输出ciX^ei3. 程序所能达到的功能输入并建立多项式,实现一元稀疏多项式的相加并输出。
4. 注意:所有多项式都必须以指数升密形式输入。
5. 测试数据为(1)(1+x+x2+x3+x4+x5)+(-x3-x4)=(1+x+x2+x5)(2)(x+x100)+(x100+x200)=(x+2x100+x200)(3)(2x+5x8-3x11)+(7-5x8+11x9)=(7+2x+11x9-3x11)二.设计1.设计思路(1).储存结构:链式存储(2). 主要算法基本思路首先定义一个多项式的结构体,存放多项式每一项的系数和指数以及next指针;然后定义两个指针,第一个指针指向第一个多项式,第二个指针指向第二个多项式。
数据结构课程设计一元稀疏多项式计算器报告代码
![数据结构课程设计一元稀疏多项式计算器报告代码](https://img.taocdn.com/s3/m/d51a16db580216fc710afd78.png)
数据结构课程设计设计题目:一元稀疏多项式计算器专业______________________ 班级______________________ 学号______________________ 姓名______________________ 指导教师___________________2010 年12 月20 H目录一、课程题目 (1)二、需求分析 (1)三、测试数据 (2)四、概要设计 (2)五、调用关系图 (3)六、程序代码 (3)七、测试结果 (11)八、心得体会及总结 (12)数据结构课程设计一、课程题冃一元稀诡多项式计算器二、需求分析1、一元稀疏多项式简单计算器的功能是:1.1输入并建立多项式;1.2输出多项式,输出形式为整数序列:n, cl,el,c2,e2, ......................... c n, en,其中ii是多项式的项数,ci和ei分别是第i项的系数和指数,序列按指数降序排列;1.3求多项式a、b的导函数;1.4计算多项式在x处的值;1.5多项式"和b和加,建立多项认a+b;1.6多项式a和b相减,建立多项式a-b。
2、设计思路:2.1定义线性表的动态分配顺序存储结构;2.2建立多项式存储结构,定义指针*next2.3利用链表实现队列的构造.毎次输入一项的系数和指数,町以输出构造的一元多项式2.4演示程用以用户和计舜机的对话方式执行,即在计舜机终站上显示“提示信息” Z后,由川户化键盘丄输入演示程序小规运的运行•命令;报后根据相应的输入数据〔滤去输入中的4法字符)建立的多项式以及多项式相加的运行结果在屏幕上显示。
多项式显示的格式为:clx*el+c2x*e2+ — +cnx"en3、设计思路分析要解决多项式相加,必须要冇多项式,所以必须首先建立两个多项式,在这电采用链表的方式存储琏表,所以我将结点结构体定义为运川尾插法建立两条单链表,以巾•链表polyn p和polyn h分别表示两个一元多项式a和b, a+b的求和运算等同于单链表的插入问题(将单链表polyn P 中的结点插入到单链表polyn h中),因此“和多项式”中的结点无须另生成。
实验报告——2一元稀疏多项式计算器
![实验报告——2一元稀疏多项式计算器](https://img.taocdn.com/s3/m/0cd7d515bb4cf7ec4bfed0b3.png)
(3)(1+x+x +x +x +x ) +( -x-x )
(4)(x+x2+x3)+0
(5)(x+x3)-(-x-x-3)
⑹(x+x2+x3)+0
三、实验内容
主要算法设计
typedef struct Node
{
float coef;
int in dex;
struct Node *n ext;
{
LinkList *pc;
int flag=0;
while(flag==0)
{
if(pb->next==NULL)
flag=1;
else
{
pb=pb->next;
pc=(LinkList *)malloc(sizeof(LinkList));
pc->coef=-pb->coef; pc->index=pb->index; pc->next=NULL;
主冃主冃斗冃主
2,1
5,B -3.1,11
项式b的项数;3 7,0-5.8ffl-ltb疏多项式计算器
3
»■快I列歹序序1数2数弓整t(展lt4L2^^bm、」丄-TrJ二上M?E--uMr.选项选项选现岀岀岀4-.冷丄#-W
3
nV为===*
,2,1
,7,
请输更入塾项更蠢製扌吐 亟人第2项更薑癒吋 备入第咗项的系数却1逼△鄴项翌謎I诰倉△第2项更舍魅吐亟人>项 聶入第4项的系数稲
Insert(pc,head);
}
}
return head;
void main()
云南大学软件学院数据结构实验二实验报告——多项式计算器
![云南大学软件学院数据结构实验二实验报告——多项式计算器](https://img.taocdn.com/s3/m/739131264b35eefdc8d33346.png)
云南大学软件学院数据结构实验报告2010秋季学期(本实验项目方案受“教育部人才培养模式创新实验区(X3108005)”项目资助)学号:姓名:专业:指导老师:实验难度A□B□ C □承担任务(难度为C时填写)指导教师评分(签名)【实验题目】实验2. 线性表及其应用【问题描述】用C或C++语言设计并实现一个一元稀疏多项式的简单计算器。
【基本要求】一元稀疏多项式简单计算器的基本功能是:1、输入并建立多项式2、输出多项式,序列按指数降序排列3、多项式A(x)和B(x)相加,并建立多项式A(x)+B(x)4、多项式A(x)和B(x)相减,并建立多项式A(x)-B(x)5、给定 x 的值,计算多项式6、多项式A(x)和B(x)相乘,建立多项式A(x)*B(x) (* 选做,作为难度B的操作)【CDIO项目要求】1、有完整的CDIO四个阶段描述2、有友好美观的操作界面3、有软件使用说明或帮助文档4、项目成员分工明确,团结协作【实现提示】一、【实验构思(Conceive)】(10%)本实验通过C语言实现了多项式加法、减法、乘法、多项式求导、多项式积分的功能。
利用了冒泡排序的算法作为排序的核心算法。
运用了高等数学中多项式的求导积分的知识。
二、【实验设计(Design)】(15%)本程序定义了抽象数据结构listnode,用于存储多项式的系数和指数并存储指向下一个listnode的指针来构成链表。
本程序包含如下*个函数:Main函数:调用input函数—>调用bubble_sort函数—>调用operplus函数—>调用oper_minus函数—>调用oper_mul函数—>调用oper_dy函数—>调用oper_jifen 函数。
Oper_plus函数:将两个链表的相应项系数相加,指数不同项不操作,存入新链表,再调用排序算法,使之为降序排列。
Oper_minus函数:将两个链表的相应项系数相减,指数不同项不操作,存入新链表,再调用排序算法,使之为降序排列。
一元多项式实验报告
![一元多项式实验报告](https://img.taocdn.com/s3/m/e9451f58804d2b160b4ec070.png)
实验题目一元多项式的加法运算班级:姓名:学号:日期:一、需求分析1.程序的基本功能:(1 ) 输入两个稀疏的一元n次多项式。
(2) 分别输出这两个多项式。
(3) 计算两个多项式的和。
多项式相加的运算规则为:对于两个一元多项式中指数相同的子项,对应的系数相加,若和非灵,将其构成和多项式中的一个子项;对于两个一元多项式中指数不同的子项,则分别复制到和多项式中去。
(4) 输出和多项式。
2.输入输出要求:(1) 输入多项式:按照指数递增的顺序和指定的输入格式输入各个的子项:“系数、指数”(当输入子项个数达到预设数量的时候停止)。
(2) 输出多项式:在文本界面下,采用类似数学表达式的方式输出多项式、例如:多项式A=3+6x3-2x8+12x20,可在屏幕显示为:A=3+6x^3-2x^8+12x^20要求:a.系数值为1的非零项输出形式中省略系数1,如子项“1x8”的输出形式为“x8”,项“-1x3”的输出形式为“x3”。
b.指数为0的输出形式中省略指数部分,如“3x0”的输出形式应为“3”;指数为“1”的项输出时略去“1”。
c.多项式第一项系数为正时,不输出“+”,其他项要输出“+”、“-”符号。
3.测试数据:① (x+3x6-8.6x11)+(6-3x6+21x9)=6+x+21x9-8.6x11② (3x-3-x+4.1x2-1.2x9)+(-3x-3-5.1x2+7.8x12)=-x-x2-1.2x9+7.8x12③ (x+x3)+(-x-x3)=0④ (x+x100)+(x100+x200)=x+2x100+x200⑤ (x+x2+x3)+0= x+x2+x3二、概要设计1.抽象数据类型的定义:对于一元n次多项式P(x,n)=P0+P1x1+P2x2+……+P n x n而言,每一个子项都是由“系数”和“指数”两部分来组成的,因此可将多项式抽象成一个“系数、指数对”构成的线性表,其中多项式的每一个系数非零的子项作为线性表中的一个元素。
实验一一元稀疏多项式的表示及加法运算
![实验一一元稀疏多项式的表示及加法运算](https://img.taocdn.com/s3/m/53595e1391c69ec3d5bbfd0a79563c1ec5dad7aa.png)
实验一 一元稀疏多项式的表示及加法运算一、 需求分析1.程序的功能: ● 多项式以指数递增的顺序输入。
● 设计的数据结构应有利于表示任意一元稀释多项式。
● 输出原始多项式及运算结果。
● 附加功能:乱序输入计算表达式结果 2. 输入输出要求: ● 多项式以指数递增的方式输入 ● 输出原始多项式及其结果 3.测试数据(1)1785937x x x +++ , 879228x x x -+ (2)0 , 879228x x x -+(3)87109228x x x -+ , -1附加功能测试数据:(4) 53658672x x x x +--,268x x --二、 概要设计●所用数据结构定义:struc t Term{ //多项式结点的定义float coef; //系数 int exp;//指数Term * link; Term(float c,int e,Term * next=NULL){coef=c;exp=e;link=next;} Term *Inser t Afte r (float c,int e); Term & opera t or -=(Term & t){if (t.exp==exp) coef-=t.coef;retur n *this ;} Term & opera t or +=(Term & t){if (t.exp==exp) coef+=t.coef;retur n *this ;} frien d ostre a m & opera t or <<(ostre a m &,const Term&); };class Polyn o mal{//多项式的类定义 publi c : Polyn o mal(){ //构造函数,建立空链表first =new Term(0,-1);first->link=first;//必须链成环}~Polyno mal(){makeEm pty();}Polyno mal(Polyno mal & R); //复制构造函数Polyno mal & operat or=(constPolyno mal & R); //重载复制赋值操作符void insert(floatc,int e,Polyno mal& R);//对于二项式进行插入排序 Polyno mal sort();//对于多项式进行排序Term * getHea d() const{return first;}void makeEm pty();privat e:Term * first;friend ostrea m & operat or<<(ostrea m &,constPolyno mal&);friend istrea m & operat or>>(istrea m &,Polyno mal&);friend Polyno mal operat or+(Polyno mal&,Polyno mal&);};主程序的流程及各模块之间的层次关系:1)主程序流程2)模块之间层次关系三、详细设计1、插入一个结点Term* Term::Insert After(floatc,int e){//在当前由this指针指示的项(即调用此函数的对象)后面插入一个新项link=new Term(c,e,link); //创建一个新结点,自动链接return link; //插入到this结点后面2、重载各运算符(1)Polyno mal & Polyno mal::operat or =(constPolyno mal & R){makeEm pty(); //先清空first=new Term(0,-1);Term *destpt r=first,*srcptr=R.first->link;while(srcptr!=R.first){destpt r->Insert After(srcptr->coef,srcptr->exp);srcptr=srcptr->link;destpt r=destpt r->link;}destpt r->link=first;//必须链成环return *this;}#伪代码清空;动态创建节点f irst;创建节点指针*destpt r指向fi rst,创建节点指针*srcptr指向R.first->link;WHILE(R链未遍历结束)将R链表中的结点一次插入到fir st之后;ENDWHI LE将*destpt r连成环;结束(2)istrea m& operat or>>(istrea m& in,Polyno mal& x){Term *rear=x.first;int e;floatc; //定义尾指针rearwhile(1){cout<<"输入:系数,指数(以、-1结束):"<<endl;in>>c>>e;if(c==0&&e==-1)break;//用e小于控制输入结束rear=rear->Insert After(c,e); //链接到rear所指结点后}return in;}(3)ostrea m & operat or<<(ostrea m& out,constPolyno mal & x){ //输出到附加头结点的多项式链表xTerm *curren t=x.first->link;cout<<"The polyno mal is:"<<endl;bool h=true;while(curren t!=x.first){if(h==false&¤ t->coef>0.0)out<<"+";h=false;if(curren t->coef==0){out<<"0";curren t=curren t->link;}else{out<<*curren t; //调用term类的重载操作"<<"curren t=curren t->link;}}out<<endl;return out;}#伪代码创建指针*curren t指向当前节点x.first->link;设置标志位hWHILE<遍历多项式>IF<标志位h为假,当前指向节点指数为0>打印符号+;改变标志位;ELSE打印该节点;指向下一个节点;ENDIFENDWHI LE(4)Polyno mal operat or+(Polyno mal& A,Polyno mal& B){Term *pa,*pb,*pc,*p,*last;floattemp;Polyno mal C;pc=C.first;pa=A.first->link;pb=B.first->link;while(pa!=A.first&&pb!=B.first){ //两两比较if(pa->exp==pb->exp){ //对应项指数相等temp=pa->coef+pb->coef; //系数相加if(fabs(temp)!=0)pc=pc->Insert After(temp,pa->exp);pa=pa->link ;pb=pb->link;}else if(pa->exp<pb->exp){pc=pc->Insert After(pa->coef,pa->exp); //pa指数小pa=pa->link;}else{pc=pc->Insert After (pb->coef,pb->exp);pb=pb->link;} //pb指数小,加入ah 链}if(pa!=A.first){p=pa;last=A.first;}else{p=pb;last=B.first;}while(p!=last){pc=pc->Insert After (p->coef,p->exp );p=p->link;}return C;}#伪代码*Pa=二项式a的当前节点;*pb=二项式b的当前节点;新建二项式c;WHILE<遍历二项式>IF<pa,pb的指数相等>IF<指数之和不为0>系数相加后将插入节点到c尾部;ENDIF比较a,b的下一个节点ELSEIF<pa的指数小于pb的>将pa的当前节点复制到c尾部;Pa后移;ELSE将Pb的当前节点复制到c尾部;Pb后移;ENDIFENDWHI LEIF<pa,pb中某一多项式未遍历结束>将未遍历空的那一个所在的二项式剩余部分复制到c尾部;ENDIF返回合成多项式3、排序算法(1)Polyno mal Polyno mal::sort(){Polyno mal R;Term *p=first;p=p->link;while(p!=first){insert(p->coef,p->exp,R);p=p->link;}return R;}(2)void Polyno mal::insert(floatc, int e, Polyno mal &R){Term *q=R.first,*p=R.first->link, *r;if(p==R.first) {q->link=new Term(c,e);//c为空q->link->link=R.first;}else{while(p!=R.first){if(p->exp==e)//指数相等{p->coef+=c;if(p->coef!=0)break;if(p->coef==0){q->link=p->link;r=p;p=p->link;delete r;break;}}else if(p->exp>e)//e小于当前结点的指数{q->link=new Term(c,e);q=q->link;q->link=p;break ;}else { p=p->link; q=q->link;}} if (p==R.first ) //e 大于R 中每一项的指数,插在表尾 { q->link=new Term(c,e); q->link->link=p;}}}四、 调试分析1、调试中的问题(1)在测试数据一时,出现带有常数项的多项式,常数项被构造为一次项,例如多项式1785937x x x +++被输出为1785937x x x x +++解决办法:在重载运算符+中,当pa 的指数小时,将程序由{pc=pc->Inser t Afte r (pa->coef,pb->exp);pb=pb->link;}改为{pc=pc->Inser t Afte r (pb->coef,pb->exp);pb=pb->link;}即可; (2)在调试问题二的过程中,出现的0被程序自动忽略,不能打印使得输出结果为879228x x x -++ 解决办法:在重载输出运算符的程序模块中添加: if(curre n t->coef==0){ out<<"0"; curre n t=curre n t->link; }即可保证程序的输出正常,但是是以作8792280x x x -++为输出的。
数据结构《一元多项式》
![数据结构《一元多项式》](https://img.taocdn.com/s3/m/f72f6197b1717fd5360cba1aa8114431b80d8e59.png)
一元多项式相加问题实验报告本实验的目的是进一步熟练掌握应用链表处理实际问题的能力。
一、问题描述通过键盘输入两个形如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 进入下一次循环。
数据结构实习报告——一元稀疏多项式运算器的设计
![数据结构实习报告——一元稀疏多项式运算器的设计](https://img.taocdn.com/s3/m/cafbf11d6c175f0e7cd13787.png)
数据结构实习报告班级 XXXXXX学生姓名 XXXXXX学号 *******XXXX指导教师 XXXXXX日期 2012年11月10日报告简介:整篇实习报告主要分为三部分:实习一,实习二以及实习困惑。
其中每个实习报告涉及6个部分:需求分析,设计,调试分析,用户手册,测试结果,源程序清单。
具体报告内容如下:实习一:一元稀疏多项式运算器的设计1、需求分析【问题描述】设计一个一元稀疏多项式简单计算器。
【基本要求】(1)输入并建立两个多项式;(2)多项式a与b相加,建立和多项式c;(3)多项式a与b相减,建立和多项式d;(4)输出多项式a,b,c,d。
输出格式:比如多项式a为:A(x)=c1xe1+ c2xe2+…+ cmxem,其中,ci和ei分别为第i项的系数和指数,且各项按指数的升幂排列,即0≤e1<e2<…<em。
2、设计(1)设计思想存储结构:以带头结点的单链表存储多项式。
算法主要思想:●首先定义单链表中每个结点的结构体类型,设计能够生成多项式链表的函数,这个函数的功能是可以根据给定的多项式来创建存储它的单链表。
●然后需要设计两个多项式相加的函数与两个多项式相减的函数。
●要检验多项式的运算结果以及初始的多项式链表正确与否,需要将其打印输出,故还需要设计打印输出函数。
●主函数的设计:依次调用多项式链表生成的函数、多项式相加减的函数,最后将结果打印输出。
(2)概要设计整个算法需要设计五个函数,分别是:多项式链表生成的函数、两个多项式相加的函数、两个多项式相减的函数、打印输出的函数以及主函数。
在设计各个函数之前,要定义单链表结点的结构体类型。
每个结点应该包括指数code、系数exp和指向下一个结点的指针next。
多项式链表生成的函数:函数的返回值应该为定义的结构体类型,不需要设置参数。
函数内部,需要有多项式指数和系数的输入,直至输入的系数为零时结束,将每一对输入的指数和系数保存到新结点中,并将结点插入到链表中。
一元稀疏多项式的计算
![一元稀疏多项式的计算](https://img.taocdn.com/s3/m/d403758751e79b8968022691.png)
实验一一元稀疏多项式的计算一、实验目的通过一元稀疏多项式的表示和计算,帮助学生熟练掌握线性表的基本操作,以及用线性链表表示线性表的存储结构和操作的实现。
二、实验内容实现一元稀疏多项式的如下运算:(1)两个一元稀疏多项式相加运算(2)两个一元稀疏多项式相减运算(3)两个一元稀疏多项式相乘运算三、实验原理1、一元多项式的逻辑表示一元多项式p n(x)可表示成:p n(x)=p0+p1x+p2x2+…+p n x nn+1个系数可用线性表来表示:p0,p1,p2,…,p n)其中每一项的指数i隐含在其系数p i的序号中。
一个一元多项式,如果其系数不为0的项相对于其多项式的次数(最大指数)而言要少得多,则称该一元多项式为一元稀疏多项式。
对一元稀疏多项式,若采用顺序存储结构,需n+1个元素单元存放系数。
当n很大且为零的系数较多时,既浪费存储空间,又浪费运算时间。
如:s(x)=1+3x10000+2x20000采用顺序存储分配需20001个元素空间,但只有3个元素有意义。
若参与同数量级的加法运算,要运行2000次以上。
因此,对一元多项式采用链式存储结构是必然的选择。
上例的链表表示形式如图1-1所示。
图1-1:一元稀疏多项式的链表表示示意图2、一元稀疏多项式的链式存储表示结点结构定义如下:typedef struct Item{double coef;int expn;struct Item *next;}Item,*Polyn;3、一元稀疏多项式运算原理设有两个稀疏多项式A和B,其运算原理如下:(1)两个多项式相加(C=A+B)的运算原则:指数相同,系数相加,若不为0,则在结果多项式中构成一新项。
指数不同,则两项分别抄入结果多项式中。
(2)两个多项式相减(C=A-B)的运算原则:指数相同,系数相减,若不为0,则构成一新项。
指数不同,对A多项式的项,直接抄入结果多项式中。
对B多项式的项,系数符号变换后,再将放入结果多项式中(3)两个多项式相乘(C=A×B)的运算原则用B多项式的每一项分别去乘A多项式的每一项,并将乘得得结果放入结果多项式中。
实习报告
![实习报告](https://img.taocdn.com/s3/m/758b013031126edb6f1a1080.png)
ADT Polynomial{
数据对象:D={ | ∈Termset,i=1,2,…n,n>0 Termset的每个元素包含一个表示系数的实数和表示指数的整数}
数据关系:R1={< , >| , ∈D且 中的指数值大于 中的指数值,i=1,2,…n,n>0 }
基本操作
CreatPolyn(head,m)
2)多项式模块—实现多项式抽象数据类型
各模块之间的调用关系
主程序模块
多项式模块
三:详细设计:
1.元素类型、结点类型和指针类型
float coef; int expn;//元素类型
typedef struct Polynomial{
float coef;
int expn;
struct Polynomial *next;
hc=qc;
}
else free(qc);//当相加系数为0时,释放该结点
}//while
return headc;
}//AddPolyn
Polyn SubtractPolyn(Polyn pa,Polyn pb){
//求解并建立多项式a-b,返回其头指针
Polyn h=pb;
Polyn p=pb->next;
hc->next=NULL;
headc=hc;
while(qa||qb){//qa或qb非空
qc=(Polyn)malloc(sizeof(struct Polynomial));//开辟新空间
switch(compare(qa,qb)){//调用compare函数
case 1://a多项式的指数大于b多项式的指数或b多项式已空但a多项式非空
一元稀疏多项式求导实验报告
![一元稀疏多项式求导实验报告](https://img.taocdn.com/s3/m/8e1cf203e87101f69e319558.png)
TermSet中的每个元素包含一个表示系数的实数和表示指数的整数}
数据关系:R1={ <ai-1 ,ai >|ai-1 ,ai∈D,且ai-1中的指数值<ai中的指数值i=2,...,n }
基本操作:
CreatPolyn( &P,m)
SubtractPolyn(&Pa,&Pb)
初始条件:一元多项式Pa,Pb已存在
操作结果:完成多项式的相减运算,即Pa-Pb,并销毁一元多项式Pb。} ADT List
2.本程序主要包含个模块:
1)主程序模块:main函数
2)插入结点模块:void Insert(Polyn p,Polyn h)函数
flag++;
}
printf("\n");
}
Polyn QiuDaoPolyn(Polyn head)//求解并建立导函数多项式,并返回其头指针
{
Polyn q=head->next,p1,p2,hd;
hd=p1=(Polyn)malloc(sizeof(struct Polynomial));//建立头结点
}
}
}
Polyn CreatePolyn(Polyn head,int m)//建立一个头指针为head、项数为m的一元多项式
{
int i;
Polyn p;
p=head=(Polyn)malloc(sizeof(struct Polynomial));
head->next=NULL;
for(i=0;i<m;i++)
一元稀疏多项式
![一元稀疏多项式](https://img.taocdn.com/s3/m/a3b8e50b240c844768eaeeb3.png)
实验报告题目:一元稀疏多项式班级: xxx 姓名:xxx 学号:xxxxxxx 日期:2010.5.15一.需求分析1. 本演示实验中,用一个链表表示一元稀疏多项式的各自的系数和指数,其中系数用浮点型存储,且系数不为0,指数以整形存储。
每一个多项式的输入以“空格符”为标志依次输入系数与指数最终程序会将指数相同的各项相加,并自动滤去系数为0的项,输出的多项式按降序排列。
2. 演示程序会以对话方式供用户选择各项功能,程序上显示实现各项功能的编号,用户输入对应地编号即进入相应的模式,在不同模式即可完成不同功能。
3. 程序执行的功能包括:(1)输出多项式的项数、系数与指数;(2)建立两个多项式并相加;(3)建立两个多项式并相减;(4)求一个多项式的导数;(5)建立两个多项式并相乘;(6)求一个多项式在x 处的值;二.概要设计为实现上述功能,应以有序链表表示多项式。
为此需要两个抽象数据类型表示链表和多项式。
1.有序链表的抽象数据类型定义为:ADT LinkedPoly{数据对象:D={(xi,yi)|xi为浮点型,yi为整形,i=1,2……,n n>=0}数据关系:R={}基本操作:Status Init(&L)操作结果:构造链表。
void Insert(&L, a, b)初始条件:链表L存在。
操作结果:当a非0时将插入新的结点。
void descend (&L)初始条件:链表L存在。
操作结果:将链表进行排序并将指数相同的系数进行合并。
void ascend(&L)初始条件:链表L存在。
操作结果:将链表进行排序并将指数相同的系数进行合并。
int length(L)初始条件:链表L存在。
操作结果:返回链表的长度。
void load(&p, &a, &b)初始条件:p指向的结点存在。
操作结果:把结点的指数和系数赋值给a和b。
}ADT LinkedPoly2.多项式数据类型的定义为:ADT formula{数据对象:D={(xi,yi)|xi为浮点型,yi为整形,i=1,2……,n n>=0}数据关系:R={(<yi-1,yi>|yi-1>yi, i=1,2……,n n>=0}基本操作:void plus(&L, a, b )初始条件:多项式L,a,b存在。
一元稀疏多项式计算器实验报告(c++编写,附源代码)
![一元稀疏多项式计算器实验报告(c++编写,附源代码)](https://img.taocdn.com/s3/m/a3d5899da8956bec0875e309.png)
一元稀疏多项式计算器实验报告级班年月日姓名学号_1 •实验题目设计一个一元稀疏多项式简单计算器。
2 •需求分析本程序用VC编写,实现一元浮点系数,整数指数稀疏多项式的创建、两个一元多项式相加、两个一元多项式相减、输出一元多项式。
①输入的形式和输入值的范围:A. 输入指定的数字,以此选择两个多项式的运算方式,运算方式有两个一元多项式相加、两个一元多项式相减。
B. 创建多项式时,需要输入此多项式,每一项的系数和指数。
②输出的形式:每次输入一个完整的多项式后、每次得出多项式运算结果时,会以指定的方式输出多项式。
③程序所能达到的功能:实现一元稀疏多项式的创建、两个一元多项式相加、两个一元多项式相减、输出一元多项式。
④测试数据:输入数据:A. 出现选择两个多项式的运算方式菜单时,输入 1 (即使两个多项式相加);B. 首先输入多项式p的每一项系数和指数,当输入的指数为-5000时,表示该多项式输入完毕,输入的数据依次为:3, 3, 0, -5000 ;C•其次输入多项式q的每一项系数和指数,输入数据依次为:2, 2, 0, -5000。
输出结果:多项式q+p的结果为:多项式为:3 23x +2x3 •概要设计1)为了实现上述程序功能,需要定义多项式结点的抽象数据类型:class Term{数据对象:floatcoef;该数据对象为多项式一项中的系数。
intexp;该数据对象为多项式一项中的指数。
Term*link;该数据对象为指向下一个多项式结点的指针。
基本操作:A. Term(float c, int e)初始条件:无操作结果:初始化多项式结点对象,将c赋值给该结点的数据成员coef (表示系数),将e赋值给该结点的数据成员exp (表示指数),将该结点的数据成员link赋值为0。
B. Term(float c, int e,Term*next)初始条件:无操作结果:初始化多项式结点对象,将c赋值给该结点的数据成员coef (表示系数),将e赋值给该结点的数据成员exp (表示指数),将next赋值给该结点的数据成员link (link表示指向下一个多项式结点的指针)。
课程设计报告(一元稀疏矩阵计算器)
![课程设计报告(一元稀疏矩阵计算器)](https://img.taocdn.com/s3/m/0873ede4524de518964b7db5.png)
目录一、课程题目 (3)二、设计目的 (3)三、需求分析 (3)四、总体设计 (3)五、详细设计 (2)六、实现部分 (3)七、程序测试 (3)八、设计总结 (12)一、课程题目一元稀疏多项式计算器二、设计目的掌握稀疏矩阵的相关运算。
掌握广义表的操作。
三、需求分析一元稀疏多项式简单计算器的基本功能是:输入并建立多项式;输出多项式,输出形式为整数序列:n,c1,e1,,c2,e2 ……cn,en,其中n是多项式的项数,ci和ei分别是第i项的系数和指数,序列按指数降序排列。
多项式a和b相加,建立多项式a+b多项式a和b相减,建立多项式a-b四、总体设计创建两个类,把一个作为另一个的友元类!两个类分别是listnode和polynomial!创建一个链表,包括指数,次数以及下一个结点信息,然后利用冒泡排序法进行排序,排完之后输出多项式!最后一个环节就是进行多项式的最原始运算,即加减运算!其中运用的内容包括链表知识,冒泡排序的知识!五、详细设计类listnode中包含friend class polynomial、double coef、int exp、listnode *next!类polynomial包含poly(); void printpoly();void bubblesort();polynomial operator+(polynomial &p1); polynomial operator-(polynomial &p1);在这个程序设计中,为了实现多项式的运算必须首先创建两个多项式,存储多项式的存储结构是链表,其结构如下:else if(p->exp<q->exp){double m;int n;m=p->coef;p->coef=q->coef;q->coef=m;n=p->exp;p->exp=q->exp;q->exp=n;s=q;q=q->next;}再就是实现多项式的加减法运算,在加减法运算中为了实现处理,设p、q分别指向单链表的两个多项式,比较p、q结点的指数项,由此得到下列运算规则:①若p->exp<q->exp,则结点p所指的结点应是“和多项式”中的一项,令指针p后移。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
集美大学计算机工程学院实验报告课程名称: 数据结构与算法班级:计算1013 实验成绩:指导老师:杨艳华姓名:罗忠霖实验名称:一元稀疏多项式计算器学号:2010810072 上机时间2011年10月20号编号:03 组号;12 上机完成时间:2学时一.目的(本次试验所涉及并要求掌握的知识点)本次实习的主要目的在于帮助学生熟练掌握线性表的基本操作在两种存储结构上的实现,其中以各种链表的操作和应用为重点。
二.实验内容与设计思想1.问题描述设计一个一元稀疏多项式简单计算器2.基本要求一元稀疏多项式简单计算器的基本功能:(1)输入并建立多项式;(2)输出多项式,输出的形式为整数序列:n,c1,e1,c2,,en,期中n为多项式的项数,ci和ei分别为第i 项的系数和指数,系列按指数的降序排列;(3)多项式a和多项式b相加,建立多项式a+b;(4)多项式a和b相减,建立多项式a-b;3.程序代码#include<stdio.h>#include<stdlib.h>#include<malloc.h>typedef struct list{float xishu;//某项的系数int zhishu;//某项的指数struct list * next;}*linklist;void caidan(void);void xianshi(linklist);linklist dx_built(int);linklist dx_jia(linklist,linklist);linklist dx_jian(linklist,linklist);linklist sort(linklist head);main(){int i,a,b;linklist pa,pb,pc1,pc2;caidan();do{printf("\n");printf("请选择你想要的功能0--4\n");scanf("%d",&i);switch(i){case 1: printf("请输入多项式A的项数:\n");scanf("%d",&a);pa=dx_built(a);pa=sort(pa);printf("请输入多项式B的项数:\n");scanf("%d",&b);pb=dx_built(b);pb=sort(pb);break;case 2: printf("多项式A与B的和为:");pc1=dx_jia(pa,pb);xianshi(pc1);break;case 3: printf("多项式A与B的差为:");pc2=dx_jian(pa,pb);xianshi(pc2);break;case 4: printf("多项式A=");xianshi(pa);printf("多项式B=");xianshi(pb);break;case 0: break;}} while(i!=0);printf("你选择了退出操作,欢迎使用!\n");system("pause");// 系统暂停,按任意键键继续flushall();system("cls");}void caidan(void){// 定义菜单函数printf("*************************************************\n");printf("\t一元稀疏多项式计算器\t\n");printf("*************************************************\n");printf("0.退出程序\n");printf("1.建立多项式\n");printf("2.多项式加法\n");printf("3.多项式减法\n");printf("4.多项式输出\n");printf("*************************************************\n"); }// caidanlinklist dx_built(int m){//创建多项式int i;linklist head,p;head=(struct list *)malloc(sizeof(struct list));head->next=NULL;for(i=1;i<=m;i++){p=(struct list *)malloc(sizeof(struct list));printf("(dx,%d)=",i);scanf("%f%d",&p->xishu,&p->zhishu);if(p->xishu==0) //系数为0的时候,删掉该节点free(p);else//系数不为0的时候{p->next =head->next ;head->next =p;}}return head;}linklist sort(linklist head){//指数按降序排列linklist p,q,tail,s;tail=NULL;while(head->next!=tail){p=head;q=p->next;while(q->next!=tail){if(p->next->zhishu<q->next->zhishu){s=q->next;p->next=q->next;q->next=q->next->next;p->next->next=q;q=s;}p=p->next;q=q->next;}tail=q;}return head;}void xianshi(linklist head){linklist q=head->next;int flag=0;//项数计数器if(!q){ //若多项式为空,输出0printf("0\n");return;}while(q){if(q->xishu>0&&flag!=0) putchar('+'); //系数大于0且不是第一项if(q->xishu!=1&&q->xishu!=-1){//系数非1或-1的普通情况printf("%.f",q->xishu);if(q->zhishu==1) putchar('X');else if(q->zhishu) printf("X^%d",q->zhishu);}else{if(q->xishu==1){if(!q->zhishu) putchar('1');else if(q->zhishu==1) putchar('X');else printf("X^%d",q->zhishu);}if(q->xishu==-1){if(!q->zhishu) printf("-1");else if(q->zhishu==1) printf("-X");else printf("-X^%d",q->zhishu);}}q=q->next;flag++;}printf("\n");}linklist dx_jia(linklist pa,linklist pb){/*多项式相加*/linklist p=pa->next ,q=pb->next ,pc,tail,s;//pc用来存储两个多项式的和pc=tail=(struct list *)malloc(sizeof(struct list));while(p!=NULL&&q!=NULL){s=(struct list *)malloc(sizeof(struct list));if(p->zhishu >q->zhishu )//p指数大,则存入pc,p然后后移{s->xishu=p->xishu;s->zhishu=p->zhishu;tail->next =s;tail=s;p=p->next;}else{ if(p->zhishu <q->zhishu)//q指数大,则存入pc,q然后后移{s->xishu=q->xishu;s->zhishu=q->zhishu;tail->next =s;tail=s;q=q->next;}else //指数相等时{ if(p->xishu +q->xishu==0 )//系数和为0则不存入pc中,p.q都后移{p=p->next ;q=q->next ;}else //系数和不为0,则存入pc中,q,p后移{s->xishu=p->xishu+q->xishu ;s->zhishu=p->zhishu;tail->next=s;tail=s;p=p->next;q=q->next;}}}}if(p==NULL)//p多项式比q短的时候,把q剩余的部分接到pctail->next=q;else//q多项式比p短的时候,把p剩余的部分接到pctail->next=p;return pc;}linklist dx_jian(linklist pa,linklist pb){/*多项式相减*/linklist p=pa->next ,q=pb->next ,pc,tail,s;//pc用来存储两个多项式的差pc=tail=(struct list *)malloc(sizeof(struct list));while(p!=NULL&&q!=NULL){s=(struct list *)malloc(sizeof(struct list));if(p->zhishu >q->zhishu )//p指数大,则存入pc,p然后后移{s->xishu=p->xishu;s->zhishu=p->zhishu;tail->next =s;tail=s;p=p->next;}else{ if(p->zhishu <q->zhishu)//q指数大,则把q是系数前加-1再存入pc,q然后后移{s->xishu=-(q->xishu);s->zhishu=q->zhishu;tail->next =s;tail=s;q=q->next;}else //指数相等时{ if(p->xishu -q->xishu==0 )//系数差为0则不存入pc中,p.q都后移{p=p->next ;q=q->next ;}else //系数差不为0,则存入pc中,q,p后移{s->xishu=p->xishu-q->xishu ;s->zhishu=p->zhishu;tail->next=s;tail=s;p=p->next;q=q->next;}}}}if(p ==NULL)//p多项式比q短的时候,把q剩余的部分接到pctail->next=q;else//q多项式比p短的时候,把p剩余的部分接到pctail->next=p;return pc;}三.实验使用环境(本实验所使用的平台和相关的软件)Microsoft Visual C++ 6.0四.实验步骤和调试过程(实验步骤测试数据设计测试结果分析)测试结果:五.实验小结(实验过程中遇到的问题及解决过程.实验体会和收获)1.在编写一元稀疏多项式程序代码的时候,为了实现这个程序,我采取了模块化设计,针对每个功能,我使用一个函数去实现它;2.在建立多项式的时候,我使用了单向链表去实现,在建立的时候,我把系数为0时候,这个节点给删掉,if(p->xishu==0) //系数为0的时候,删掉该节点free(p);然而我我这个函数还有个不足的地方,就是当指数相同,系数不同的时候,我没考虑到把它合并,这我以后会改进;2.在主函数里,我采用了调用函数的方式,使界面简洁,但是我刚开始的时候没有准确地调用函数,程序运行失败,并且我把排序函数插入到现实函数里,导致了一个未知的错误,程序失败了,后来我把排序函数加到了建立的地方,printf("请输入多项式A的项数:\n");scanf("%d",&a);pa=dx_built(a);pa=sort(pa);3,这个程序我花了最多时间的地方就是加法算法,我使用了三条链,pa.pb,pc,我把和的结果给存放在pc中,当和为0的时候我不存入pc,if(p->xishu +q->xishu==0 )//系数和为0则不存入pc中,p.q都后移{p=p->next ;q=q->next ;}并且我还考虑了当两个多项式项数不相等的时候,用了一下这条语句去实现if(p==NULL)//p多项式比q短的时候,把q剩余的部分接到pctail->next=q;else//q多项式比p短的时候,把p剩余的部分接到pctail->next=p;,但是我刚开始的时候,if(p->next==NULL),这个加法没有成功,最后发现了这个错误,运行成功;4.我在编写这个程序的时候,很好地复习了c语言的知识,并且能够对链表这个章节的知识有很好的巩固;。