数据结构实验报告Word下载.docx
- 文档编号:22888798
- 上传时间:2023-02-05
- 格式:DOCX
- 页数:47
- 大小:150.39KB
数据结构实验报告Word下载.docx
《数据结构实验报告Word下载.docx》由会员分享,可在线阅读,更多相关《数据结构实验报告Word下载.docx(47页珍藏版)》请在冰豆网上搜索。
算
法
流
程
图
者
含
注
释
源
代
码
)
#include<
stdio.h>
malloc.h>
iostream.h>
typedefstructPolynode
{
floatcoef;
//系数
intexp;
//指数
structPolynode*next;
}*Poly,Polynode;
//Poly为结点指针类型
voidInsert(Polyp,Polyhead)
{
if(p->
coef==0)//系数为0时释放结点
free(p);
else
{
Polyq1,q2;
q1=head;
q2=head->
next;
while(q2&
&
p->
exp<
q2->
exp)
{//后移查找插入位置
q1=q2;
q2=q2->
}
if(q2&
exp==q2->
{//将指数相同的相合并
q2->
coef+=p->
coef;
free(p);
if(!
coef)//系数为0时释放结点
{
q1->
next=q2->
free(q2);
}
else
{
p->
next=q2;
q1->
next=p;
}
}
PolyCreateList(Polyhead,intm)
{//建立一个头指针为head、项数为m的一元多项式
inti;
Polyp;
Polynode*q;
p=head=(Poly)malloc(sizeof(structPolynode));
head->
next=NULL;
for(i=0;
i<
m;
i++)
p=(Poly)malloc(sizeof(structPolynode));
//建立新结点以接收数据
printf("
请输入第"
);
%d"
i+1);
项的系数与指数:
"
scanf("
%f"
&
coef);
exp);
Insert(p,head);
//调用Insert函数插入结点
q=head->
while(q!
=NULL)
系数:
"
q->
\t"
指数:
%d\n"
q=q->
returnhead;
voidDestroyList(Polyp)
{//销毁多项式p
Polyq1,q2;
next!
q1=p->
q2=q1->
while(q1->
next)
{
free(q1);
//指针后移
(写不完时,可另加附页。
intOutputList(PolyP)
{//输出多项式
Polyq=P->
intflag=1;
//项数计数器
if(!
q)
{//若多项式为空,输出0
0\n"
return0;
}
while(q)
if(q->
coef>
0&
flag!
=1)//系数大于0且不是第一项
printf("
+\n"
coef!
=1&
q->
=-1)//系数非1或-1的普通情况
if(q->
exp==0)
printf("
exp==1)
{
X"
exp!
=0)
X^"
else
coef==1)
if(q->
printf("
1"
if(q->
{
}
}
if(q->
coef==-1)
exp==0)
-1"
-x"
=0&
=1)
-X^"
flag++;
printf("
\n"
return0;
intcompare(Polya,Polyb)
if(a&
b)
if(!
b||a->
exp>
b->
exp)
return1;
elseif(!
a||a->
exp)return-1;
elsereturn0;
elseif(!
a&
b)return-1;
//a多项式已空,但b多项式非空
elsereturn1;
//b多项式已空,但a多项式非空
PolyAddPoly(Polypa,Polypb)
{//求解并建立和多项式a+b,返回其头指针
Polyqa=pa->
Polyqb=pb->
Polyheadc,hc,qc;
hc=(Poly)malloc(sizeof(structPolynode));
//建立头结点
hc->
headc=hc;
while(qa||qb){
qc=(Poly)malloc(sizeof(structPolynode));
switch(compare(qa,qb))
case1:
qc->
coef=qa->
exp=qa->
exp;
qa=qa->
break;
case0:
coef+qb->
qb=qb->
case-1:
coef=qb->
exp=qb->
}//switch
if(qc->
=0)
qc->
next=hc->
hc->
next=qc;
hc=qc;
elsefree(qc);
//当相加系数为0时,释放该结点
returnheadc;
}
PolySubtractPoly(Polypa,Polypb)
{//求解并建立和多项式a-b,返回其头指针
while(qa||qb)
coef-qb->
coef=-qb->
//当相减系数为0时,释放该结点
PolyMultiplyPoly(Polypa,Polypb)
{//求解并建立积多项式a*b,返回其头指针
Polyhf,pf;
hf=(Poly)malloc(sizeof(structPolynode));
hf->
for(qa=pa->
qa;
qa=qa->
for(qb=pb->
qb;
qb=qb->
pf=(Poly)malloc(sizeof(structPolynode));
pf->
coef*qb->
exp+qb->
Insert(pf,hf);
//调用Insert函数以合并指数相同的项
returnhf;
voidDevicePoly(Polypa,Polypb)
{//求解并建立商多项式a/b,返回其头指针
Polyhf,pf,temp1,temp2;
//建立头结点,存储商
pf=(Poly)malloc(sizeof(structPolynode));
//建立头结点,存储余数
pf->
temp1=(Poly)malloc(sizeof(structPolynode));
temp1->
temp2=(Poly)malloc(sizeof(structPolynode));
temp2->
temp1=AddPoly(temp1,pa);
while(qa!
=NULL&
qa->
=qb->
temp2->
next=(Poly)malloc(sizeof(structPolynode));
next->
coef=(qa->
coef)/(qb->
exp=(qa->
exp)-(qb->
Insert(temp2->
next,hf);
pa=SubtractPoly(pa,MultiplyPoly(pb,temp2));
qa=pa->
pf=SubtractPoly(temp1,MultiplyPoly(hf,pb));
商是:
OutputList(hf);
printf("
余数是:
OutputList(pf);
}//DevicePoly
floatValuePoly(Polyhead,floatx)
{//输入x值,计算并返回多项式的值
floatsum=0,t;
for(p=head->
p;
p=p->
t=1;
for(i=p->
i!
=0;
if(i<
0)
t/=x;
i++;
}//指数小于0,进行除法
else
t*=x;
i--;
}//指数大于0,进行乘法
sum+=p->
coef*t;
returnsum;
}//ValuePoly
PolyDerivative(Polyhead)
{//求解并建立a的导函数多项式,并返回其头指针
Polyq=head->
next,p1,p2,hd;
hd=p1=(Poly)malloc(sizeof(structPolynode));
hd->
while(q)
{//该项不是常数项时
p2=(Poly)malloc(sizeof(structPolynode));
p2->
coef=q->
coef*q->
exp=q->
exp-1;
next=p1->
//尾插法插入结点
p1->
next=p2;
p1=p2;
elseif(q->
exp==0)//该项为常数项
break;
returnhd;
}//Dervativeint
intmain()
intm,n,flag=0;
floatx;
Polypa=0,pb=0,pc,pd,pe,pf;
//定义各式的头指针,pa与pb在使用前付初值NULL
请输入a的项数:
scanf("
m);
pa=CreateList(pa,m);
//建立多项式a
请输入b的项数:
n);
pb=CreateList(pb,n);
//输出菜单
*********************************************************************\n"
1.输出多项式a和b2.建立多项式a+b3.建立多项式a-b\n"
4.建立多项式a*b5.建立多项式a/b\n"
6.计算多项式a在x处的值7.求多项式a的导函数8.退出程序\n"
for(;
;
flag=0)
执行操作为:
flag);
if(flag==1)
多项式a为:
OutputList(pa);
多项式b为:
OutputList(pb);
continue;
if(flag==2)
pc=AddPoly(pa,pb);
多项式a+b为:
OutputList(pc);
DestroyList(pc);
if(flag==3)
pd=SubtractPoly(pa,pb);
多项式a-b为:
OutputList(pd);
DestroyList(pd);
if(flag==4)
pe=MultiplyPoly(pa,pb);
多项式a*b为:
OutputList(pe);
DestroyList(pe);
if(flag==5)
DevicePoly(pa,pb);
if(flag==6)
请输入x的值:
x="
scanf("
x);
多项式a的值为:
%f\n"
ValuePoly(pa,x));
if(flag==7)
pf=Derivative(pa);
多项式a的导函数为:
OutputList(pf);
DestroyList(pf);
if(flag==8)
if(flag<
1||flag>
8)
输入错误!
!
请重新选择!
continue;
DestroyList(pa);
DestroyList(pb);
结
果
分
析
及
心
得
体
会
熟悉了用带头结点的单链表来解决问题,熟悉了单链表的相关操作如构建单链表
成
绩
评
定
教师签名:
年月日
1203
算术表达式的求值演示
以字符序列的形式从终端输入语法正确的、不含变量的整数表达式
#include<
#include<
stdlib.h>
string.h>
#defineDEBU
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 实验 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)