实验一线性表应用多项式计算.docx
《实验一线性表应用多项式计算.docx》由会员分享,可在线阅读,更多相关《实验一线性表应用多项式计算.docx(17页珍藏版)》请在冰豆网上搜索。
![实验一线性表应用多项式计算.docx](https://file1.bdocx.com/fileroot1/2023-7/27/b0cb36b5-951a-4ae0-a096-adbc2369a074/b0cb36b5-951a-4ae0-a096-adbc2369a0741.gif)
实验一线性表应用多项式计算
浙江大学城市学院实验报告
课程名称数据结构与算法
实验项目名称实验一线性表应用---多项式计算
实验成绩指导老师(签名)日期
一.实验目的和要求
1.进一步掌握线性表的的基本操作。
2.掌握线性表的典型应用----多项式表示与计算。
二.实验内容
1.设用线性表((a1,e1),(a2,e2),……,(am,em))表示多项式P(x)=a1*xe1+a2*xe2+…+am*xem,其中:
a1~am为非零系数,0≤e1<e2<…..<em,请编写用链式存储结构(带表头附加结点的单链表)存储该多项式时,多项式基本操作的实现函数。
多项式基本操作应包括初始化多项式、清除多项式、输出多项式、插入一项、删除一项、多项式求值、多项式相加等。
要求:
把多项式线性表的结构定义及多项式基本操作实现函数存放在头文件Linkpoly.h中,主函数存放在主文件test6_1.cpp中,在主函数中通过调用Linkpoly.h中的函数进行测试。
2.选做:
编写用顺序存储结构存储多项式时,多项式基本操作的实现函数。
要求:
把多项式线性表的结构定义及多项式基本操作实现函数存放在文件Seqpoly.h中,在主文件test6_1.cpp中增加测试语句对Seqpoly.h中的函数进行测试。
3.填写实验报告,实验报告文件取名为report1.doc。
4.上传实验报告文件report1.doc与源程序文件test6_1.cpp及Linkpoly.h、Seqpoly.h(若有)到Ftp服务器上自己的文件夹下。
三.函数的功能说明及算法思路
typedefstruct{
doublecoef;
intexp;
}ElemType;
typedefstructNode{
ElemTypedata;
structNode*next;
}LNode;
//初始化多项式
voidInitPoly(LNode*&H)
//清除多项式
voidClearPoly(LNode*&H)
//输出多项式
voidTraversePoly(LNode*H)
//插入一项多项式
boolInsertPoly(LNode*H,intpos,doublea,inte)
{
if(pos==0)//按指数有序插入
{
……
}
else//按pos值插入
{
……
}
}
//删除一项多项式
boolDeletePoly(LNode*H,intpos,double&a,int&e)
{
if(pos==0)//按系数或指数删除
{
……
}
else//按pos值删除
{
……
}
}
//多项式求值
doublePolySum(LNode*H,doublex)
//多项式相加
LNode*PolyAdd(LNode*a,LNode*b)
{
while(pa!
=a&&pb!
=b)//当两个表同时不为空时
{
if(pa->data.exp==pb->data.exp)
{
if((v=pa->data.coef+pb->data.coef)!
=0)
{
……
}
}
elseif(pa->data.expdata.exp)//将pa所指结点插入c链表
{
}
else//将pb所指结点插入c链表
{
}
}
while(pa!
=a)//将a链表中剩余结点复制到c链表
{
}
while(pb!
=b)//将b链表中剩余结点复制到c链表
{
}
}
四.实验结果与分析
五.心得体会
【附录----源程序】
test6_1.cpp
#include
#include
#include
typedefstruct{
doublecoef;
intexp;
}ElemType;
typedefstructNode{
ElemTypedata;
structNode*next;
}LNode;
#include"LinkPoly.h"
voidmain()
{
LNode*a,*b,*c;
//初始化
InitPoly(a);
InitPoly(b);
ElemTypera[4]={{5,0},{3,2},{-6,3},{2,5}};
ElemTyperb[6]={{3,0},{4,1},{-2,2},{3,3},{-2,5},{9,6}};
inti;
for(i=3;i>=0;i--)
InsertPoly(a,1,ra[i].coef,ra[i].exp);
for(i=5;i>=0;i--)
InsertPoly(b,1,rb[i].coef,rb[i].exp);
//遍历
cout<<"Poly_A(x)=";
TraversePoly(a);
cout<cout<<"Poly_B(x)=";
TraversePoly(b);
cout<//求和
cout<<"多项式Poly_A与多项式Poly_B相加得:
"<c=PolyAdd(a,b);
cout<<"Poly_C(x)=";
TraversePoly(c);
cout<intpos;
charu,v,w;
ElemTypeT;
//插入
cout<<"按指数有序插入一项多项式:
"<cout<<"请输入待插入项:
";
cin>>u>>T.coef>>v>>T.exp>>w;
if(InsertPoly(c,0,T.coef,T.exp)){
cout<"<cout<<"Poly_C(x)=";
TraversePoly(c);
}
cout<cout<<"按pos值插入一项多项式:
"<cout<<"请输入pos值:
";
cin>>pos;
cout<<"请输入待插入项:
";
cin>>u>>T.coef>>v>>T.exp>>w;
if(InsertPoly(c,pos,T.coef,T.exp)){
cout<"<cout<<"Poly_C(x)=";
TraversePoly(c);
}
cout<//删除
cout<<"请输入待删除项的pos值:
";
cin>>pos;
if(DeletePoly(c,pos,T.coef,T.exp)){
cout<<"删除项为"<<"{"<cout<<"删除后,多项式Poly_C为:
"<cout<<"Poly_C(x)=";
TraversePoly(c);
}
cout<cout<<"请输入待删除项的系数:
";
cin>>T.coef;
if(DeletePoly(c,0,T.coef,T.exp)){
cout<<"删除项为"<<"{"<cout<<"删除后,多项式Poly_C为:
"<cout<<"Poly_C(x)=";
TraversePoly(c);
}
cout<cout<<"请输入待删除项的指数:
";
cin>>T.exp;
if(DeletePoly(c,0,T.coef,T.exp)){
cout<<"删除项为"<<"{"<cout<<"删除后,多项式Poly_C为:
"<cout<<"Poly_C(x)=";
TraversePoly(c);
}
cout<//求值
doublex;
cout<<"请输入待求值的x:
";
cin>>x;
cout<<"Poly_C(x)="<//清除
ClearPoly(a);
ClearPoly(b);
ClearPoly(c);
}
Linkpoly.h
//初始化多项式
voidInitPoly(LNode*&H)
{
if((H=newLNode)==NULL)
exit(0);
H->next=H;
}
//清除多项式
voidClearPoly(LNode*&H)
{
LNode*cp=H->next;
LNode*np;
while(cp!
=H){
np=cp->next;
deletecp;
cp=np;
}
H->next=H;
}
//输出多项式
voidTraversePoly(LNode*H)
{
LNode*p=H->next;
if(p!
=H){
cout<data.coef<<'x'<<'^'<data.exp;
p=p->next;
while(p!
=H){
if(p->data.coef>0)
cout<<'+';
cout<data.coef<<'x'<<'^'<data.exp;
p=p->next;
}
}
cout<}
//插入一项多项式
boolInsertPoly(LNode*H,intpos,doublea,inte)
{
LNode*newptr;
if((newptr=newLNode)==NULL)
returnfalse;
newptr->data.coef=a;
newptr->data.exp=e;
LNode*cp=H->next;
LNode*ap=H;
if(pos==0)
{
while(cp!
=H){
if(e>ap->data.exp&&edata.exp)
break;
elseif(e==cp->data.exp){
cp->data.coef+=a;
returntrue;
}
else{
ap=cp;
cp=cp->next;
}
}
newptr->next=cp;
ap->next=newptr;
}
else{
inti=0;
while(cp!
=H){
i++;
if(i==pos)
break;
else{
ap=cp;
cp=cp->next;
}
}
if(cp==H&&i+1cout<<"pos值无效!
"<returnfalse;
}
newptr->next=cp;
ap->next=newptr;
}
returntrue;
}
//删除一项多项式
boolDeletePoly(LNode*H,intpos,double&a,int&e)
{
if(H->next==H)
returnfalse;
LNode*cp=H->next;
LNode*ap=H;
if(pos==0)
{
while(cp!
=H){
if(a==cp->data.coef||e==cp->data.exp)
break;
else{
ap=cp;
cp=cp->next;
}
}
if(cp==H){
cout<<"不存在符合条件的项!
"<returnfalse;
}
}
else
{
inti=0;
while(cp!
=H){
i++;
if(i==pos)
break;
else{
ap=cp;
cp=cp->next;
}
}
if(cp==H){
cout<<"pos值无效!
"<returnfalse;
}
}
a=cp->data.coef;
e=cp->data.exp;
ap->next=cp->next;
deletecp;
returntrue;
}
//多项式求值
doublePolySum(LNode*H,doublex)
{
inti=0;
doublesum=0,w=1;
LNode*p=H->next;
while(p!
=H){
while(idata.exp){
w*=x;
i++;
}
sum+=p->data.coef*w;
p=p->next;
}
returnsum;
}
//多项式相加
LNode*PolyAdd(LNode*a,LNode*b)
{
doublev;
LNode*c;
InitPoly(c);
LNode*pc=c,*pa=a->next,*pb=b->next;
while(pa!
=a&&pb!
=b){
if(pa->data.exp==pb->data.exp){
if((v=pa->data.coef+pb->data.coef)!
=0){
InsertPoly(pc,1,v,pa->data.exp);
pc=pc->next;
}
pa=pa->next;
pb=pb->next;
}
elseif(pa->data.expdata.exp){
InsertPoly(pc,1,pa->data.coef,pa->data.exp);
pc=pc->next;
pa=pa->next;
}
else{
InsertPoly(pc,1,pb->data.coef,pb->data.exp);
pc=pc->next;
pb=pb->next;
}
}
while(pa!
=a){
InsertPoly(pc,1,pa->data.coef,pa->data.exp);
pc=pc->next;
pa=pa->next;
}
while(pb!
=b){
InsertPoly(pc,1,pb->data.coef,pb->data.exp);
pc=pc->next;
pb=pb->next;
}
returnc;
}