一元多项式相加数据结构实验.docx

上传人:b****3 文档编号:1968042 上传时间:2022-10-25 格式:DOCX 页数:28 大小:151.36KB
下载 相关 举报
一元多项式相加数据结构实验.docx_第1页
第1页 / 共28页
一元多项式相加数据结构实验.docx_第2页
第2页 / 共28页
一元多项式相加数据结构实验.docx_第3页
第3页 / 共28页
一元多项式相加数据结构实验.docx_第4页
第4页 / 共28页
一元多项式相加数据结构实验.docx_第5页
第5页 / 共28页
点击查看更多>>
下载资源
资源描述

一元多项式相加数据结构实验.docx

《一元多项式相加数据结构实验.docx》由会员分享,可在线阅读,更多相关《一元多项式相加数据结构实验.docx(28页珍藏版)》请在冰豆网上搜索。

一元多项式相加数据结构实验.docx

一元多项式相加数据结构实验

中南大学

 

《数据结构与算法》课程实验

实验报告

 

题目实验一线性表的操作

学生姓名谭淇蔚

学生学号3901130721

专业班级软件工程1307班

完成日期2014年3月31日星期一

 

实验一线性表的操作(一元多项式相加)

1.需求分析

我们使用计算机处理的对象之间通常存在着的是一种最简单的线性关系,这类数学模型可称为线性的数据结构。

而数据存储结构有两种:

顺序存储结构和链式存储结构。

线性表是最常用且最简单的一种数据结构。

所以我们做的是实验一-----------线性表的操作。

实验的目的是掌握线性表的基本操作,插入、删除、查找,以及线性表合并等运算在顺序存储结构和链接存储结构上的运算以及熟练运用掌握的线性表的操作,实现一元n次多项式的加法运算。

学习实现一元n次多项式的加法是符号多项式的操作,是表处理的典型用例,需要注意的是:

顺序存储结构指的是用数组方法,使用数组方法实现时,在插入和删除的方面,数组不如链表灵活,方法复杂,删除其中一个需要将其后的数组元素改变位置,使其数组保持原有的顺序结构,在查找方面较链表简单,只需要知道其下标就可以知道。

链接存储结构指的是用链表方法,值得注意的是,删除和插入较为灵活,不需要变动大多数元素,但是查找过程相对于数组这种顺序存储结构来说较为复杂,耗时巨大。

我们要学习的是通过对两种方法基本操作的掌握来做到实现一元n次多项式的相加减。

我们程序的任务是:

能进行简单的线性表操作(插入、删除、查找)以及线性表合并等运算。

能通过这些基本操作实现一元多项式相加。

明确规定:

输入的形式:

按照提示(比如:

“请您输入第一个结构体数组的项数(不超过50项):

”、“请您输入第二个结构体数组的项数(不超过50项):

”、“请输入第n项的系数”、“请输入第n项的指数”等等),先输入多项式的项数,之后顺次输入每一项的系数与指数。

输入值的范围:

项数没有要求,但不能过于巨大;系数取为float型数据,指数取为int型数据,

输出的形式:

按照提示(比如:

“您输入的第一个多项式为:

”、“您输入的第二个多项式为:

”等等),会输出原输入的多项式和经过排序和合并之后的降幂型多项式。

同时,系数会以保留小数点后两位数字的形式输出;若指数输入时为小数,则输出时会自动截取其整数部分。

程序所能达到的功能:

程序可以对输入的序列紊乱的多项式进行加工,使之按照降幂排列,之后对两多项式进行加法运算(包括系数为负的加法),最后输出最终的多项式。

测试数

正确数据:

输入:

2*X^3+2*X^6+2*X^7+2*X^8+2*X^10和-

3*X^10+4*X^8+2*X^7+3*X^5+3*X^3

输出:

7.00*X^2+8.00*X^1+2.00

错误数据:

输入:

-8*X^1.5+4*X^2和3*X^2+12*X^1.6

输出:

7.00*X^2+4.00*X^1

 

2.概要设计

(1)链接存储结构:

structnode

{

floatcoef;

intexpo;

structnode*next;

}chainLink;

函数主体部分,利用头指针进行链表操作,利用display进行打印出屏幕,利用order函数对其进行降幂排序,当两个多项式已经创建完毕时,利用add函数进行两个多项式相加。

(2)顺序存储结构

抽象数据类型为结构体数组:

structpoly

{

floatcoef;

intexp;

};

函数主体部分,会引用指针进行参数传递,在函数主体部分定义了3个结构体数组同时定义其所对应的指针,利用用户输入,利用print函数将其打印出来,再用sort函数将其降序排列,做完两个结构体数组后,接着利用add函数将两个多项式相加。

3.详细设计

(1)链接存储结构:

结构体定义:

structnode

{

intcoef;//系数

intexp;//指数

structnode*next;//指针域

}chainLink;//创建chainLink的node结点对象

(值得注意的是,与顺序存储结构不同的是,内部还定义了指针域)

功能函数介绍:

structnode*create()//定义建立多项式函数,并返回链表头指针

{

structnode*h=NULL,*q,*p;//定义结构体头指针h,标记指针p和q,p是创造新节点的标记指针,q是链接链表的指针;

inti=1,N;//定义多项式的项数N及标记数i

cout<<"请输入多项式的项数:

\n";

cin>>N;

p=0;//指针初始化;

q=0;//本地指针初始化;

for(;i<=N;i++)

{

p=(structnode*)malloc(sizeof(chainLink));//为一个新节点分配空间

cout<<"请输入第"<

\n";

cin>>(*p).coef;

cout<<"请输入第"<

\n";

cin>>(*p).exp;

if(i==1){h=p;q=p;}//建立头节点

else

{

q->next=p;

q=p;

}

}

q->next=NULL;//p,q都成为新链表的尾指针;

p->next=NULL;

returnh;

}

PS:

值得注意的是,我在里面P,q指针均使其值为0,是让其为空指针,对其进行初始化,在visualstudio2013版中,如果不进行初始化,会被报错。

打印函数display:

voiddisplay(structnode*h)

{

structnode*p;//定义标记指针,输出链表

p=h;

while(p!

=NULL)

{

if(p->coef==0)

{

structnode*d;

d=h;

while(d->next!

=p)

{

d=d->next;

}

d->next=p->next;

p=p->next;//删去系数为0的节点;

}

else

{

if(p->coef<0)//系数为负时应加上括号,让式子容易看清;

{

if(p->exp==0)cout<<(*p).coef<<"+";

elsecout<<"("<<(*p).coef<<")"<<"*X^"<<(*p).exp<<"+";

}

else

{

if(p->exp==0)cout<<(*p).coef<<"+";

elseif(p->exp!

=0&&p->exp!

=1)

{

cout<<(*p).coef<<"*X^"<<(*p).exp<<"+";

}

elsecout<<(*p).coef<<"*X+";

}

p=p->next;

}

}

cout<<"\b\b\n";

}

PS:

打印函数display中,值得注意的是系数为负时,应该加括号。

其次,当指数为1时,没必要写成X^1这种形式。

系数为0的项也应该删去,这里我定义一个d指针,用来找到系数为0的项前一个结点的指针,然后进行删除该系数为0的节点的操作,其实和老师上课中的处理差不多,都是使用一个指针保护原有指针,用while循环找到系数为0的项的前驱,以便进行删除节点操作。

排序函数order:

structnode*order(structnode*h)//定义排序函数,并返回整理后的链表的头指针

{

structnode*p,*q,*t,*h1,*h2;//定义三个结构体标记指针和两个头指针

h1=h;//建立一个新的链表,头指针为h,指向原链表的第一个节点,之后将原链表中的节点一个一个的插入此链表,进行排序

h2=h1->next;//将原来的链表建立成待排序链表

h1->next=NULL;//截断第一个原链表中的节点

while(h2!

=NULL)

{

q=h1;

p=q->next;

t=h2;//从待排序链表中选出一个节点准备插入到新链表中

h2=h2->next;//移动待排序链表的头指针,便于进行下一次挑选

t->next=NULL;

if(t->exp>q->exp)//应插入头指针之前的情况

{

t->next=q;

h1=t;

continue;

}

if(p==NULL&&t->exp<=q->exp)q->next=t;//应插入表尾的情况

while(p!

=NULL)

{

if(t->exp>p->exp)

{

q->next=t;

t->next=p;

break;

}

else

{

q=q->next;

p=p->next;

}

}

if(p==NULL)q->next=t;

}

returnh1;//新链表即为按降幂顺序排好的链表,返回其头指针

}

Order函数其实是利用了3个头指针,具体操作看代码即可,其实很容易懂。

相加函数add:

structnode*add(structnode*h1,structnode*h2)//定义加法函数,并返回结果的链表的头指针

{

structnode*p,*q,*head,*r;//定义结构体头指针head和标记指针p,q,r

p=h1;

q=h2;

head=(structnode*)malloc(sizeof(chainLink));//为结果多项式分配头指针

if(p->exp>=q->exp){head=h1;p=p->next;}

else

{

if(p->expexp){head=h2;q=q->next;}

else{p->coef=p->coef+q->coef;head=p;p=p->next;q=q->next;}

}

r=head;

while(p!

=NULL&&q!

=NULL)

{

if(p->exp>q->exp){r->next=p;p=p->next;}

else

{

if(p->expexp){r->next=q;q=q->next;}

else{p->coef=p->coef+q->coef;r->next=p;p=p->next;q=q->next;}

}

r=r->next;

}

if(p==NULL&&q==NULL)r->next=NULL;

else

{

if(p==

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 人文社科 > 法律资料

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1