数据结构课程设计报告一元多项式加减乘除精Word文档下载推荐.docx
《数据结构课程设计报告一元多项式加减乘除精Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计报告一元多项式加减乘除精Word文档下载推荐.docx(37页珍藏版)》请在冰豆网上搜索。
5程序类的说明
(1)Ploy结构声明
typedefstruct//顺序表结构声明
{
inta[N];
//记录多项式
intlen;
//记录多项式的长度
}Ploy;
(2)term结构声明
typedefstruct//项的表示
{floatcoef;
//系数
intexpn;
//指数
}term;
(3)LNode结构声明
typedefstructLNode
{termdata;
//term多项式值
structLNode*next;
}LNode,*LinkList;
//两个类型名
typedefLinkListpolynomail;
//用带头结点的有序链表表示多项式
6模块分析
整个流程图如图所示:
图1
6.1创建模块
6.1.1、链式存储结构的一元多项式的创建
程序源代码:
polynomailcreatpolyn(polynomailP,intm)
{
//输入m项的系数和指数,建立表示一元多项式的有序链表P
polynomailr,q,p,s,Q;
inti;
P=(LNode*)malloc(sizeof(LNode));
r=P;
for(i=0;
i<
m;
i++)
{
s=(LNode*)malloc(sizeof(LNode));
printf("
请输入第%d项的系数和指数:
"
i+1);
scanf("
%f%d"
&
s->
data.coef,&
data.expn);
r->
next=s;
r=s;
}
next=NULL;
if(P->
next->
next!
=NULL)
for(q=P->
next;
q!
=NULL/*&
&
q->
=NULL*/;
q=q->
next)//合并同类项
for(p=q->
next,r=q;
p!
=NULL;
)
if(q->
data.expn==p->
data.expn)
{
q->
data.coef=q->
data.coef+p->
data.coef;
r->
next=p->
Q=p;
p=p->
free(Q);
}
else
{
r=r->
returnP;
}
6.1.2、顺序存储结构一元多项式的创建
voidGetPloy(Ploy*A)
inti,coef,ex,maxe=0;
charch;
请输入每个项的系数及对应的指数,指数为负数时标志输入结束!
\n"
);
N;
A->
a[i]=0;
%d%d"
coef,&
ex);
while(ex>
=0)
{
if(ex>
maxe)
maxe=ex;
if(A->
a[ex]!
{
printf("
你输入的项已经存在,是否更新原数据?
(Y/N)"
cin>
>
ch;
if(ch=='
Y'
||ch=='
y'
)
{
A->
a[ex]=coef;
printf("
更新成功,请继续输入!
}
else
请继续输入!
;
}
else
A->
scanf("
A->
len=maxe;
return;
}
6.2一元多项式的加法
6.2.1链式存储两多项式相加
polynomailaddpolyn(polynomailpa,polynomailpb)
//完成多项式相加运算,即:
Pa=Pa+Pb
polynomails,newp,q,p,r;
intj;
p=pa->
q=pb->
newp=(LNode*)malloc(sizeof(LNode));
r=newp;
while(p&
q)
switch(cmp(p->
data,q->
data))
case-1:
s->
data.coef=p->
s->
data.expn=p->
data.expn;
r->
r=s;
p=p->
break;
case0:
data.coef+q->
if(s->
data.coef!
=0.0)
{
s->
r->
r=s;
}
q=q->
break;
case1:
data.expn=q->
}//switch
}//while
6.2.2顺序存储的多项式相加
voidADD(PloyA,PloyB,Ploy*M)
/*多项式A与多项式B相加,得到多项式M*/
intla=A.len,lb=B.len,i;
M->
len=la>
lb?
la:
lb;
=la&
=lb;
M->
a[i]=A.a[i]+B.a[i];
while(i<
=la)
a[i]=A.a[i];
i++;
=lb)
a[i]=B.a[i];
return;
6.3一元多项式相减
6.3.1链式存储的多项式相减
/*3、两多项式相减*/
polynomailsubpolyn(polynomailpa,polynomailpb)
//完成多项式相减运算,即:
Pa=Pa-Pb
polynomails,newp,q,p,r,Q;
p=p->
case0:
data.coef-q->
{s->
r=s;
data.coef=-q->
q=q->
while(p)
while(q)
if(newp->
=NULL&
newp->
=NULL)//合并同类项
for(q=newp->
next)
Q=p;
free(Q);
else
{r=r->
p=p->
升序1,降序2\n"
选择:
%d"
j);
if(j==1)
arrange1(newp);
else
arrange2(newp);
returnnewp;
6.3.2顺序存储的多项式相减
voidSUB(PloyA,PloyB,Ploy*M)
/*多项式A与多项式B相减(A-B),得到多项式M*/
a[i]=A.a[i]-B.a[i];
=la){M->
i++;
=lb){M->
a[i]=0-B.a[i];
6.4一元多项式相乘
6.4.1链式存储的多项式相乘
polynomailmulpolyn(polynomailpa,polynomailpb)
//完成多项式相乘运算,即:
Pa=Pa*Pb
inti=20,j;
for(p=pa->
for(q=pb->
{
s=(LNode*)malloc(sizeof(LNode));
data.coef*q->
data.expn+q->
arrange1(newp);
arrange2(newp);
for(;
i!
=0;
i--)
for(q=newp->
for(p=q;
p->
if(q->
{
q->
r=p->
p->
free(r);
}
returnnewp;
6.4.2顺序存储多项式相乘
voidMUL(PloyA,PloyB,Ploy*M)
/*多项式A与多项式B相乘,得到多项式M*/
inti,j;
=A.len+B.len+1;
i++)M->
=A.len;
for(j=0;
j<
=B.len;
j++)
M->
a[i+j]+=A.a[i]*B.a[j];
len=A.len+B.len;
6.5一元多项式输出结果按项的指数排序
6.5.1链式由小到大排序
图6.6.1链式升序流程图
voidarrange1(polynomailpa)
{polynomailh=pa,p,q,r;
if(pa==NULL)exit(-2);
for(p=pa;
next);
r=p;
for(h=pa;
h->
=r;
)//大的沉底
{for(p=h;
=r&
if(cmp(p->
data,p->
data)==1)
{q=p->
p->
next=q->
q->
next=q;
//r指向参与比较的最后一个,不断向前移动
}}
6.5.2链式由大到小排序
图6.6.2链式降序流程图
voidarrange2(polynomailpa)
)//小的沉底
6.5.3顺序由大到小排序
voidPrintPloy1(PloyA)//降序输出顺序一元多项式
%dx^%d"
A.a[A.len],A.len);
for(i=A.len-1;
i>
=1;
if(A.a[i]==0);
elseif(A.a[i]==1)printf("
+x^%d"
i);
elseif(A.a[i]==-1)printf("
-x^%d"
if(A.a[i]>
0)
+%dx^%d"
A.a[i],i);
-%dx^%d"
-A.a[i],i);
if(A.a[0]==0);
elseif(A.a[0]>
printf("
+%d"
A.a[0]);
//打印x的0次项
-%d"
-A.a[0]);
6.5.4顺序由小到大排序
voidPrintPloy2(PloyA)//升序输出顺序一元多项式
inti=0;
while(A.a[i]==0)
++i;
if(i==0)
A.a[i]);
if(A.a[i]==1)
x^%d"
elseif(A.a[i]==-1)
-x^%d"
%dx^%d"
for(++i;
elseif(A.a[i]==1)
+x^%d"
elseif(A.a[i]==-1)
-x^%d"
elseif(A.a[i]>
1)
+%dx^%d"
elseif(A.a[i]<
-1)
-%dx^%d"
6.6一元多项式运算系统实现
6.6.1主菜单系统
voidMenu()
************一元多项式的基本运算系统************\n"
1、一元多项式顺序存储的子系统请按1\n"
2、一元多项式链式存储的基本运算请按2\n"
3、退出系统请按3\n"
************************************************\n"
请输入你想进行的操作号:
intn;
n);
while(n!
=1&
n!
=2&
=3)
对不起,你的输入不正确,请重新输入!
switch(n)
case1:
if(n==1)
shunxu();
break;
case2:
if(n==2)
link();
case3:
if(n==3)
已成功退出该系统,谢谢你的使用!
exit(-2);
6.6.2顺序子系统
voidMenushunxu()
********一元多项式顺序存储的基本运算********\n"
1、更新两个多项式一元多项式请按1\n"
2、两多项式相加得一新多项式请按2\n"
3、两多项式相减得一新多项式请按3\n"
4、两多项式相乘得一新多项式请按4\n"
5、退出该子系统,返回主菜单请按5\n"
6、退出该系统请按6\n"
********************************************\n"
voidshunxu()//一元多项式顺序存储的实现
PloyA,B,M;
intn,m;
进入顺序存储一元多项式运算子系统\n"
请输入多项式A:
GetPloy(&
A);
请输入多项式B:
B);
输出两个一元多项式A、B,降幂输出请按1,升幂输出请按2!
cin>
while(m<
1&
m>
m)
你输入的输出新创一元多项式的