数据结构上机实习报告.docx
- 文档编号:6085051
- 上传时间:2023-01-03
- 格式:DOCX
- 页数:18
- 大小:149.26KB
数据结构上机实习报告.docx
《数据结构上机实习报告.docx》由会员分享,可在线阅读,更多相关《数据结构上机实习报告.docx(18页珍藏版)》请在冰豆网上搜索。
数据结构上机实习报告
一、选题:
设计和实现多项式运算
二、需求分析:
1、实现带头结点的单循环链表表示的多项式,即用带头结点的链表存储多项式的系数和指数。
2、设计和实现多项式相加和相乘运算算法。
3、设计一个测试程序:
测试多项式加法和乘法运算。
要求:
Ø建立一个多项式
Ø打印(显示)一个多项式
Ø实现两个多项式相加;
Ø实现两个多项式相乘。
三、概要设计:
程序采用顺序表的存储结构。
1、运用头插法创建多项式:
先创建两个结构体,用Linklisthead=(Linklist)malloc(sizeof(LNode));语句,创建一个链表的头结点,在定义两个节点指针,一个指向头结点,一个用来分配新的存储空间,将输入的数据存入新节点中,在将新节点一个一个依次连接到头结点后。
并以多项式的项数作为多项式的输出:
将p指针指向头结点,再用p=p->next;将p指针向下移,再用p->next!
=NULL作为while()语句的结束条件,如果p->data.expn==0,则只输出系数,如果p->data.coef>0,则输出“+系数*X^指数”,如果p->data.coef<0,则输出“系数*X^指数”,则算法结束。
2、比较两个指数的大小:
如果L1->data.expn==L2->data.expn,返回1,如果L1->data.expn>L2->data.expn,返回-1,如果L1->data.expn
3、两多项式相加:
定义一个新的链表,将相加后的多项式存入新的链表中,用while()语句循环将两个链表的每一项进行相加,并以pb&&pc作结束条件,将指数相等的项的系数相加,指数不变存入新的结点中;当pb->data.expn〈pc->data.expn时,将pc的数据域存入新结点中,并将pc的指针后移;当pb->data.expn>pc->data.expn时,将pb的数据域存入新结点中,并将pb的指针后移。
若pc中的项多,将pc中剩下的项接到新的链表中,若pb中的项多,将pb中剩下的项接到新的链表中。
4、两多项式相乘:
定义结点指针p,t,s,pt,pb,pc,L3,pa,并让pb=L1->next;pa=L4;pa->next=NULL;L3=L4。
创建一个新的链表L4,将所乘后的值存入L4中。
运用while()的嵌套循环,将两多项式中的每一项分别进行相乘,两个while()语句分别以pb,pc作为结束条件,再用一个while()嵌套循环语句,分别以L3->next!
=NULL和t作为结束条件,。
实现合并同类项,并将合并后多余的项删除。
让pt始终指向t所指向的节点的前一个结点,如果t->data.expn==s->data.expn,则将这两项的系数相加后存入s所指向的节点中。
并删除t所指向的结点。
如果两项的系数之和为0,则将s和t所指向的结点均删除。
在返回链表L4。
5、主函数:
定义三个链表head,L1,L2,分别调用函数。
创建多项式流程图
输出算法流程图
比较两指数大小流程图
两多项式相加流程图
四、详细设计:
1、运用头插法创建多项式
LinklistCreatPolyn(void)
{
floatcoe;
intexp,number,i;
Linklisthead=(Linklist)malloc(sizeof(LNode));//创建头结点
LNode*r,*s;
r=head;
r->next=NULL;
printf("请输入多项式的项数\n");
scanf("%d",&number);
printf("请输入多项式的系数和指数\n");
printf("请输入形式为:
系数指数系数指数...,如52-26\n");
for(i=1;i<=number;i++)
{
scanf("%f",&coe);
scanf("%d",&exp);
if(coe!
=0){
s=(LNode*)malloc(sizeof(LNode));
s->data.coef=coe;
s->data.expn=exp;
s->next=r->next;
r->next=s;
}
}
returnhead;
}//创建多项式
2、输出多项式、
voidDisplayPolyn(Linklisthead){
LNode*p;
p=head;
while(p->next!
=NULL){
p=p->next;
if(p->data.expn==0)
{if(p->data.coef>0)
printf("+%f",p->data.coef,p->data.expn);
else
printf("%f",p->data.coef,p->data.expn);
}
else
{if(p->data.coef>0)
printf("+%f*X^%d",p->data.coef,p->data.expn);
else
printf("%f*X^%d",p->data.coef,p->data.expn);
}
}
printf("\n");
}//打印出多项式
3、比较两个多项式指数的大小、
intComparePolyn(LinklistL1,LinklistL2)
{
if(L1->data.expn==L2->data.expn)
return1;
if(L1->data.expn>L2->data.expn)
return-1;
else
return0;
}
4、.两个多项式相加
LinklistAddPolyn(LinklistL1,LinklistL2)
{
floatpa;
LinklistL3=(Linklist)malloc(sizeof(LNode));
LNode*pb;
LNode*pc;
LNode*s,*r;
r=L3;
r->next=NULL;
pb=L1->next;
pc=L2->next;
while(pb&&pc)
{
s=(LNode*)malloc(sizeof(LNode));
switch(ComparePolyn(pb,pc))
{
case1:
pa=pb->data.coef+pc->data.coef;
if(pa==0)break;
else
{
s->data.expn=pb->data.expn;
s->data.coef=pa;
}
pb=pb->next;
pc=pc->next;
break;//将指数相等的项的系数相加,指数不变存入新的结点中
case0:
s->data.coef=pc->data.coef;
s->data.expn=pc->data.expn;
pc=pc->next;
break;//当pb->data.expn〈pc->data.expn时,将pc的数据域存入新结点中,并将pc的指针后移
case-1:
s->data.coef=pb->data.coef;
s->data.expn=pb->data.expn;
pb=pb->next;
break;//当pb->data.expn>pc->data.expn时,将pb的数据域存入新结点中,并将pb的指针后移
}
s->next=r->next;
r->next=s;
}
if(!
pb)
while(pc)
{
s=(LNode*)malloc(sizeof(LNode));
s->data.coef=pc->data.coef;
s->data.expn=pc->data.expn;
s->next=r->next;
r->next=s;
pc=pc->next;
}//若pc中的项多,将pc中剩下的项接到新的链表中
if(!
pc)
while(pb)
{
s=(LNode*)malloc(sizeof(LNode));
s->data.coef=pb->data.coef;
s->data.expn=pb->data.expn;
s->next=r->next;
r->next=s;
pb=pb->next;
}//若pb中的项多,将pb中剩下的项接到新的链表中
returnL3;
}//两多项式相加
6、.两个多项式相乘、
LinklistSLPolyn(LinklistL1,LinklistL2)
{
LinklistL4=(Linklist)malloc(sizeof(LNode));
LNode*p,*t,*s,*pt,*pb,*pc,*L3,*pa;
floatnum;
pb=L1->next;
pa=L4;
pa->next=NULL;
L3=L4;
while(pb)
{
pc=L2->next;
while(pc)
{
p=(LNode*)malloc(sizeof(LNode));
p->data.coef=pb->data.coef*pc->data.coef;
p->data.expn=pb->data.expn+pc->data.expn;
p->next=pa->next;
pa->next=p;
pc=pc->next;
}
pb=pb->next;
}//将两多项式中的每一项分别相乘
while(L3->next!
=NULL)
{
s=L3->next;
t=s->next;
pt=s;
while(t)
{
if(t->data.expn==s->data.expn)
{
num=t->data.coef+s->data.coef;
if(num!
=0)
s->data.coef=num;
else
L3->next=s->next;
pt->next=t->next;
}
t=t->next;
pt=pt->next;
}
L3=L3->next;
}//合并同类项,并将合并后多余的项删除
returnL4;
}//多项式相乘
五、调试分析:
测试数据:
多项式个数:
2系数和指数:
3041多项式个数:
3系数和指数:
314253
时间复杂度为:
设两个多项式中项数大的一个为n,则时间复杂度为O(n*n)。
测试结果:
六、实习总结:
在实习中,更熟悉了数据结构在程序中的运用,对久未运用的编程语言也复习了一遍。
对链表中指针的运用,更加熟悉,特别是在循环中循环的截止条件很够更好的做出选择。
对头节点的建立,和建立一个单循环链表也能顺利的运用。
也能够运用调试去寻找在程序遇到的问题。
刚开始时,一遇到while()语句中,循环的结束条件时,全都运用错了,因此造成只能输入一个多项式,开始一直以为是输出函数有问题,在调试时,也只能进行到分配节点空间的地方,就出错了。
但又找不出,不知从何下手。
后来在老师的指导下,找出了在循环中,结束条件的问题。
而且程序中的指针运用很混乱。
需要进行修改。
数据结构是通过将具体问题抽象成一个数学模型,再用算法来解决此数学模型。
数据结构将问题简单化,也将数据进行统一的管理,使程序简单化,也能实现更多的功能。
数据结构还能,节省存储空间,一个好的程序离不开数据结构。
我们对数据结构这门课的学习是远远不够的,还需要在以后更多的进行学习。
现在我们写出的程序的时间复杂度很高,也占用了很多的存储空间,需要更多的练习才能找出更好的算法,从而达到数据结构的真正功能。
附录:
源程序:
#include
#include
typedefstruct{
floatcoef;//多项式的系数
intexpn;//多项式的指数
}term;
typedefstructNode{
termdata;
structNode*next;
}LNode,*Linklist;
/*.............运用头插法创建多项式..............*/
LinklistCreatPolyn(void)
{
floatcoe;
intexp,number,i;
Linklisthead=(Linklist)malloc(sizeof(LNode));//创建头结点
LNode*r,*s;
r=head;
r->next=NULL;
printf("请输入多项式的项数\n");
scanf("%d",&number);
printf("请输入多项式的系数和指数\n");
printf("请输入形式为:
系数指数系数指数...,如52-26\n");
for(i=1;i<=number;i++)
{
scanf("%f",&coe);
scanf("%d",&exp);
if(coe!
=0){
s=(LNode*)malloc(sizeof(LNode));
s->data.coef=coe;
s->data.expn=exp;
s->next=r->next;
r->next=s;
}
}
returnhead;
}//创建多项式
/*.............输出多项式.............*/
voidDisplayPolyn(Linklisthead){
LNode*p;
p=head;
while(p->next!
=NULL){
p=p->next;
if(p->data.expn==0)
{if(p->data.coef>0)
printf("+%f",p->data.coef,p->data.expn);
else
printf("%f",p->data.coef,p->data.expn);
}
else
{if(p->data.coef>0)
printf("+%f*X^%d",p->data.coef,p->data.expn);
else
printf("%f*X^%d",p->data.coef,p->data.expn);
}
}
printf("\n");
}//打印出多项式
/*.............比较两个多项式指数的大小.............*/
intComparePolyn(LinklistL1,LinklistL2)
{
if(L1->data.expn==L2->data.expn)
return1;
if(L1->data.expn>L2->data.expn)
return-1;
else
return0;
}
/*.............两个多项式相加.............*/
LinklistAddPolyn(LinklistL1,LinklistL2)
{
floatpa;
LinklistL3=(Linklist)malloc(sizeof(LNode));
LNode*pb;
LNode*pc;
LNode*s,*r;
r=L3;
r->next=NULL;
pb=L1->next;
pc=L2->next;
while(pb&&pc)
{
s=(LNode*)malloc(sizeof(LNode));
switch(ComparePolyn(pb,pc))
{
case1:
pa=pb->data.coef+pc->data.coef;
if(pa==0)break;
else
{
s->data.expn=pb->data.expn;
s->data.coef=pa;
}
pb=pb->next;
pc=pc->next;
break;//将指数相等的项的系数相加,指数不变存入新的结点中
case0:
s->data.coef=pc->data.coef;
s->data.expn=pc->data.expn;
pc=pc->next;
break;//当pb->data.expn〈pc->data.expn时,将pc的数据域存入新结点中,并将pc的指针后移
case-1:
s->data.coef=pb->data.coef;
s->data.expn=pb->data.expn;
pb=pb->next;
break;//当pb->data.expn>pc->data.expn时,将pb的数据域存入新结点中,并将pb的指针后移
}
s->next=r->next;
r->next=s;
}
if(!
pb)
while(pc)
{
s=(LNode*)malloc(sizeof(LNode));
s->data.coef=pc->data.coef;
s->data.expn=pc->data.expn;
s->next=r->next;
r->next=s;
pc=pc->next;
}//若pc中的项多,将pc中剩下的项接到新的链表中
if(!
pc)
while(pb)
{
s=(LNode*)malloc(sizeof(LNode));
s->data.coef=pb->data.coef;
s->data.expn=pb->data.expn;
s->next=r->next;
r->next=s;
pb=pb->next;
}//若pb中的项多,将pb中剩下的项接到新的链表中
returnL3;
}//两多项式相加
/*.............两个多项式相乘.............*/
LinklistSLPolyn(LinklistL1,LinklistL2)
{
LinklistL4=(Linklist)malloc(sizeof(LNode));
LNode*p,*t,*s,*pt,*pb,*pc,*L3,*pa;
floatnum;
pb=L1->next;
pa=L4;
pa->next=NULL;
L3=L4;
while(pb)
{
pc=L2->next;
while(pc)
{
p=(LNode*)malloc(sizeof(LNode));
p->data.coef=pb->data.coef*pc->data.coef;
p->data.expn=pb->data.expn+pc->data.expn;
p->next=pa->next;
pa->next=p;
pc=pc->next;
}
pb=pb->next;
}//将两多项式中的每一项分别相乘
while(L3->next!
=NULL)
{
s=L3->next;
t=s->next;
pt=s;
while(t)
{
if(t->data.expn==s->data.expn)
{
num=t->data.coef+s->data.coef;
if(num!
=0)
s->data.coef=num;
else
L3->next=s->next;
pt->next=t->next;
}
t=t->next;
pt=pt->next;
}
L3=L3->next;
}//合并同类项,并将合并后多余的项删除
returnL4;
}//多项式相乘
voidmain()
{
Linklisthead,T1,T2;
T1=CreatPolyn();
printf("输出多项式为:
\n");
DisplayPolyn(T1);
T2=CreatPolyn();
printf("输出多项式为:
\n");
DisplayPolyn(T2);
head=AddPolyn(T1,T2);
printf("输出多项式的和多项式为:
\n");
DisplayPolyn(head);
head=SLPolyn(T1,T2);
printf("输出多项式的乘积多项式为:
\n");
DisplayPolyn(head);
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 上机 实习 报告