数据结构课程设计一元多项式计算器Word格式.docx
《数据结构课程设计一元多项式计算器Word格式.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计一元多项式计算器Word格式.docx(14页珍藏版)》请在冰豆网上搜索。
D={ai|ai∈Termset,i=1,2,3·
,m,m≥0Termset中的每个元素包含一个表示系数的实数和表示指数的整数}
数据关系:
R1={<
ai-1,ai>
ai-1,ai∈D,且ai-1中的指数<
ai中的指数的值,i=1,2,3·
n}
基本操作:
Insert(p,h)
初始条件:
h已存在。
操作结果:
插入p项。
CreateLinklist(head,m)
建立一个头指针为head、项数为m的一元多项式。
DestroyLinklist(p)
一元多项式p已存在。
销毁一元多项式p。
PrintLinklist(P)
输出一元多项式p。
Compare(a,b)
项a,b已存在。
比较a,b中x的指数的大小。
AddLinklist(pa,pb)
一元多项式pa,pb已存在。
完成一元多项式pa,pb的相加运算。
SubtractionLinklist(Sa,Sb)
一元多项式Sa,Sb已存在。
完成一元多项式Sa,Sb的相减运算。
}ATDPloynomial
三、详细设计(源代码)
(使用C语言)
#include<
stdio.h>
malloc.h>
#definemaxlen10
#definelarge999
typedefstructLinklistomial
{
floatcoef;
intexpn;
structLinklistomial*next;
}Linklistomial,*Linklist;
//结点类型,指针类型
voidInsert(Linklistp,Linklisth)
{//h已存在插入p项
if(p->
coef==0)
free(p);
//系数为0的话释放结点
else
{
Linklistq1,q2;
q1=h;
q2=h->
next;
while(q2&
&
p->
expn<
q2->
expn)
{//查找插入位置
q1=q2;
q2=q2->
}
if(q2&
expn==q2->
{//将指数相同相合并
q2->
coef+=p->
coef;
if(!
coef)
{//系数为0的话释放结点
q1->
next=q2->
free(q2);
else{//指数为新时将结点插入
p->
next=q2;
next=p;
}
LinklistCreateLinklist(Linklisthead,intm)
{//建立一个头指针为head、项数为m的一元多项式
inti;
Linklistp;
p=head=(Linklist)malloc(sizeof(structLinklistomial));
head->
next=NULL;
for(i=0;
i<
m;
i++)
p=(Linklist)malloc(sizeof(structLinklistomial));
//建立新结点以接收数据
printf("
请输入第%d项的系数与指数:
"
i+1);
scanf("
%f%d"
&
coef,&
expn);
Insert(p,head);
//调用Insert函数插入结点
returnhead;
voidDestroyLinklist(Linklistp)
{//销毁多项式p
LinklistD1,D2;
D1=p;
while(D1)
D2=D1->
free(D1);
D1=D2;
voidPrintLinklist(LinklistP)
{//输出一元多项式p
Linklistq=P->
intflag=1;
//项数计数器
q)
{//若多项式为空,输出0
putchar('
0'
);
\n"
return;
while(q)
if(q->
coef>
0&
flag!
=1)putchar('
+'
//系数大于0且不是第一项
coef!
=1&
q->
=-1)
{//系数非1或-1的普通情况
%g"
q->
coef);
expn==1)putchar('
X'
elseif(q->
expn)printf("
X^%d"
coef==1)
1'
expn==1)
coef==-1)
-1"
-X"
-X^%d"
q=q->
flag++;
intCompare(Linklista,Linklistb)
{//比较a,b中x的指数的大小
if(a&
b)
b||a->
expn>
b->
return1;
elseif(!
a||a->
return-1;
return0;
a&
b)//a多项式已空,但b多项式非空
else//b多项式已空,但a多项式非空
LinklistAddLinklist(Linklistpa,Linklistpb)
{//求解并建立多项式a+b,返回其头指针
Linklistqa=pa->
Linklistqb=pb->
Linklistheadc,hc,qc;
hc=(Linklist)malloc(sizeof(structLinklistomial));
//建立头结点
hc->
headc=hc;
while(qa||qb)
qc=(Linklist)malloc(sizeof(structLinklistomial));
switch(Compare(qa,qb))
case1:
qc->
coef=qa->
expn=qa->
expn;
qa=qa->
break;
case0:
coef+qb->
qb=qb->
case-1:
coef=qb->
expn=qb->
if(qc->
=0)
next=hc->
next=qc;
hc=qc;
free(qc);
//当相加系数为0时,释放该结点
returnheadc;
LinklistSubtractionLinklist(LinklistSa,LinklistSb)
{//求解并建立多项式a-b,返回其头指针
LinklistCb=Sb->
while(Cb)
Cb->
coef=(-1)*Cb->
Cb=Cb->
returnAddLinklist(Sa,Sb);
intmain()
intm,n,a=1;
charflag;
Linklistpa=0,pb=0,pc;
欢迎使用一元多项式加法器\n\n"
//输出菜单
*******************************************************\n"
*一元多项式简单运算器*\n"
**\n"
*A:
输入多项式aB:
输入多项式b*\n"
*C:
输出多项式aD:
输出多项式b*\n"
*E:
输出a+bF:
输出a-b*\n"
*G:
使用完毕!
*\n"
while(a)
\n请选择操作:
%c"
flag);
//空格符号一定要注意
switch(flag)
case'
A'
:
a'
下面进行多项式a的输入:
请输入a的项数:
%d"
m);
pa=CreateLinklist(pa,m);
//建立多项式a
B'
b'
下面进行多项式b的输入:
请输入b的项数:
n);
pb=CreateLinklist(pb,n);
//建立多项式b
C'
c'
\n多项式a="
PrintLinklist(pa);
D'
d'
\n多项式b="
PrintLinklist(pb);
E'
e'
pc=AddLinklist(pa,pb);
\na+b="
PrintLinklist(pc);
F'
f'
pc=SubtractionLinklist(pa,pb);
\na-b="
G'
g'
DestroyLinklist(pa);
DestroyLinklist(pb);
a=0;
\n欢迎下次使用!
default:
\n您的选择错误,请重新选择!
四、调试分析
编译环境为CodeBlocks。