数据结构课程设计一元稀疏多项式计算器.docx

上传人:b****4 文档编号:5089082 上传时间:2022-12-13 格式:DOCX 页数:16 大小:99.96KB
下载 相关 举报
数据结构课程设计一元稀疏多项式计算器.docx_第1页
第1页 / 共16页
数据结构课程设计一元稀疏多项式计算器.docx_第2页
第2页 / 共16页
数据结构课程设计一元稀疏多项式计算器.docx_第3页
第3页 / 共16页
数据结构课程设计一元稀疏多项式计算器.docx_第4页
第4页 / 共16页
数据结构课程设计一元稀疏多项式计算器.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

数据结构课程设计一元稀疏多项式计算器.docx

《数据结构课程设计一元稀疏多项式计算器.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计一元稀疏多项式计算器.docx(16页珍藏版)》请在冰豆网上搜索。

数据结构课程设计一元稀疏多项式计算器.docx

数据结构课程设计一元稀疏多项式计算器

数据结构实验报告

——一元稀疏多项式计算器

安子烨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->expnexpn)&&(w->next->expn>q->expn))

{

q->next=w->next;

w->next=q;

break;

}

}

if(w->next==NULL)

{

if(w->expn==q->expn)w->coef+=q->coef;

elseif(w->expnexpn)w->next=q;

}

}

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->expnexpn)

{

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->expnexpn)

{

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->expnexpn)&&(w->next->expn>q->expn))

{

q->next=w->next;

w->next=q;

break;

}

}

if(w->expnnext=q;

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用法的不熟悉导致初次调试时出现大量错误,另外函数调用时传递参数经常出现错误,导致运行出现失误,最终使用二级指针才解决这个问题。

本次实验使用了不带头结点的单链表,且排序过程在创建函数中实现,这增大了操作难度,这也是实验艰难的原因之一。

通过本次实验,我发现会在纸上写算法与会上机编程之间存在巨大差异,在上机过程中意想不到的错误层出不穷,这些都是平时做作业时很难注意到的,因此要真正掌握数据结构,使之有实际作用,还应多上机编程,这是一个艰难的过程。

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

当前位置:首页 > 求职职场 > 简历

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

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