云南大学数据结构实验2Word下载.docx
《云南大学数据结构实验2Word下载.docx》由会员分享,可在线阅读,更多相关《云南大学数据结构实验2Word下载.docx(19页珍藏版)》请在冰豆网上搜索。
二、【实验设计(Design)】
(20%)
抽象数据类型的定义和基本操作说明,程序包含的模块以及各模块间的调用关系,关键算法伪码描述及程序流程图等,如有界面则需包括界面设计,功能说明等)
抽象数据类型的定义:
typedefstructNode{
floatxishu;
//定义系数为浮点数
intzhishu;
//定义指数为整型
structNode*Next;
}Node;
基本操作:
可对多项式进行排序输出,实现多项式的求导与加减运算
模块:
多项式排序:
voidinsertNewPoint_link(PNodehead,PNodeqNode)
{
while(项数不为1)
{
if(新项大于某一旧项指数){
插在前面;
退出;
}
elseif(等于某一旧项的指数){
计算合并后的系数;
if(s系数不为0)
附给新项;
else{
删去已有的项;
销毁结点;
}
指向下一个;
}
if(只有一项)
不排序退出;
}
多项式输出:
voidprintLinkeLink(PNodehead)
多项式求导:
voidder_poly(Node*pa)
指向头指针;
while(多项式不为空)
floatx=多项式指数乘以多项式系数;
floaty=多项式指数减1;
x附给指数;
y附给系数;
指针指向下一个;
多项式加法:
voidadd_poly(Node*pa,Node*pb)
指针指向多项式A、B的第一项;
while(项都不为空)
if(A项系数大于B项)
{
elseif(相同)
合并系数
if(系数不为0)
{
系数赋给多项式一中对应的项;
else
指向下一个结点;
释放销毁结点;
指针都指向下一个;
销毁B的这一项;
else
插入B的项;
多项式减法:
voidsub_poly(Node*pa,Node*pb)
同上
本程序所有模块皆只在主程序中调用
主程序流程图:
三、【实现(Implement)】
(30%)
抽象数据类型各操作的具体实现代码、关键操作的具体算法实现、函数实现,主程序实现等,并给出关键算法的时间复杂度分析。
如有界面则需包括界面的关键实现方法等。
)
多项式按照指数大小排序:
PNodep=head;
//向head为首的链表中插入qnode结点,由p从head处开始遍历
PNodeh=head;
PNodeq;
//用于销毁节点
while(p->
Next!
=NULL)//若已输入多项式不止一项
//若新项的指数比某一项p大则将新项插在该项前面
if(p->
Next->
zhishu<
qNode->
zhishu){
qNode->
Next=p->
Next;
p->
Next=qNode;
break;
//插完之后即可退出
elseif(p->
zhishu==qNode->
zhishu)
floatsum=p->
xishu+qNode->
xishu;
//计算合并后的系数
if(sum!
=0)//若合并后系数不为零
p->
xishu=sum;
//重新赋予p项新的系数
else//否则删去已有链表中的第一项
q=p->
free(q);
//销毁结点
q=NULL;
p=p->
//若新项指数小于p当前指向的项则p移至下一项与下一项进行比较
if(p->
Next==NULL)//若多项式只有一项则无需排序
p->
Node*p=pa->
Node*pre=pa;
//pre此刻指向多项式一的头指针,后续作为中间载体
while(p!
=NULL)
floatx=p->
xishu*p->
zhishu;
floaty=p->
zhishu-1;
xishu=x;
zhishu=y;
pre=p;
//pre指向p结点
p=pre->
Node*q=pb->
Node*u;
//u指针做临时指针,用于释放节点
=NULL&
&
q!
=NULL)//若指针指向的内容都不为空
zhishu>
q->
zhishu)//若多项式一中的项系数大于对应多项式二中的项
p=p->
zhishu==q->
zhishu)//若两项系数相等则合并同类项
xishu+q->
//x为合并后的系数
if(x!
=0)//若合并后系数不为零
//将合并后的系数赋给多项式一中对应的项
pre=p;
else//若合并后系数为零
pre->
//指向下一个结点
free(p);
//释放p销毁结点
u=q;
q=q->
free(u);
else//若多项式一中的项系数小于对应多项式二中的项
u=q->
q->
Next=p;
pre->
Next=q;
pre=q;
q=u;
if(q)
pre->
free(pb);
若n为最长多项式长度
则算法复杂度皆为O(n)
四、【测试结果(Testing)】
对实验的测试结果,应具体列出每次测试所输入的数据以及输出的数据,并对测试结果进行分析,可附截图)
求导:
加法:
减法:
五、【实验总结】
自己在实验中完成的任务,及存在的问题,所完成实验过程中的具体经验总结、心得)
这是第一次用双链表编写多项式运算器,感到使用抽象数的类型的线性表的方便之处,以后还会多多使用的,同时整个程序运行期间实行动态存储管理,释放了无用空间。
在执行一元多项式加减法的时候,把指针P->
next域搞乱,容易造成死循环。
创建一元多项式链表时,可能不是按照指数域的大小输入,故增加了排序,按指数域,对链表进行排序
六、思考题(10%)
(注:
选择C难度的才需要填写“项目运作描述”,其他难度的只需完成思考题)
(项目运作描述应包括:
项目的成本效益分析,应用效果等的分析。
顺序存储结构用一段连续的存储单元依次存储线性表的数据元素,需要预分配存储空间,分大了,容易造成空间浪费,分小了,容易发生溢出;
单链表采用链式存储结构,用一组任意的存储单元存放线性表的元素,不需要分配存储空间,只要有就可以分配,元素个数也不受限制。
在通常的应用中,多项式的次数可能很高且变化很大,使得顺序存储结构的最大长度很难确定。
由稀疏多项式的特点,故采用链式存储结构,可以不会带来浪费存储空间。
程序中单链表存储,根据链表的指数域,对链表进行排序,可给运算带来方便。
七、【代码】
完整的代码及充分的注释。
注意纸质的实验报告无需包括此部分。
格式统一为,字体:
Georgia,行距:
固定行距12,字号:
小五)
#include<
iostream>
stdlib.h>
//定义指数为整型
typedefstructNode*PNode;
//定义指针类型
//多项式按照指数大小排序
//输出多项式
PNodetemp=head->
printf("
%fX^%d"
temp->
xishu,temp->
zhishu);
temp=temp->
while(temp!
if(temp->
xishu>
0)//若为正系数
printf("
+%fX^%d"
elseif(temp->
xishu<
0)//若为负系数
temp=temp->
//多项式的求导计算
//多项式的加法计算
//多项式的减法计算
xishu-q->
//实现主函数
voidmain()
//定义变量系数和指数
PNodehead1=(PNode)malloc(sizeof(structNode));
PNodetem=NULL;
head1->
Next=NULL;
charch='
!
'
;
是否是要进行求导运算(Y/N):
"
);
while(ch=='
scanf("
\n%c"
&
ch);
if(ch!
='
Y'
&
ch!
N'
y'
n'
){
错误!
请重新输入:
ch='
//输入多项式一各项
输入链表一的系数和指数,如:
3,2(以0,0结束输入):
\n"
scanf("
%f,%d"
xishu,&
while(xishu!
=0)//当系数为零时停止输入
tem=(PNode)malloc(sizeof(structNode));
//往链表中插入新的项
tem->
xishu=xishu;
zhishu=zhishu;
insertNewPoint_link(head1,tem);
//插入新结点
//输入下一项
多项式一为:
printLinkeLink(head1);
//输出多项式一
if(ch=='
||ch=='
der_poly(head1);
printf("
\n多项式求导后的结果为:
else{
PNodehead2=(PNode)malloc(sizeof(structNode));
head2->
//输入多项式二各项
\n输入链表二的系数和指数,如:
while(xishu!
tem=(PNode)malloc(sizeof(structNode));
tem->
insertNewPoint_link(head2,tem);
scanf("
多项式二为:
printLinkeLink(head2);
ch='
\n输入你想要的操作(+-):
while(ch=='
if(ch=='
+'
sub_poly(head1,head2);
printf("
\n多项式相加后的结果为:
elseif(ch=='
-'
\n多项式相减后的结果为:
else{
ch='
//输出多项式的结果
\n\n"
system("
pause"