数据结构实验报告《一多项式及其运用》Word格式文档下载.docx
- 文档编号:20254470
- 上传时间:2023-01-21
- 格式:DOCX
- 页数:12
- 大小:257.66KB
数据结构实验报告《一多项式及其运用》Word格式文档下载.docx
《数据结构实验报告《一多项式及其运用》Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《数据结构实验报告《一多项式及其运用》Word格式文档下载.docx(12页珍藏版)》请在冰豆网上搜索。
若计算a+b则有:
(6x+3x^5-7.1x^11)+(2-5x^5+11x^9)=(-7.1x^11+11x^9-2x^5+6x+2)等。
【操作界面显示】
1:
建立多项式的操作:
2:
输出多项式及计算x的值
3:
进行运算操作:
4:
结束程序:
【程序代码】
#include<
stdio.h>
//调用输入输出函数
stdlib.h>
typedefstructPolynomial//定义一个Polyn结构体
{floatcoef;
intexp;
//系数指定为浮点型,指数指定为整型
structPolynomial*next;
}*Polyn,Polynomial;
voidInsert(Polynp,Polynh){//查找位置插入新链节
if(p->
coef==0)free(p);
//p系数为0的话释放结点
else{//否则查找插入位置
Polynq1,q2;
q1=h;
q2=h->
next;
while(q2&
&
p->
exp<
q2->
exp)//指数较大则插前面
{q1=q2;
q2=q2->
}
if(q2&
exp==q2->
exp)//将指数相同相合并
{q2->
coef+=p->
coef;
free(p);
if(!
q2->
coef)//系数为0的话释放结点
{
q1->
next=q2->
free(q2);
}
}
else{p->
next=q2;
next=p;
}//指数为新时将结点插入
}//第一个else
}//voidInsert
PolynCreatePolyn(Polynhead,intm){//建立一个头指针为head、项数为m的一元多项式
inti;
Polynp;
p=head=(Polyn)malloc(sizeof(structPolynomial));
//开辟多项式地址空间
head->
next=NULL;
//指定表尾,然后采用尾插法输入多项式
for(i=0;
i<
m;
i++)
{
p=(Polyn)malloc(sizeof(structPolynomial));
//建立新结点以接收数据
printf("
请输入第%d项的系数与指数:
"
i+1);
scanf("
%f%d"
&
p->
coef,&
exp);
Insert(p,head);
//调用Insert函数插入结点
returnhead;
}
voidPrintPolyn(PolynP)//输出多项式
{Polynq=P->
intflag=1;
//项数计数器
q){//若多项式为空,输出0
putchar('
0'
);
\n"
return;
}//voidif
while(q){
if(q->
coef>
0&
flag!
=1)putchar('
+'
//系数大于0且不是第一项,显示"
+"
连接
coef!
=1&
=-1)//系数非1或-1时输出
{printf("
%g"
q->
coef);
exp==1)putchar('
X'
//指数为1时,直接输出"
X"
elseif(q->
exp)printf("
X^%d"
//指数不为1时,输入"
X^"
格式
}//whileifif
else{if(q->
coef==1)
{if(!
exp)putchar('
1'
elseprintf("
}//elseif
coef==-1)//系数为"
-1"
时,前面加上负号,其他情况与"
+1"
类似
exp==1)printf("
-X"
-X^%d"
}//elseifif
}//else
q=q->
flag++;
}//while
}//void
intcompare(Polyna,Polynb)//两个多项式的判断
{if(a&
b)//若两个多项式都非空
{if(!
b||a->
exp>
b->
exp)return1;
//b多项式已空或指数较小,返回1
elseif(!
a||a->
exp<
exp)return-1;
//a多项式已空或指数较小,返回-1
elsereturn0;
//a、b两多项式的指数相等,返回0
}//if
a&
b)return-1;
//a多项式已空,但b多项式非空
elsereturn1;
//b多项式已空,但a多项式非空
}//compare
PolynAddPolyn(Polynpa,Polynpb){//求解并建立多项式a+b,返回其头指针
Polynqa=pa->
Polynqb=pb->
Polynheadc,hc,qc;
hc=(Polyn)malloc(sizeof(structPolynomial));
//建立头结点
hc->
//指向结尾,采用尾插法
headc=hc;
while(qa||qb)
{qc=(Polyn)malloc(sizeof(structPolynomial));
//开辟地址空间
switch(compare(qa,qb))//判断多项式a和b
{case1:
{qc->
coef=qa->
//输入a多项式
qc->
exp=qa->
exp;
qa=qa->
break;
case0:
coef+qb->
//指数相等时系数相加
qb=qb->
case-1:
coef=qb->
//输入b多项式
exp=qb->
}
}//switch
if(qc->
=0)//当相加系数不为0,加入该结点
next=hc->
next=qc;
hc=qc;
elsefree(qc);
//当相加系数为0时,释放该结点
returnheadc;
PolynSubtractPolyn(Polynpa,Polynpb){//求解并建立多项式a-b,返回其头指针
Polynh=pb;
Polynp=pb->
Polynpd;
while(p){//将pb的系数取反
coef*=-1;
p=p->
}//while
pd=AddPolyn(pa,h);
for(p=h->
p;
p=p->
next)//恢复pb的系数
returnpd;
}//SubtractPolyn
PolynMultiplyPolyn(Polynpa,Polynpb){//求解并建立多项式a*b,返回其头指针
Polynhf,pf;
hf=(Polyn)malloc(sizeof(structPolynomial));
hf->
for(;
qa;
qa=qa->
next)
{for(qb=pb->
qb;
qb=qb->
{pf=(Polyn)malloc(sizeof(structPolynomial));
pf->
coef*qb->
exp+qb->
Insert(pf,hf);
//调用Insert函数以合并指数相同的项
}//forfor
}//for
returnhf;
}//MultiplyPolyn
floatValuePolyn(Polynhead,intx){//输入x值,计算并返回多项式的值
inti,t;
floatsum=0;
for(p=head->
{t=1;
for(i=p->
i!
=0;
)
{if(i<
0){t/=x;
i++;
}//指数小于0,进行除法
else{t*=x;
i--;
}//指数大于0,进行乘法
sum+=p->
coef*t;
//计算求和
}//for
returnsum;
}//ValuePolyn
voidDestroyPolyn(Polynp) //销毁多项式p
{ Polynq1,q2;
q1=p->
q2=q1->
while(q1->
next) //删除q1的元素直至q1为空
{free(q1);
q1=q2;
}//DestroyPolyn
voidmain()
{intm,n,a,x;
charflag;
Polynpa=0,pb=0,pc;
printf("
--------------------------------------------------\n"
欢迎使用一元多项式及其运用操作程序\n"
请输入多项式a的项数:
%d"
m);
pa=CreatePolyn(pa,m);
//建立多项式a
请输入多项式b的项数:
n);
pb=CreatePolyn(pb,n);
//建立多项式b
//输出菜单
*****************************************************\n"
*一元稀疏多项式简单计算器*\n"
**\n"
*A:
输出多项式aB:
输出多项式b*\n"
*C:
同时输出多项式a和b*\n"
*D:
代入x的值计算aE:
代入x的值计算b*\n"
*F:
代人x的值同时计算a和b*\n"
*G:
输出a+bH:
输出a-b*\n"
*I:
输出a*bJ:
退出*\n"
while(a)
{printf("
\n请选择操作:
//提示选择操作
%c"
flag);
//输入选择
switch(flag)//输入大小写都可以判断
{case'
A'
:
case'
a'
\n多项式a="
//输出多项式a
PrintPolyn(pa);
//调用输出函数显示
break;
//跳出
}
B'
case'
b'
\n多项式b="
//输出多项式b
PrintPolyn(pb);
break;
C'
c'
//输出多项式a和b
printf("
case'
D'
d'
输入x的值:
x="
//输入x值后计算a
scanf("
x);
\nx=%d时,a=%.3f\n"
x,ValuePolyn(pa,x));
E'
e'
//输入x值后计算b
\nx=%d时,b=%.3f\n"
x,ValuePolyn(pb,x));
F'
f'
//输入x值后计算a和b
G'
g'
{pc=AddPolyn(pa,pb);
//输出a+b,用新多项式显示
\na+b="
PrintPolyn(pc);
H'
h'
{pc=SubtractPolyn(pa,pb);
//输出a-b,用新多项式显示
\na-b="
I'
i'
{pc=MultiplyPolyn(pa,pb);
//输出a*b,用新多项式显示
\na*b="
J'
j'
\n感谢使用此程序!
//退出该程序
DestroyPolyn(pa);
//删除多项式a
DestroyPolyn(pb);
//删除多项式b
a=0;
//暂停显示界面,用户选择关闭
break;
default:
\n您的选择错误,请重新选择!
}//swich
}//main
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 一多项式及其运用 数据结构 实验 报告 多项式 及其 运用