数据结构多项式运算器实验报告Word文档下载推荐.docx
《数据结构多项式运算器实验报告Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《数据结构多项式运算器实验报告Word文档下载推荐.docx(20页珍藏版)》请在冰点文库上搜索。
![数据结构多项式运算器实验报告Word文档下载推荐.docx](https://file1.bingdoc.com/fileroot1/2023-5/5/288d4524-1b81-4dd8-9b62-dcdec73c5d4c/288d4524-1b81-4dd8-9b62-dcdec73c5d4c1.gif)
L.len=0;
}//InitList
voidDestroyList(LinkList&
Linkp,q;
p=L.head->
next;
while(p){
q=p->
free(p);
p=q;
}
L.tail=L.head;
}//DestroyList
voidInsLast(LinkList&
L,Links){
L.tail->
next=s;
L.tail=s;
L.len++;
}//InsLast
/*====================多项式-ADT====================*/
voidCreatPolyn(LinkList&
terme;
Links;
scanf("
%f,%d"
&
e.coef,&
e.expn);
while(e.coef){
MakeNode(s,e);
InsLast(L,s);
scanf("
}//CreatPolyn
创建比较简单,主要调用了MakeNode()、InsLast()两个函数。
intJudge(intn){
if(n>
19||n<
0){
printf("
存储位置选择错误!
请重新选择0-19.\n"
);
return1;
else
return0;
}//Judge
本来打算用这个函数来检查选择的存储位置是否越界,但操作起来有点困难,最后还是放弃了。
voidPrintPolyn(LinkListL){
Linkp;
p)
NULL\n"
else{
y="
if(p->
data.coef>
if(p->
data.expn==0)
printf("
%f"
p->
data.coef);
else
%fx^%d"
data.coef,p->
data.expn);
p=p->
}
else{
if(p->
printf("
+%f"
+%fx^%d"
}
next)
p=p->
\n"
}//PrintPolyn
PrintPolyn()这个函数费了点事。
主要是要考虑的情况有点多,所以函数就变长了。
先考虑是否非空,还要考虑系数的正负,是否打印加号,而且第一项如果是正的不用打印加号,还要考虑是否越界。
总之就是很复杂了。
voidPrintAll(LinkListS[]){
inti;
for(i=0;
i<
20;
i++){
%d."
i);
PrintPolyn(S[i]);
}//PrintAll
全部打印,来查看存储状态。
还是很有用的。
voidCopyPolyn(LinkListL,LinkList&
S){
Links,p;
e.coef=p->
data.coef;
e.expn=p->
data.expn;
InsLast(S,s);
p=p->
S.tail->
}//CopyPolyn
比较简单,还是调用了MakeNode()、InsLast()两个函数,与创建差不多。
intAddPolyn(LinkList&
L,LinkListP,LinkListQ){
Linka,b,c;
a=P.head->
b=Q.head->
while((a!
=NULL)&
&
(b!
=NULL)){
if(a->
data.expn<
b->
data.expn){
e.coef=a->
e.expn=a->
MakeNode(c,e);
InsLast(L,c);
a=a->
elseif(a->
data.expn>
e.coef=b->
e.expn=b->
b=b->
elseif((a->
data.coef+b->
data.coef)!
=0){
e.coef=a->
InsLast(L,c);
b=b->
elseif((a->
data.coef)==0){
a=a->
a&
!
b){
L.tail->
while(a){
a){
while(b){
e.coef=b->
return0;
}//AddPolyn
主要是分情况讨论,a、b都非空、都空,一空。
还要考虑系数相加为零时的情况。
这个开始时没有成功,当一空一非空时运行不下去,但也检查不出错误来,放到最后,我把while里面的并列的if改成if、elseif,elseif,elseif就成功了,有点想不通。
voidSubtractPolyn(LinkList&
p=Q.head->
p->
data.coef=0-p->
AddPolyn(L,P,Q);
}//SubtractPolyn
有求和了求差就简单了。
先讲一个的系数变成原来的相反数,再相加,再把它变回来。
开始时忘记了p=Q.head->
next,出了点错误。
doubleResultPolyn(LinkListL,floatx){
doubley=0;
y+=(pow(x,p->
data.expn)*p->
returny;
}//ResultPolyn
这个比较简单,不多说了。
voidMultiplyPolyn(LinkList&
Linkl,p,q;
LinkListE,F;
InitList(E);
InitList(F);
inti,j;
p=P.head->
q=Q.head->
Q.len;
for(j=0;
j<
P.len;
j++){
e.coef=p->
data.coef*q->
e.expn=p->
data.expn+q->
MakeNode(l,e);
InsLast(E,l);
AddPolyn(L,E,F);
DestroyList(E);
DestroyList(F);
CopyPolyn(L,F);
if(i!
=Q.len-1)
DestroyList(L);
q=q->
p=P.head->
}//MultiplyPolyn
这个我想的方法是创建两个临时的多项式,拿求积的一个多项式的项一次去乘另一个的项。
结果存在一个临时多项式E,将初始的L复制给F,然后E与F相加复制给L,L再赋值给F,销毁E、L。
不断销毁赋值最后完成。
注意最后一次不要销毁L。
voidPolyn_NFang(LinkList&
L,LinkListP,intn){
LinkListE;
CopyPolyn(P,E);
n;
MultiplyPolyn(L,E,P);
CopyPolyn(L,E);
=n-1)
}//Polyn_Nfang
这个也需要一个临时的多项式,还是不段销毁赋值。
有了求积的基础,这个就简单了。
voidPolyn_NDao(LinkList&
CopyPolyn(P,L);
p=L.head->
q=L.head;
L.len;
data.expn==0){
q->
next=p->
free(p);
p=q->
L.len--;
p->
data.coef=p->
data.coef*p->
data.expn=p->
data.expn-1;
q=q->
}//Polyn_Ndao
这个比较简单,就是对系数和指数的更改。
intPolyn_Ji(LinkList&
L,LinkListP){
data.expn==-1){
printf("
对不起,本程序不能实现对-1次方的积分.请重新选择.\n"
DestroyList(L);
return0;
else
data.coef/(p->
data.expn+1);
++p->
}
}//Polyn_Ji
这个还是对系数和指数的更改,主要如果是-1次方积分出现ln(),这就麻烦了。
故此,对含-1次方的多项式不进行积分。
doublePolyn_Ding(LinkListL,floata,floatb){
doublem,n;
doublee=0;
LinkListP;
InitList(P);
Polyn_Ji(P,L);
m=ResultPolyn(P,a);
n=ResultPolyn(P,b);
e=n-m;
returne;
}//Polyn_Ding
这个很简单,主要调用Polyn_Ji()和ResultPolyn()。
/*====================main====================*/
voidmain(){
intn,m,i,a,b,c;
floatx,e,f;
doubled;
LinkListS[20];
i++)
InitList(S[i]);
printf("
说明:
共有二十个多项式备用位置:
0~19。
\n菜单:
\n0\t退出\n1\t创建多项式\n2\t显示多项式\n3\t复制多项式\n4\t多项式求和\n5\t多项式求差\n6\t多项式求积\n7\t多项式n次方\n8\t多项式n阶导\n9\t多项式不定积分\n10\t多项式定积分\n11\t多项式求值\n12\t多项式项数\n13\t销毁多项式\n14\t查看存储状态\n"
请输入命令:
"
%d"
n);
while(n){
if(n>
16||n<
0)
输入命令错误!
请重新输入.\n"
switch(n){
case1:
1.请选择位置:
scanf("
m);
while(S[m].head->
next){
已占用!
请重新选择存储位置:
scanf("
CreatPolyn(S[m]);
break;
case2:
2.请选择位置:
PrintPolyn(S[m]);
case3:
3.请选择要复制的多项式的位置和复制到的位置:
%d,%d"
a,&
b);
while(S[b].head->
CopyPolyn(S[a],S[b]);
case4:
4.请输入需要求和的两个多项式位置及和放置的位置:
%d,%d,%d"
b,&
c);
while(S[c].head->
AddPolyn(S[c],S[a],S[b]);
case5:
5.请输入需要求差的两个多项式位置及差放置的位置:
SubtractPolyn(S[c],S[a],S[b]);
case6:
6.请输入需要相乘的两个多项式及存储位置:
if(!
S[a].head->
next||!
S[b].head->
多项式位置选择错误!
请重新选择.\n"
break;
MultiplyPolyn(S[c],S[a],S[b]);
case7:
7.请输入多项式的位置,n次方及存储位置:
Polyn_NFang(S[c],S[a],b);
case8:
8.请输入多项式的位置,n阶导及存储位置:
Polyn_NDao(S[c],S[a],b);
case9:
请输入需要做不定积分的多项式及存储位置:
m,&
S[m].head->
while(S[n].head->
Polyn_Ji(S[n],S[m]);
case10:
请输入需要做定积分的位置及从m积到n的值:
%d,%f,%f"
e,&
f);
d=Polyn_Ding(S[a],e,f);
y=%lf\n"
d);
case11:
11.请输入需要求值的多项式的位置及x值:
%d,%f"
x);
d=ResultPolyn(S[m],x);
case12:
12.请输入多项式的位置:
%d号项数为%d\n"
m,S[m].len);
case13:
13.请输入需要销毁的多项式的位置:
DestroyList(S[m]);
case14:
PrintAll(S);
\n0\t退出\n1\t创建多项式\n2\t显示多项式\n3\t复制多项式\n4\t多项式求和\n5\t多项式求差\n6\t多项式求积\n7\t多项式n次方\n8\t多项