数据结构课程设计报告一元稀疏多项式计算器.docx
《数据结构课程设计报告一元稀疏多项式计算器.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计报告一元稀疏多项式计算器.docx(9页珍藏版)》请在冰豆网上搜索。
数据结构课程设计报告一元稀疏多项式计算器
课程设计报告
1.需求分析
【问题描述】
设计一个一元稀疏多项式简单计算器.
【基本要求】
一元稀疏多项式基本功能包括:
1)输入并建立多项式;
2)输出多项式,输出形式为整数序列:
n,c1,e1,c2,e2,…,cn,en,其中n是多项式的项数,ci和ei分别是第i项的系数和指数,序列按指数降序排列;
3)多项式a和b相加,建立多项式a+b;
4)多项式a和b相减,建立多项式a-b;
【测试数据】
1)(2x+5x8-3.1x11)+(11x9-5x8+7)=(-3.1x11+11x8+2x+7)
2)(-1.2x9+6x-3+4.4x2-x)-(7.8x15+4.4x2-6x-3)=(-7.8x15-1.2x9+12x-3-x)
3)(x5+x4+x3+x2+x+1)-(-x4-x3)=(x5+x2+x+1)
4)(x3+x)-(-x3-x)=0
5)(x100+x)+(x200+x100)=(x200+2x100+x)
6)(x3+x2+x)+0=x3+x2+x
7)互换上述测试数据中的前后两个多项式.
2.概要设计
ADTPolynomial{
数据对象:
D={ai|ai?
TermSet,i=1,2,…,m,m≥0,TermSet中的每个元素包含一个表示系数的实数和表示指数的整数}
数据对象:
R1={|ai,ai-1?
D,且ai-1中的指数值小于ai中的指数,i=2,…,m}
基本操作:
CreatePolyn(void)
Result:
指数由大到小输入m项的系数和指数,建立一元多项式p
PrintPoly(LNodeHead)
Result:
输出一元多项式
AddPoly(LNodeH1,LNodeH2)
Condition:
一元多项式pa,pb已存在
Result:
完成多项式相加运算,即pa=pa+pb,并销毁一元多项式pb.
SubtractPoly(LNodeH1,LNodeH2)
Condition:
一元多项式pa,pb已存在
Result:
完成多项式相减运算,即pa=pa-pb,并销毁一元多项式pb.
}ADTPolynomial
3.详细设计
【数据类型定义】
typedefstructnode{
intexpn,coef;
structnode*next;
}Nodetype,*LNode;//定义结点类型
【函数原型定义】
LNodeCreatePolyn(void);
VoidPrintPoly(LNodeHead);
LNodeAddPolyn(LNodeH1,LNodeH2);
LNodeSubPolyn(LNodeH1,LNodeH2);
【核心算法描述】
CreatePolyn()
LNodeCreatePolyn(void)//创建表达式
{
LNodeHead,p,pre,pree;
intx,z;
Head=(LNode)malloc(sizeof(Nodetype));
Head->next=NULL;
printf("当你输入的系数为0时,输入将结束!
\n");
printf("请输入第一项系数:
");
scanf("%d",&x);
if(x==0)
{
p=(LNode)malloc(sizeof(LNode));
p->coef=0;
p->expn=0;
Head->next=p;
p->next=NULL;
}
while(x!
=0)
{
printf("请输入指数:
");
scanf("%d",&z);
p=(LNode)malloc(sizeof(Nodetype));
p->coef=x;
p->expn=z;
pre=Head;
while(pre->next&&pre->next->expn>=z)//原有项指数大于插入项
{
pree=pre;
pre=pre->next;
}
p->next=pre->next;//插入项
pre->next=p;
if(pre->expn==p->expn)//原有项指数等于插入项
{
pre->coef+=p->coef;
pre->next=p->next;
free(p);
}
if(pre->coef==0)//系数为0
{
pree->next=pre->next;
free(pre);
}
printf("请输入系数:
");
scanf("%d",&x);
}
if(Head->next==NULL)//多项式空
{
pre=(LNode)malloc(sizeof(LNode));
pre->coef=0;
pre->expn=0;
pre->next=Head->next;
Head->next=pre;
}
returnHead;
}
PrintPolyn()
voidPrintPolyn(LNodeHead)//输出表达式
{
LNodepre;
pre=Head->next;
if(pre->expn==0)//指数为0
printf("%d",pre->coef);
else
printf("%d*X(%d)",pre->coef,pre->expn);
pre=pre->next;
while(pre)//系数不为0
{
if(pre->expn==0)//指数为0
{
if(pre->coef>0)
printf("+%d",pre->coef);
elseif(pre->coef<0)
printf("%d",pre->coef);
}
else//指数不为0
{
if(pre->coef>0)
printf("+%d*X(%d)",pre->coef,pre->expn);
elseif(pre->coef<0)
printf("%d*X(%d)",pre->coef,pre->expn);
}
pre=pre->next;//遍历每一项
}
printf("\n");
}
AddPolyn()
LNodeAddPolyn(LNodeH1,LNodeH2)//表达式相加
{
LNodeH3,p1,p2,p3,pre;//p1第一个多项式的项,prep的前一项
H3=(LNode)malloc(sizeof(LNode));
H3->next=NULL;//建立一个空的多项式
p1=H1->next;//第一个多项式的第一项
p2=H2->next;
pre=H3;//
while(p1&&p2)
{
if(p1->expn>p2->expn)//第一个多项式的项的指数大于第二个的
{
p3=(LNode)malloc(sizeof(LNode));
p3->expn=p1->expn;
p3->coef=p1->coef;
p3->next=pre->next;
pre->next=p3;
pre=p3;
p1=p1->next;
}
elseif(p1->expnexpn)//第一个多项式的项的指数小于第二个的
{
p3=(LNode)malloc(sizeof(LNode));
p3->expn=p2->expn;
p3->coef=p2->coef;
p3->next=pre->next;
pre->next=p3;
pre=p3;
p2=p2->next;
}
elseif(p1->coef+p2->coef!
=0)//相加为不0,指数相同系数相加
{
p3=(LNode)malloc(sizeof(LNode));
p3->expn=p1->expn;
p3->coef=p1->coef+p2->coef;
p3->next=pre->next;
pre->next=p3;
pre=p3;
p1=p1->next;
p2=p2->next;
}
else//相加为0
{
p1=p1->next;
p2=p2->next;
}
}
while(p2)
{
p3=(LNode)malloc(sizeof(LNode));
p3->expn=p2->expn;
p3->coef=p2->coef;
p3->next=pre->next;
pre->next=p3;
pre=p3;
p2=p2->next;
}
while(p1)
{
p3=(LNode)malloc(sizeof(LNode));
p3->expn=p1->expn;
p3->coef=p1->coef;
p3->next=pre->next;
pre->next=p3;
pre=p3;
p1=p1->next;
}
returnH3;
}
Substract()
LNodeSubstractPolyn(LNodeH1,LNodeH2)//表达式相减
{//让系数变负,代入加法
LNodeH3,pre;
pre=H2->next;
while(pre)
{
pre->coef=-pre->coef;
pre=pre->next;
}
H3=AddPolyn(H1,H2);
pre=H2->next;
while(pre)
{
pre->coef=-pre->coef;
pre=pre->next;
}
returnH3;
}
【函数调用关系】
main()调用CreatePoly(),PrintPoly(),AddPoly(),scanf()函数输入,printf()函数输出。
4.运行记录
5.总结
首次做课程设计的题目,小激动,小紧张,编程的基础比较差,所以把第二章学习的内容仔仔细细的看完了一遍,但还不够,在老师问我问题时,我才发现我对next的理解出错了,对for语句也不太熟悉,所以找了好几个同学请教,终于理解多了一层,不容易啊。
下次要是还有机会做课程设计的话,一定要给自己多些时间,来把程序研究透,这跟实习一样,对编程技能很有提高效果,在过程中碰到不理解或不熟悉的地方就会翻课本,找课件,查资料,也学会了一些以前很不熟悉的函数的使用与作用。