一元稀疏多项式的加法运算数据结构实习.docx
- 文档编号:8887574
- 上传时间:2023-02-02
- 格式:DOCX
- 页数:17
- 大小:102.95KB
一元稀疏多项式的加法运算数据结构实习.docx
《一元稀疏多项式的加法运算数据结构实习.docx》由会员分享,可在线阅读,更多相关《一元稀疏多项式的加法运算数据结构实习.docx(17页珍藏版)》请在冰豆网上搜索。
一元稀疏多项式的加法运算数据结构实习
实习一线性表、栈和队列及其应用
——一元稀疏多项式的加法运算
【问题描述】
设计一个实现一元稀疏多项式相加运算的演示程序。
【基本要求】
(1)输入并建立两个多项式;
(2)多项式a与b相加,建立和多项式c;
(3)输出多项式a,b,c。
输出格式:
比如多项式a为:
A(x)=c1xe1+
c2xe2+…+cmxem,其中,ci和ei分别为第i项的系数和指数,且各项按
指数的升幂排列,即0≤e1<e2<…<em。
多项式b,c类似输出。
【测试数据】
(1)(1+x+x2+x3+x4+x5)+(-x3-x4)=(1+x+x2+x5)
(2)(x+x100)+(x100+x200)=(x+2x100+x200)
(3)(2x+5x8-3x11)+(7-5x8+11x9)=(7+2x+11x9-3x11)
一.需求分析
1.输入的形式和输入值的范围:
输入是从键盘输入的,输入的内容为多项式的系数和指数,其中多项式的每一项分别以一个系数和指数的形式输入,不带未知数X,系数为任意的实数,指数为任意的整数。
要结束该多项式的输入时,输入的指数和系数都为0.
2.输出的形式
从屏幕输出,显示用户输入的多项式,并显示多项式加减以后的多项式的值,并且多项式中将未知数X表示了出来.形式为:
+c1X^e1+c2X^e2+…+ciX^ei+…(ci和ei分别是第i项的系数和指数,序列按指数升序排列。
)
当多项式的某一项的系数为+1或者-1时侧该项多项式的输出形式为X^ei或-X^ei;
当该项的系数为正时输出+ciX^ei,当为负数时则输出ciX^ei
3.程序所能达到的功能
输入并建立多项式,实现一元稀疏多项式的相加并输出。
4.注意:
所有多项式都必须以指数升密形式输入。
5.测试数据为
(1)(1+x+x2+x3+x4+x5)+(-x3-x4)=(1+x+x2+x5)
(2)(x+x100)+(x100+x200)=(x+2x100+x200)
(3)(2x+5x8-3x11)+(7-5x8+11x9)=(7+2x+11x9-3x11)
二.设计
1.设计思路
(1).储存结构:
链式存储
(2).主要算法基本思路
首先定义一个多项式的结构体,存放多项式每一项的系数和指数以及next指针;
然后定义两个指针,第一个指针指向第一个多项式,第二个指针指向第二个多项式。
然后比较两个多项式第一项的指数的大小,如果两个多项式的指数相同,则将他们的系数相加,指数不变;如果不同则比较他们指数的大小,并将指数小的放在第一项。
然后指向指数小的那一项的指针后移,它的指数去和刚才必然的那一项的指向相比较……直至两个多项式相加完。
其中如果某二项的系数相加后为0,则该项不输出。
相加时的程序如下:
pnode*add(pnode*heada,pnode*headb)//多项式相加//
{
pnode*headc,*p,*q,*s,*r;
floatx;
p=heada;//p指针指向第一个多项式的第一项//
q=headb;//q指针指向第二个多项式的第一项//
headc=(pnode*)malloc(sizeof(pnode));//为两式相加的结果c申请内存//
r=headc;//r指向结果//
while(p!
=NULL&&q!
=NULL)//判断两个式子都合法//
{
if(p->e==q->e)//指数相同时系数相加//
{x=p->c+q->c;
if(x!
=0)
{
s=(pnode*)malloc(sizeof(pnode));
s->c=x;
s->e=p->e;
r->next=s;
r=s;
}
q=q->next;p=p->next;//指向多项式的下一项//
}
elseif(p->e>q->e)//多项式按升幂排序//
{
s=(pnode*)malloc(sizeof(pnode));
s->c=q->c;
s->e=q->e;
r->next=s;
r=s;
q=q->next;
}
else
{
s=(pnode*)malloc(sizeof(pnode));
s->c=p->c;
s->e=p->e;
r->next=s;
r=s;
p=p->next;
}
}
while(p!
=NULL)//第一个式子不为0时的相加法则//
{
s=(pnode*)malloc(sizeof(pnode));
s->c=p->c;
s->e=p->e;
r->next=s;
r=s;
p=p->next;
}
while(q!
=NULL)//第二个式子不为0的相加法则//
{
s=(pnode*)malloc(sizeof(pnode));
s->c=q->c;
s->e=q->e;
r->next=s;
r=s;
q=q->next;
}
r->next=NULL;
headc=headc->next;//c的指向依次指向下一项//
returnheadc;//返回两式相加的结果//
}
2.设计表示
(1)函数调用关系图
main->create()->create()->add()->display()->display()->display()
(2)函数规格接口说明
pnode*creat()/*此函数时用来创建多项式的*/
voiddisplay(pnode*head)/*head为每个多项式的头指针*/
pnode*add(pnode*heada,pnode*headb)/*headaheadb为两个多项式的头指针*/
3.实现注释
(1)根据提示输入多项式每一项的指数和系数,结束该多项式的输入时系数和指数都应该输入0。
(2)可以输入任何指数型式的多项式。
4.详细设计(主要算法的细化)
输出函数如下:
voiddisplay(pnode*head)//多项式输出//
{
pnode*p;intone_time=1;p=head;
while(p!
=NULL)//判断头结点非空//
{
if(one_time==1)
{
if(p->e==0)//当指数为0即X^o时只需要输出系数c//
printf("%f",p->c);
elseif(p->c==1)//系数为1时输出X^ei//
printf("x^%d",p->e);
elseif(p->c==-1)//系数为-1时输出-X^ei//
printf("-x^%d",p->e);
elseif(p->c>0)//系数大于0时系数前面带“+”//
printf("+%fx^%d",p->c,p->e);
elseif(p->c<0)//系数为副时原样输出//
printf("%fx^%d",p->c,p->e);
one_time=0;
}
else{
if(p->e==0)
{if(p->c!
=0)
printf("+%f",p->c);
}
elseif(p->c==1)//系数为1时输出X^ei//
printf("+x^%d",p->e);
elseif(p->c==-1)//系数为-1时输出-X^ei//
printf("-x^%d",p->e);
elseif(p->c>0)//系数大于0时系数前面带“+”
printf("+%fx^%d",p->c,p->e);
elseif(p->c<0)//系数为副时原样输出//;
printf("%fx^%d",p->c,p->e)
}
p=p->next;
}
printf("\n");
}
主函数如下:
voidmain()
{
pnode*a,*b,*c;//定义三个多项式//
printf("inputthefirst:
\n");//输入第一个多项式//
a=creat();//调用创建函数,创建第一个多项式//
printf("inputthesecond:
\n");//输入第二个多项式//
b=creat();//调用创建函数,创建第二个多项式//
c=add(a,b);//调用相加函数//
printf("thefirst:
");display(a);//输出第一个多项式//
printf("thesecond:
");display(b);//输出第二个多项式//
printf("sumis:
");display(c);//输出两多项式相加的结果//
}
相加部分见算法设计部分。
三.调试分析
1.调试遇到的主要问题以及解决方案:
a刚写程序时输出时没有分系数大于0和小于0分,输出的形式都为printf(“%fX^%d”,p->c,p->e),结果两个多项式相加时当某相邻两项时,中间的加号没有表示出来。
所以我就将系数分为大于0和小于0来分,输出形式为if(p->c>0)printf("+%fx^%d",p->c,p->e);elseif(p->c<0)printf("%fx^%d",p->c,p->e);
b刚开始多项式输入时没有按升幂的形式输入,结果运行的结果怎么都不对,然后将它按升幂的形式输入后就可以了。
c刚开始时没有考虑结束多项式的输入时该则么弄,结果运行时一直都在输入第一个多项式,怎么都结束不了,直到将结束位的系数和指数都设置为0时才解决了这个问题。
2.时间和空间复杂度的分析:
时间复杂度为:
O(n)
空间复杂度为:
O(n)
3改进设想
A由于两个多项式的某两项相加为0时是不输出数的,所以当两个多项式相加为0时,结果什么都不输出为空值,一直想办法改进,却没有什么结果,所以想在这方面改进一下;
B由于多项式的系数为正时,输出的形式中带有一个“+”,所以当多项式的第一项的系数为正值时总会带有一个“+”,觉得很别扭。
但如果输出形式中不带“+”,结果中两个不同项之间有没有“+”,与偶以很苦恼。
C由于没有菜单函数,所以每次只能显示本次相加的两的多项式,而不能显示前一次货前几次的多项式,所以想在此方面做一些改进,产生一个菜单,包括:
进去多项式相加程序帮助功能.退出。
让用户在没有退出之前都能看见每一次多项式相加的过程和结果,并在不懂的时候能获得帮助。
4.经验与体会:
一直都知道C语言学的很差,但是最基本的编程还是能完成的,但是这次实习让我知道原来的我的编程能力是如此之差,它让我很深刻的认识到我的基础功没有打扎实,我还要多下功夫。
学数据结构式好多东西都是纸上谈兵,以为懂了,结果上机的时候什么都不知道。
这次实习也让我认识到时间的重要性,我知道光有利临时没有用的,必须将理论与实际结合起来。
四.运行结果
验证
(1)(1+x+x2+x3+x4+x5)+(-x3-x4)=(1+x+x2+x5)
截图为
验证
(2)(x+x100)+(x100+x200)=(x+2x100+x200)
截图为
验证(3)(2x+5x8-3x11)+(7-5x8+11x9)=(7+2x+11x9-3x11)
截图为
六.源程序清单
#include
#include
#include
#include
typedefstructpnode//定义结构体//
{
floatc;//系数//
inte;//指数//
structpnode*next;//指向多项式下一项的指针//
}pnode;
pnode*creat()//创建多项式//
{
intm;floatn;pnode*head,*rear,*s;
head=(pnode*)malloc(sizeof(pnode));//申请内存空间//
rear=head;
printf("inputc:
");
scanf("%f",&n);//输入系数//
printf("inpute:
");//输入指数//
scanf("%d",&m);
while(n!
=0)//当系数不为0时输入多项式//
{
s=(pnode*)malloc(sizeof(pnode));//申请内存空间//
s->c=n;
s->e=m;
s->next=NULL;//next指针置空//
rear->next=s;//定义next指针//
rear=s;
printf("inputc:
");
scanf("%f",&n);//输入下一项的系数//
printf("inpute:
");
scanf("%d",&m);//输入下一项的指数//
}
head=head->next;
returnhead;//返回头结点//
}
voiddisplay(pnode*head)//多项式输出//
{
pnode*p;intone_time=1;p=head;
while(p!
=NULL)//判断头结点非空//
{
if(one_time==1)
{
if(p->e==0)//当指数为0即X^o时只需要输出系数c//
printf("%f",p->c);
elseif(p->c==1)//系数为1时输出X^ei//
printf("x^%d",p->e);
elseif(p->c==-1)//系数为-1时输出-X^ei//
printf("-x^%d",p->e);
elseif(p->c>0)//系数大于0时系数前面带“+”//
printf("+%fx^%d",p->c,p->e);
elseif(p->c<0)//系数为副时原样输出//
printf("%fx^%d",p->c,p->e);
one_time=0;
}
else{
if(p->e==0)
{if(p->c!
=0)
printf("+%f",p->c);
}
elseif(p->c==1)//系数为1时输出X^ei//
printf("+x^%d",p->e);
elseif(p->c==-1)//系数为-1时输出-X^ei//
printf("-x^%d",p->e);
elseif(p->c>0)//系数大于0时系数前面带“+”
printf("+%fx^%d",p->c,p->e);
elseif(p->c<0)//系数为副时原样输出//;
printf("%fx^%d",p->c,p->e)
}
p=p->next;
}
printf("\n");
}
pnode*add(pnode*heada,pnode*headb)//多项式相加//
{
pnode*headc,*p,*q,*s,*r;
floatx;
p=heada;//p指针指向第一个多项式的第一项//
q=headb;//q指针指向第二个多项式的第一项//
headc=(pnode*)malloc(sizeof(pnode));//为两式相加的结果c申请内存//
r=headc;//r指向结果//
while(p!
=NULL&&q!
=NULL)//判断两个式子都合法//
{
if(p->e==q->e)//指数相同时系数相加//
{x=p->c+q->c;
if(x!
=0)
{
s=(pnode*)malloc(sizeof(pnode));
s->c=x;
s->e=p->e;
r->next=s;
r=s;
}
q=q->next;p=p->next;//指向多项式的下一项//
}
elseif(p->e>q->e)//多项式按升幂排序//
{
s=(pnode*)malloc(sizeof(pnode));
s->c=q->c;
s->e=q->e;
r->next=s;
r=s;
q=q->next;
}
else
{
s=(pnode*)malloc(sizeof(pnode));
s->c=p->c;
s->e=p->e;
r->next=s;
r=s;
p=p->next;
}
}
while(p!
=NULL)//第一个式子不为0时的相加法则//
{
s=(pnode*)malloc(sizeof(pnode));
s->c=p->c;
s->e=p->e;
r->next=s;
r=s;
p=p->next;
}
while(q!
=NULL)//第二个式子不为0的相加法则//
{
s=(pnode*)malloc(sizeof(pnode));
s->c=q->c;
s->e=q->e;
r->next=s;
r=s;
q=q->next;
}
r->next=NULL;
headc=headc->next;//c的指向依次指向下一项//
returnheadc;//返回两式相加的结果//
}
voidmain()
{
pnode*a,*b,*c;//定义三个多项式//
printf("inputthefirst:
\n");//输入第一个多项式//
a=creat();//调用创建函数,创建第一个多项式//
printf("inputthesecond:
\n");//输入第二个多项式//
b=creat();//调用创建函数,创建第二个多项式//
c=add(a,b);//调用相加函数//
printf("thefirst:
");display(a);//输出第一个多项式//
printf("thesecond:
");display(b);//输出第二个多项式//
printf("sumis:
");display(c);//输出两多项式相加的结果//
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 一元 稀疏 多项式 加法 运算 数据结构 实习