数据结构课程设计一元稀疏多项式计算器.docx
- 文档编号:5089082
- 上传时间:2022-12-13
- 格式:DOCX
- 页数:16
- 大小:99.96KB
数据结构课程设计一元稀疏多项式计算器.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文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 课程设计 一元 稀疏 多项式 计算器