数据结构课程方案一元稀疏多项式计算器.docx
- 文档编号:11064648
- 上传时间:2023-02-24
- 格式:DOCX
- 页数:16
- 大小:100.45KB
数据结构课程方案一元稀疏多项式计算器.docx
《数据结构课程方案一元稀疏多项式计算器.docx》由会员分享,可在线阅读,更多相关《数据结构课程方案一元稀疏多项式计算器.docx(16页珍藏版)》请在冰豆网上搜索。
数据结构课程方案一元稀疏多项式计算器
数据结构实验报告
——一元稀疏多项式计算器
安子烨PB12203079
实验目的
实现一元多项式的简单运算功能,掌握线性表的知识,提高编程能力。
功能清单
1.一元多项式创建
2.显示一元多项式
3.复制一元多项式
4.多项式加法
5.多项式减法
6.修改一元多项式
7.删除一元多项式
8.销毁记录
实验设计
该多项式计算器以菜单驱动的形式实现上述各运算功能。
最多可支持十条记录,分别用指针数组引导存储于十个不同的位置。
以下为程序的部分源代码。
#include
#include
#include
typedefstructLinkList{
doublecoef。
intexpn。
LinkList*next。
}LNode。
voidCreatPolyn(LinkList**h>//创建多项式
{
LinkList*q=NULL,*w=NULL,*p=NULL。
doublem=0。
intn=0。
(*h>=(LinkList*>malloc(sizeof(LinkList>>。
(*h>->coef=0。
(*h>->expn=0。
(*h>->next=NULL。
printf("请输入X的系数和指数,当系数为零时结束创建\n">。
scanf("%lf%d",&m,&n>。
while(m!
=0>
{
q=(LinkList*>malloc(sizeof(LinkList>>。
q->coef=m。
q->expn=n。
q->next=NULL。
if((*h>->next==NULL>
{
if(q->expn==(*h>->expn>(*h>->coef+=q->coef。
elseif((*h>->expn>q->expn>{q->next=(*h>。
*h=q。
}
else(*h>->next=q。
}
else
{
for(w=(*h>。
w->next!
=NULL。
w=w->next>
{
if(q->expn==w->expn>
{
w->coef+=q->coef。
break。
}
elseif((w->expn>q->expn>&&(w==*h>>
{
q->next=(*h>。
(*h>=q。
break。
}
elseif((w->expn
{
q->next=w->next。
w->next=q。
break。
}
}
if(w->next==NULL>
{
if(w->expn==q->expn>w->coef+=q->coef。
elseif(w->expn
}
}
printf("请输入X的系数和指数,当系数为零时结束创建\n">。
scanf("%lf%d",&m,&n>。
}
}
voidPrintPolyn(LinkList*p,inti>//打印多项式
{
printf("第%d个多项式是:
",i>。
while(p!
=NULL>
{
if((p->coef>>0>printf("+%lf*X^%d",p->coef,p->expn>。
elseif((p->coef><0>printf("%lf*X^%d",p->coef,p->expn>。
p=p->next。
}
printf("\n">。
}
voidCopyPolyn(LinkList**M,LinkList**N>//多项式复制
{
LinkList*p=NULL,*q=NULL,*w=NULL。
(*N>=(LinkList*>malloc(sizeof(LinkList>>。
(*N>->coef=(*M>->coef。
(*N>->expn=(*M>->expn。
(*N>->next=NULL。
for(w=(*N>,p=(*M>->next。
p!
=NULL。
p=p->next>
{
q=(LinkList*>malloc(sizeof(LinkList>>。
q->coef=p->coef。
q->expn=p->expn。
q->next=p->next。
w->next=q。
w=w->next。
}
}
voidAddPolyn(LinkList*M,LinkList*N,LinkList**X>//多项式加法
{
LinkList*p=NULL,*q=NULL,*w=NULL,*z=NULL。
(*X>=(LinkList*>malloc(sizeof(LinkList>>。
(*X>->coef=0。
(*X>->expn=0。
(*X>->next=NULL。
for(p=M,q=N,w=(*X>。
(p!
=NULL>&&(q!
=NULL>。
>
{
z=(LinkList*>malloc(sizeof(LinkList>>。
if(p->expn
{
z->coef=p->coef。
z->expn=p->expn。
z->next=NULL。
p=p->next。
w->next=z。
w=w->next。
}
elseif(p->expn>q->expn>
{
z->coef=q->coef。
z->expn=q->expn。
z->next=NULL。
q=q->next。
w->next=z。
w=w->next。
}
elseif(p->expn==q->expn>
{
z->coef=p->coef+q->coef。
z->expn=p->expn。
z->next=NULL。
p=p->next。
q=q->next。
w->next=z。
w=w->next。
}
}
if(p==NULL>
{
for(。
q!
=NULL。
>
{
z=(LinkList*>malloc(sizeof(LinkList>>。
z->coef=q->coef。
z->expn=q->expn。
z->next=NULL。
q=q->next。
w->next=z。
w=w->next。
}
}
elseif(q==NULL>
{
for(。
p!
=NULL。
>
{
z=(LinkList*>malloc(sizeof(LinkList>>。
z->coef=p->coef。
z->expn=p->expn。
z->next=NULL。
p=p->next。
w->next=z。
w=w->next。
}
}
for(w=(*X>。
w!
=NULL。
w=w->next>
{
printf("%lf%d\n",w->coef,w->expn>。
}
}
voidSubtractPolyn(LinkList*M,LinkList*N,LinkList**X>//多项式减法
{
LinkList*p=NULL,*q=NULL,*w=NULL,*z=NULL。
(*X>=(LinkList*>malloc(sizeof(LinkList>>。
(*X>->coef=0。
(*X>->expn=0。
(*X>->next=NULL。
for(p=M,q=N,w=(*X>。
(p!
=NULL>&&(q!
=NULL>。
>
{
z=(LinkList*>malloc(sizeof(LinkList>>。
if(p->expn
{
z->coef=p->coef。
z->expn=p->expn。
z->next=NULL。
p=p->next。
w->next=z。
w=w->next。
}
elseif(p->expn>q->expn>
{
z->coef=-q->coef。
z->expn=q->expn。
z->next=NULL。
q=q->next。
w->next=z。
w=w->next。
}
elseif(p->expn==q->expn>
{
z->coef=p->coef-q->coef。
z->expn=p->expn。
z->next=NULL。
p=p->next。
q=q->next。
w->next=z。
w=w->next。
}
}
if(p==NULL>
{
for(。
q!
=NULL。
>
{
z=(LinkList*>malloc(sizeof(LinkList>>。
z->coef=-q->coef。
z->expn=q->expn。
z->next=NULL。
q=q->next。
w->next=z。
w=w->next。
}
}
elseif(q==NULL>
{
for(。
p!
=NULL。
>
{
z=(LinkList*>malloc(sizeof(LinkList>>。
z->coef=p->coef。
z->expn=p->expn。
z->next=NULL。
p=p->next。
w->next=z。
w=w->next。
}
}
/*for(w=(*X>。
w!
=NULL。
w=w->next>
{
printf("%lf%d\n",w->coef,w->expn>。
}*/
}
voidValuePolyn(LinkList*h,doublex>//多项式求值
{
doublesum=0,a=0。
while(h!
=NULL>
{
a=pow(x,h->expn>。
sum=sum+(h->coef>*a。
h=h->next。
}
printf("所求多项式的值为%lf\n",sum>。
}
voidDeletePolyn(LinkList**h>
{
LinkList*p=(*h>->next。
(*h>=NULL。
while(p!
=NULL>
{
free(*h>。
(*h>=p。
p=p->next。
}
}
voidRevisePolyn(LinkList**h,inti>
{
intn=0。
intchoose=0。
doublem=0。
LinkList*q=NULL,*w=NULL。
PrintPolyn((*h>,i>。
printf("请输入你想执行的操作代号<添加:
1;修改:
2;删除:
3)\n">。
scanf("%d",&choose>。
switch(choose>
{
case1:
{
printf("输入你想要添加项的系数和次数\n">。
scanf("%lf%d",&m,&n>。
q=(LinkList*>malloc(sizeof(LinkList>>。
q->coef=m。
q->expn=n。
q->next=NULL。
for(w=(*h>。
w->next!
=NULL。
w=w->next>
{
if((w->expn>q->expn>&&(w==*h>>
{
q->next=(*h>。
(*h>=q。
break。
}
elseif((w->expn
{
q->next=w->next。
w->next=q。
break。
}
}
if(w->expn
break。
}
case2:
{
printf("输入你想要修改项的系数和次数\n">。
scanf("%lf%d",&m,&n>。
for(w=(*h>。
w!
=NULL。
w=w->next>
{
if(w->expn==n>w->coef=m。
}
printf("未找到该项。
\n">。
break。
}
case3:
{
printf("输入你想要删除项的次数\n">。
scanf("%d",&n>。
for(w=(*h>。
w!
=NULL。
w=w->next>
{
if(w->expn==n>w->coef=0。
}
break。
}
default:
printf("输入错误,修改失败\n">。
}
}
voidmain(>
{
/*inti=n=N1=N2=0。
*/
LinkList*p[10]={0,0,0,0,0,0,0,0,0,0}。
inti=0,j=0,k=0。
intchoose=0。
doublem=0,x=0。
printf("请输入\n">。
printf("菜单:
\n">。
printf("1创建多项式\n">。
printf("2显示多项式\n">。
printf("3复制多项式\n">。
printf("4多项式求和\n">。
printf("5多项式求差\n">。
printf("6多项式求值\n">。
printf("7销毁多项式\n">。
printf("8清空所有多项式\n">。
printf("9修改<添加、删除、更改系数、指数)\n">。
printf("0退出计算器\n">。
start:
printf("请输入序号进行功能选择\n">。
scanf("%d",&choose>。
while(choose!
=0>
{
switch(choose>
{
case1:
{
printf("请输入你想创建多项式的位置(0~9>\n">。
scanf("%d",&i>。
CreatPolyn(&p[i]>。
gotostart。
}
case2:
{
for(i=0。
i<=9。
i++>PrintPolyn(p[i],i>。
gotostart。
}
case3:
{
printf("请输入要复制的多项式的号码和目的地号码\n">。
scanf("%d%d",&i,&j>。
CopyPolyn(&p[i],&p[j]>。
gotostart。
}
case4:
{
printf("请输入要求和的两个多项式的号码以及存放结果的号码\n">。
scanf("%d%d%d",&i,&j,&k>。
AddPolyn(p[i],p[j],&p[k]>。
gotostart。
}
case5:
{
printf("请输入要求差的两个多项式的号码以及存放结果的号码\n">。
scanf("%d%d%d",&i,&j,&k>。
SubtractPolyn(p[i],p[j],&p[k]>。
gotostart。
}
case6:
{
printf("请输入你想求值的多项式的位置(0~9>\n">。
scanf("%d",&i>。
printf("请输入你想要的X值\n">。
scanf("%lf",&x>。
ValuePolyn(p[i],x>。
gotostart。
}
case7:
{
printf("请输入你想销毁的多项式的位置(0~9>\n">。
scanf("%d",&i>。
DeletePolyn(&p[i]>。
gotostart。
}
case8:
{
for(i=0。
i<=9。
i++>
{
DeletePolyn(&p[i]>。
}
gotostart。
}
case9:
{
printf("请输入你想要修改的多项式的号码\n">。
scanf("%d",&i>。
RevisePolyn(&p[i],i>。
gotostart。
}
case0:
break。
default:
{
printf("请输入\n">。
printf("菜单:
\n">。
printf("1创建多项式\n">。
printf("2显示多项式\n">。
printf("3复制多项式\n">。
printf("4多项式求和\n">。
printf("5多项式求差\n">。
printf("6多项式求值\n">。
printf("7销毁多项式\n">。
printf("8清空所有多项式\n">。
printf("9修改<添加、删除、该系数指数)\n">。
printf("0退出计算器\n">。
printf("请输入序号进行功能选择\n">。
scanf("%d",&choose>。
}
}
}
}
测试结果
实验小结
此次实验完成十分艰难,首先是对typedef用法的不熟悉导致初次调试时出现大量错误,另外函数调用时传递参数经常出现错误,导致运行出现失误,最终使用二级指针才解决这个问题。
本次实验使用了不带头结点的单链表,且排序过程在创建函数中实现,这增大了操作难度,这也是实验艰难的原因之一。
通过本次实验,我发现会在纸上写算法与会上机编程之间存在巨大差异,在上机过程中意想不到的错误层出不穷,这些都是平时做作业时很难注意到的,因此要真正掌握数据结构,使之有实际作用,还应多上机编程,这是一个艰难的过程。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 课程 方案 一元 稀疏 多项式 计算器