线性表的应用.docx
- 文档编号:6735132
- 上传时间:2023-01-09
- 格式:DOCX
- 页数:10
- 大小:18.17KB
线性表的应用.docx
《线性表的应用.docx》由会员分享,可在线阅读,更多相关《线性表的应用.docx(10页珍藏版)》请在冰豆网上搜索。
线性表的应用
线性表的应用
实验报告
课程名称计算机软件基础
实验项目线性表的应用实验仪器计算机
系别光电信息与通信工程
专业电子信息工程
班级/学号
学生姓名
实验日期2011-4-1
成绩_______________________
指导教师_______________________
实验一线性表的应用
1.实验目的:
掌握线性链表的存储、运算及应用。
利用
链表实现一元多项式计算。
2.实验内容:
1)编写函数~实现用链表结构建立多项式,
2)编写函数~实现多项式的加法运算,
3)编写函数~实现多项式的显示,
4)测试:
编写主函数~它定义并建立两个多项式~显示
两个多项式~然后将它们相加并显示结果。
变换测试
用的多项式~检查程序的执行结果。
选做内容:
修改程序~选择实现以下功能:
5)多项式求值:
编写一个函数~根据给定的x值计算并
返回多项式f(x)的值。
测试该函数,从终端输入一个
x的值~调用该函数并显示返回结果,。
6)多项式相减:
编写一个函数~求两个多项式相减的多
项式。
7)多项式相乘:
编写一个函数~求两个多项式的乘积多
项式。
3、实验步骤:
1,多项式的输出:
在函数PrintPoly(PNode*h)里~根据我们平时写多项式的习
惯~对函数进行了修改~比如当系数为0时不输出、系数为
1时省略1、指数为0时只输出系数、指数为1时指数1省略、实现降幂排列、同类项合并等等~使得多项式输出后跟我们平时书写的一样自然。
在修改函数的过程中遇到过很多的问题~考虑问题不周全~在一遍又一遍的运行后~才使得输出基本规范~但是降幂排列还是没能实现~后来上网查了些资料~再慢慢地修改了一点~最后才把问题解决~我试着运行了几遍~感觉结果还不错~以下是运行时的截图:
2,多项式的减法、求值和相乘:
多项式的减法跟加法差不多~只需把被减的多项式的系数变成其相反数~然后再相加就可以了,
多项式的求值也比较简单~取得X的值后~分别计算多项式的各项~
存储在y中~然后把前几项的值相加~f=f+y,多项式的相乘是把系数相乘~指数相加~再创建新的节点存储各相乘
后的项~最后返回头指针就行了。
运行的最后结果如下图:
4、程序清单:
#include
#include
#include
typedefstructpolynode
{floatcoef;//系数
intexp;//指数
structpolynode*next;//下一结点指针}PNode;
voidPrintPoly(PNode*h)//输出多项式。
修改此算法~使输出形式更符
合自然表达规范
{
PNode*p=h->next,*q,*max,*t;
inta=0;//存储指数~用于降幂排列
floatb=0;//存储系数
if(p==h){
printf("NullPoly.\n");//判断是否为空
return;
}
for(p=h->next;p->next!
=h;p=p->next)//实现降序排列
{
max=p;//令max=p为最高次幂
for(q=p->next;q!
=h;q=q->next)//冒泡法排序
if(max->expexp)max=q;//如果max的指数比下一节点q指数小~则令max=q
if(max->exp!
=p->exp||max->coef!
=p->coef){//如果max变了~即max:
=p~则交换p与max的成员值
a=max->exp;b=max->coef;
max->exp=p->exp;max->coef=p->coef;
p->exp=a;p->coef=b;}
}
for(p=h->next;p->next!
=h;p=p->next){//此for循环用于合并同类项
t=p->next;
if(p->exp==p->next->exp){
p->coef=p->coef+t->coef;
p->next=t->next;free(t);}
}
p=h->next;//找到头节点~开始输出
printf("f(x)=");
if(p->coef==-1)printf("-x^%d",p->exp);//如果系数为-1,1省略输出~输出负号
elseif(p->coef==0)printf("");//如果系数为0~不输出
elseif(p->coef==1)printf("x^%d",p->exp);//如果系数为1,1省略输出
else{if(p->exp==0)printf("%g",p->coef);//如果系数为其他~指数为0~输出系数
elseif(p->exp==1)
printf("%gx",p->coef);//指数为1~指数1省略输出
else
printf("%gx^%d",p->coef,p->exp);}//指数为其他~正常输出
p=p->next;//输出第二项
while(p!
=h){//判断是否输完
if(p->coef<0)
{
if(p->coef==-1){//如果系数为-1~根据指数的值分别输出
if(p->exp==0)printf("-1");
elseif(p->exp==1)printf("-x");
elseprintf("-x^%d",p->exp);}
else{if(p->exp==0)
printf("%g",p->coef);//如果系数小于0不为-1~按指数情况输出
elseif(p->exp==1)
printf("%gx",p->coef);
else
printf("%gx^%d",p->coef,p->exp);}
}
elseif(p->coef==0)printf("");//如果系数为0~输出为空
else//如果系数大于0
{
printf("+");//输出+号
if(p->coef==1)printf("x^%d",p->exp);//系数为1的情况
else
{if(p->exp==0)
printf("%g",p->coef);//系数不为1的情况按指数的情况输出
elseif(p->exp==1)
printf("%gx",p->coef);
else
printf("%gx^%d",p->coef,p->exp);
}
}
p=p->next;//输出下一项
}
printf("\n");
}
PNode*CreatPoly()//建立多项式链表~返回头指针{PNode*head,*p,*s;
inti,n;
head=(PNode*)malloc(sizeof(PNode));//建立头节点
head->exp=-1;//初始化头节点成员exp
p=head;//令p指向头节点
printf("输入多项式的项数:
");
scanf("%d",&n);//从键盘取得多项式项数
for(i=1;i<=n;i++){//创建多项式链表
s=(PNode*)malloc(sizeof(PNode));
printf("输入多项式第%d项,coefexp,:
",i);
scanf("%g%d",&s->coef,&s->exp);
p->next=s;
p=s;
}
p->next=head;//构成循环链表
returnhead;//返回头指针}
voidFreePoly(PNode*h)
//编写此算法~将以h为头指针的多项式的链表结点逐个释放。
{PNode*p=h->next;//p初始化为第一项
while(p!
=h)//判断是否释放完毕{
free(p);//释放节点p=p->next;//下一项}
return;
}
PNode*PolyAdd(PNode*ha,PNode*hb){
//实现两多项式,头指针分别为ha和hb,相加~返回和多项式hc=ha+hb。
PNode*pa=ha->next,*pb=hb->next,*pc,*hc,*q;
intexp;//存储指数
floatcoef;//存储系数
hc=(PNode*)malloc(sizeof(PNode));
hc->exp=-1;
hc->next=hc;
pc=hc;
while(pa->exp!
=-1||pb->exp!
=-1){//判断是否回到头节点
if(pa->exp>pb->exp){//如果pa的指数大~则pa指向下一项
exp=pa->exp;
coef=pa->coef;
pa=pa->next;
}
elseif(pa->expexp){//如果pb的指数大~则pb指向下一项
exp=pb->exp;
coef=pb->coef;
pb=pb->next;
}
else{
exp=pa->exp;//如果指数相等~则相加合并为一项
coef=pa->coef+pb->coef;
pa=pa->next;
pb=pb->next;
}
if(coef!
=0){//当系数不为0时~创建链表~存储相加后的多项式
q=(PNode*)malloc(sizeof(PNode));
q->exp=exp;
q->coef=coef;
q->next=pc->next;
pc->next=q;
pc=q;
}
}
returnhc;//返回头指针}
PNode*PolySubtract(PNode*ha,PNode*hb)//与加法运算类似{
//编写此算法~实现两多项式,头指针分别为ha和hb,相减~返回差多项式hc=ha-hb。
PNode*pa=ha->next,*pb=hb->next,*pc,*hc,*q;
intexp;
floatcoef;
hc=(PNode*)malloc(sizeof(PNode));
hc->exp=-1;
hc->next=hc;
pc=hc;
while(pa->exp!
=-1||pb->exp!
=-1){
if(pa->exp>pb->exp){
exp=pa->exp;
coef=pa->coef;
pa=pa->next;
}
elseif(pa->expexp){
exp=pb->exp;
coef=-pb->coef;
pb=pb->next;
}
else{
exp=pa->exp;
coef=pa->coef-pb->coef;
pa=pa->next;
pb=pb->next;
}
if(coef!
=0){
q=(PNode*)malloc(sizeof(PNode));
q->exp=exp;
q->coef=coef;
q->next=pc->next;
pc->next=q;
pc=q;
}
}
returnhc;
}
PNode*PolyMultiply(PNode*ha,PNode*hb)
{
//实现两多项式,头指针分别为ha和hb,相乘~返回乘积多项式hc=ha*hb。
PNode*hc,*p,*q,*t,*pc;
hc=(PNode*)malloc(sizeof(PNode));//创建头指针
hc->exp=-1;
hc->next=hc;//初始化为空链表
pc=hc;//pc指向头指针for(p=ha->next;p!
=ha;p=p->next)//双重dor循环for(q=hb->next;q!
=hb;q=q->next){t=(PNode*)malloc(sizeof(PNode));//创建新节点用于存储相乘后的结果t->coef=p->coef*q->coef;//系数相加t->exp=p->exp+q->exp;//指数相加t->next=pc->next;//连接到链表pc->next=t;//继续下一项pc=t;}
returnhc;//返回头指针}
doublePolyValue(PNode*h,floatx){
doubley=0.0,f=0.0;//编写算法~求以h为头指针的多项式在x点的值并返回该值。
inti;
PNode*p=h->next;//求出f=f(x);
while(p!
=h){y=p->coef;
for(i=1;i<=p->exp;i++)y=y*x;//求第i项的值
f+=y;//求前i项的值
p=p->next;}//循环求下一项的值
returnf;//返回求值结果}
voidmain()//主函数{
PNode*HA,*HB,*HC;
floatx;
HA=CreatPoly();//创建HA链表
HB=CreatPoly();//创建HB链表
printf("多项式A:
");PrintPoly(HA);//输出链表HA
printf("多项式B:
");PrintPoly(HB);//输出链表HB
printf("输入x:
");
scanf("%f",&x);//取得X值
printf("多项式求值结果A(x)=%f\n",PolyValue(HA,x));//输出求值结果
HC=PolyAdd(HA,HB);//调用多项式相加函数
printf("多项式相加结果:
");
PrintPoly(HC);//输出相加后多项式
printf("多项式想加后求值结果A(x)=%f\n",PolyValue(HC,x));//输出相加后结果
HC=PolySubtract(HA,HB);//多项式想减
printf("多项式相减结果:
");
PrintPoly(HC);//输出想减后的多项式
printf("多项式想减后求值结果A(x)=%f\n",PolyValue(HC,x));//输出想减后结果
HC=PolyMultiply(HA,HB);//多项式相乘
printf("多项式相乘结果:
");
PrintPoly(HC);//输出相乘后多项式
printf("多项式想乘后求值结果A(x)=%f\n",PolyValue(HC,x));//输出相乘后结果
FreePoly(HA);//释放链表
FreePoly(HB);
FreePoly(HC);
}
5、总结:
这次上机实验~我在一次次的错误中学到了很多。
首先对多项式的输出~我就考虑问题不周全~没有考虑到系数为-1的情况~后来在运行中看到了-1x^4才发现,在对多项式降幂排列时~总是出现错误~要么运行错误~要么运行后什么都没有~要么运行后根本就没有降幂~或者只输出高次幂项~主要还是自己对链表的理解不清晰~只是一味的
盲目地改来改去~后来把软件基础课本上的例题仔细看了看~又在网上找了个排序的算法琢磨了几遍~才算弄明白。
对链表的理解比较清楚之后~后面的减法、求值还有乘法就比较简单了~所以后来虽然有点小问题~但是进行的比较顺利。
通过这次实验~我对链表有了比较清晰的理解~也对自己有了信心~发现自己对编写程序还是比较感兴趣的~也很执着~我想我会需努力的:
相关文档:
更多相关文档请访问:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 线性 应用