数据结构课程设计一元多项式计算器.docx

上传人:b****8 文档编号:11468059 上传时间:2023-03-01 格式:DOCX 页数:16 大小:174.09KB
下载 相关 举报
数据结构课程设计一元多项式计算器.docx_第1页
第1页 / 共16页
数据结构课程设计一元多项式计算器.docx_第2页
第2页 / 共16页
数据结构课程设计一元多项式计算器.docx_第3页
第3页 / 共16页
数据结构课程设计一元多项式计算器.docx_第4页
第4页 / 共16页
数据结构课程设计一元多项式计算器.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

数据结构课程设计一元多项式计算器.docx

《数据结构课程设计一元多项式计算器.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计一元多项式计算器.docx(16页珍藏版)》请在冰豆网上搜索。

数据结构课程设计一元多项式计算器.docx

数据结构课程设计一元多项式计算器

实习1、一元稀疏多项式计算器

一、需求分析

1.问题描述

设计一个一元稀疏多项式简单计算器。

2.基本要求

一元稀疏多项式简单计算器的基本功能是:

(1)输入并建立多项式。

(2)输出多项式,输出形式为整数序列:

n,c1,e1,c2,e2,········,cn,en,其中n是多项式的项数,ci,ei分别是第i项的系数和指数,序列按指数降序排列。

(3)多项式a和b想加,建立多项式a+b。

(4)多项式a和b想减,建立多项式a-b。

3.测试数据

(1)(2x+5x8-3.1x11)+(7-5x8+11x9)=(-3.1x11+11x9+2x+7)

(2)(6x-3-x+4.4x2-1.2x9)-(-6x-3+5.4x2-x2+7.8x15)=(-7.8x15-1.2x9+12x-3-x)

(3)(1+x+x2+x3+x4+x5)+(-x3-x4)=(1+x+x2+x5)

(4)(x+x3)+(-x-x3)=0

(5)(x+x100)+(x100+x200)=(x+2x100+x200)

(6)(x+x2+x3)+0=(x+x2+x3)

(7)互换测试数据的前后两个多项式。

4.实现提示

用带表头结点的单链表存储多项式。

二、概要设计

为实现上述程序功能,应用带头结点的单链表存储多项式。

为此需要一个抽象数据类型:

一元多项式。

1.抽象数据类型一元多项式定义为:

ATDPloynomial{

数据对象:

D={ai|ai∈Termset,i=1,2,3···,m,m≥0Termset中的每个元素包含一个表示系数的实数和表示指数的整数}

数据关系:

R1={ai-1,ai∈D,且ai-1中的指数

基本操作:

Insert(p,h)

初始条件:

h已存在。

操作结果:

插入p项。

CreateLinklist(head,m)

操作结果:

建立一个头指针为head、项数为m的一元多项式。

DestroyLinklist(p)

初始条件:

一元多项式p已存在。

操作结果:

销毁一元多项式p。

PrintLinklist(P)

初始条件:

一元多项式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

#include

#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->expnexpn)

{//查找插入位置

q1=q2;

q2=q2->next;

}

if(q2&&p->expn==q2->expn)

{//将指数相同相合并

q2->coef+=p->coef;

free(p);

if(!

q2->coef)

{//系数为0的话释放结点

q1->next=q2->next;

free(q2);

}

}

else{//指数为新时将结点插入

p->next=q2;

q1->next=p;}

}

}

LinklistCreateLinklist(Linklisthead,intm)

{//建立一个头指针为head、项数为m的一元多项式

inti;

Linklistp;

p=head=(Linklist)malloc(sizeof(structLinklistomial));

head->next=NULL;

for(i=0;i

{

p=(Linklist)malloc(sizeof(structLinklistomial));//建立新结点以接收数据

printf("请输入第%d项的系数与指数:

",i+1);

scanf("%f%d",&p->coef,&p->expn);

Insert(p,head);//调用Insert函数插入结点

}

returnhead;

}

voidDestroyLinklist(Linklistp)

{//销毁多项式p

LinklistD1,D2;

D1=p;

while(D1)

{

D2=D1->next;

free(D1);

D1=D2;

}

}

voidPrintLinklist(LinklistP)

{//输出一元多项式p

Linklistq=P->next;

intflag=1;//项数计数器

if(!

q)

{//若多项式为空,输出0

putchar('0');

printf("\n");

return;

}

while(q)

{

if(q->coef>0&&flag!

=1)putchar('+');//系数大于0且不是第一项

if(q->coef!

=1&&q->coef!

=-1)

{//系数非1或-1的普通情况

printf("%g",q->coef);

if(q->expn==1)putchar('X');

elseif(q->expn)printf("X^%d",q->expn);

}

else

{

if(q->coef==1)

{

if(!

q->expn)

putchar('1');

elseif(q->expn==1)

putchar('X');

else

printf("X^%d",q->expn);

}

if(q->coef==-1)

{

if(!

q->expn)

printf("-1");

elseif(q->expn==1)

printf("-X");

else

printf("-X^%d",q->expn);

}

}

q=q->next;

flag++;

}

printf("\n");

}

intCompare(Linklista,Linklistb)

{//比较a,b中x的指数的大小

if(a&&b)

{

if(!

b||a->expn>b->expn)

return1;

elseif(!

a||a->expnexpn)

return-1;

else

return0;

}

elseif(!

a&&b)//a多项式已空,但b多项式非空

return-1;

else//b多项式已空,但a多项式非空

return1;

}

LinklistAddLinklist(Linklistpa,Linklistpb)

{//求解并建立多项式a+b,返回其头指针

Linklistqa=pa->next;

Linklistqb=pb->next;

Linklistheadc,hc,qc;

hc=(Linklist)malloc(sizeof(structLinklistomial));//建立头结点

hc->next=NULL;

headc=hc;

while(qa||qb)

{

qc=(Linklist)malloc(sizeof(structLinklistomial));

switch(Compare(qa,qb))

{

case1:

{

qc->coef=qa->coef;

qc->expn=qa->expn;

qa=qa->next;

break;

}

case0:

{

qc->coef=qa->coef+qb->coef;

qc->expn=qa->expn;

qa=qa->next;

qb=qb->next;

break;

}

case-1:

{

qc->coef=qb->coef;

qc->expn=qb->expn;

qb=qb->next;

break;

}

}

if(qc->coef!

=0)

{

qc->next=hc->next;

hc->next=qc;

hc=qc;

}

else

free(qc);//当相加系数为0时,释放该结点

}

returnheadc;

}

LinklistSubtractionLinklist(LinklistSa,LinklistSb)

{//求解并建立多项式a-b,返回其头指针

LinklistCb=Sb->next;

while(Cb)

{

Cb->coef=(-1)*Cb->coef;

Cb=Cb->next;

}

returnAddLinklist(Sa,Sb);

}

intmain()

{

intm,n,a=1;

charflag;

Linklistpa=0,pb=0,pc;

printf("欢迎使用一元多项式加法器\n\n");//输出菜单

printf("*******************************************************\n");

printf("*一元多项式简单运算器*\n");

printf("**\n");

printf("*A:

输入多项式aB:

输入多项式b*\n");

printf("**\n");

printf("*C:

输出多项式aD:

输出多项式b*\n");

printf("**\n");

printf("*E:

输出a+bF:

输出a-b*\n");

printf("**\n");

printf("*G:

使用完毕!

*\n");

printf("*******************************************************\n");

while(a)

{

printf("\n请选择操作:

");

scanf("%c",&flag);//空格符号一定要注意

switch(flag)

{

case'A':

case'a':

{

printf("下面进行多项式a的输入:

\n");

printf("请输入a的项数:

");

scanf("%d",&m);

pa=CreateLinklist(pa,m);//建立多项式a

break;

}

case'B':

case'b':

{

printf("下面进行多项式b的输入:

\n");

printf("请输入b的项数:

");

scanf("%d",&n);

pb=CreateLinklist(pb,n);//建立多项式b

break;

}

case'C':

case'c':

{

printf("\n多项式a=");

PrintLinklist(pa);

break;

}

case'D':

case'd':

{

printf("\n多项式b=");

PrintLinklist(pb);

break;

}

case'E':

case'e':

{

pc=AddLinklist(pa,pb);

printf("\na+b=");

PrintLinklist(pc);

break;

}

case'F':

case'f':

{

pc=SubtractionLinklist(pa,pb);

printf("\na-b=");

PrintLinklist(pc);

break;

}

case'G':

case'g':

{

DestroyLinklist(pa);

DestroyLinklist(pb);

a=0;

printf("\n欢迎下次使用!

\n");

break;

}

default:

printf("\n您的选择错误,请重新选择!

\n");

}

}

return0;

}

四、调试分析

编译环境为CodeBlocks。

 

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 艺术

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1