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

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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

一、需求分析

1. 问题描述

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

2. 基本要求

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

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

(2)输出多项式,输出形式为整数序列:n, c1, e1, c2, e2, ·,c n, e n ,其中n是多项式的项数,c i,e i分别是第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.抽象数据类型一元多项式定义为:

ATD Ploynomial{

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

数据关系: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的相减运算。} ATD Ploynomial

三、详细设计(源代码)

(使用C语言)

#include

#include

#define maxlen 10

#define large 999

typedef struct Linklistomial

{

float coef;

int expn;

struct Linklistomial *next;

}Linklistomial,*Linklist;//结点类型,指针类型

void Insert(Linklist p,Linklist h)

{// h已存在插入p项

if(p->coef==0)

free(p);//系数为0的话释放结点

else

{

Linklist q1,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; }

}

}

Linklist CreateLinklist(Linklist head,int m)

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

int i;

Linklist p;

p=head=(Linklist)malloc(sizeof(struct Linklistomial));

head->next=NULL;

for(i=0;i

{

p=(Linklist)malloc(sizeof(struct Linklistomial));//建立新结点以接收数据 printf("请输入第%d项的系数与指数:",i+1);

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

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

}

return head;

}

void DestroyLinklist(Linklist p)

{//销毁多项式p

Linklist D1,D2;

D1=p;

while(D1)

{

D2=D1->next;

free(D1);

D1=D2;

}

}

void PrintLinklist(Linklist P)

{//输出一元多项式p

Linklist q=P->next;

相关文档
最新文档