一元多项式的运算

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

数据结构课程设计实验报告

专业班级:

学号:

姓名:

2011年1月1日

题目:一元多项式的运算

1、题目描述

一元多项式的运算在此题中实现加、减法的运算,而多项式的减法可以通过加法来实现(只需在减法运算时系数前加负号)。

在数学上,一个一元n次多项式P n(X)可按降序写成:

P n(X)= P n X^n+ P(n-1)X^(n-1)+......+ P1X+P0

它由n+1个系数惟一确定,因此,在计算机里它可以用一个线性表P来表示:

P=(P n,P(n-1),......,P1,P0)

每一项的指数i隐含在其系数P i的序号里。

假设Q m(X)是一元m次多项式,同样可以用一个线性表Q来表示:

Q=(q m,q(m-1),.....,q1,q0)

不是一般性,假设吗吗m

R n(X)= P n(X)+ Q m(X)

很显然,可以对P,Q和R采用顺序存储结构,使得多项式相加的算法定义和实现简单化。然而,在通常的应用中,多项式的次数可能变化很大而且很高,使得顺序存储结构的最大长度很难确定。特别是在处理项数少且次数特别高的情况下,对内存空间的浪费是相当大的。因此,一般情况下,都采用链式存储结构来处理多项式的运算,使得两个线性链表分

别表示一元多项式P n(X)和Q m(X),每个结点表示多项式中的一项。

通过分析多项式的特征,不难看出多项式是由单项式构成的,而每个单项式都具有系数和指数,当系数为0时,该项就是去了意义,在计算机内要表示一个多项式,至少具有以下数据信息:系数信息、指数信息和指向下一个单项式的指针。通过指针,我们就可以把多个单项式连接起来,形成一个多项式。

2、任务要求

系数定义的是float型,范围是3.4*10^-38~3.4*10^38;指数定义的是int型,范围是-2147483648~+2147483647;输入多项式系数及指数,系统会自动将系数转化为浮点型。

功能:

(1).提示输入数据。要求先输入多项式的项数。

(2).创建多项式。接收输入的数据,并保存到链表中。

(3).显示已经创建好的多项式。

(4).实现加、减法运算。

(5).退出程序

3、概要设计

(1)链表结点的类型定义

(2)建立有序链表void CreatPolyn(LinkList &L,int n)

(3)多项式链表的相加void AddPolyn(LinkList La,LinkList Lb,LinkList &Lc)

(4)多项式链表的输出void printList(LinkList L)

4、详细设计

(1)链表结点的类型定义

typedef struct //在struct前使用关键字typedef,表示是声明新类型

{

float coef; //系数

int expn; //指数

}DataType; //DataType是新类型

typedef struct node //单链表的存储

{

DataType data; //数据域

struct node *next; //指向下一个结点

}ListNode,*LinkList; //ListNode是结点的新类型,LinkList是指向ListNode类型的结点的指针类型

(2)建立有序链表

要实现多项式的加法运算,首先要建立多项式的存储结构,每一个一元多项式的存储结构就是一个有序单链表。有序链表的基本操作定义与线性链表有两处不同,一个是结点的查找定位操作LocateNode有所不同,二是结点的插入操作InsertNode不同,这两个操作算法分别如下:

//结点的查找定位

int LocateNode(LinkList L,DataType e,int &q)

{

ListNode *p=L->next;

q=0;//记录结点位置序号

while(p&&e.expndata.expn)

{

p=p->next;

q++;

}

if(p==NULL||e.expn!=p->data.expn)

return 0;

else

return 1;

}

void InsertNode(LinkList &L,DataType e,int q)函数功能:将新的节点p插入到现有链表的后面,并确保多项式的指数expn是升序。将s节点插入到e所指向的链表。在该函数的操作中,要注意指针是如何移动的。

//有序链表结点的插入

void InsertNode(LinkList &L,DataType e,int q)

{

ListNode *s,*p;

int i=0;

p=L;

while(p->next && i

{

p=p->next;

i++;

}//查找插入位置

s=(ListNode*)malloc(sizeof(ListNode));

s->data.coef=e.coef;

s->data.expn=e.expn;

s->next=p->next;

p->next=s;

}

有了上述两个“结点的查找定位算法”和“有序链表结点的插入算法”,

int n保存的多项式的项数,使用for语句,控制输入多项式的每一项。当创建的链表长度为n时,将不再提示用户继续输入多项式的系数和指数。建立一个一元多项式的单链表的具体算法如下:

//多项式链表的建立

void CreatPolyn(LinkList &L,int n)

{

LinkList pa; //定义一个头指针为pa链表

int i,q; //i用来计输入的项数,q指结点的位置序号

DataType e; //插入的值e

pa=(ListNode*)malloc(sizeof(ListNode)); //生成链表头结点

pa->next=NULL;

for(i=1;i<=n;i++)

{

scanf("%f,%d",&e.coef,&e.expn);

if(!LocateNode(pa,e,q)) //当前链表中不存在该指数项

InsertNode(pa,e,q); //调用InsertNode函数插入结点

}

L=pa;

}

相关文档
最新文档