当前位置:文档之家› 一元多项式计算程序报告

一元多项式计算程序报告

一元多项式计算程序报告
一元多项式计算程序报告

合肥学院

课程设计题目:

(一元多项式计算问题)一元多项式计算。要求:能够按照指数降序排列建立并输出一元多项式;能够完成两个一元多项式的相加、相减,并将结果输入。

1、问题分析和任务定义

(1).任务定义:

此程序需要完成如下的要求:将多项式按照指数降序排列建立并输出,将两个一元多项式进行相加、相减操作,并将结果输入。

a:输入并建立多项式;

b:输出多项式,输出形式为表达式的形式,并且多项式的指数为降序;

c:多项式a和b相加,建立多项式a+b;

d:多项式a和b相减,建立多项式a-b。

e:多项式的输出形式为类数学表达式。

(2).问题分析:

本程序的关键点在于如何将输入的一元多项式按指数的降序进行排列,而难点就是将输入的两个一元多项式进行相加、相减操作。

实现本程序需要解决以下几个问题:

1、如何将输入的一元多项式按指数的降序进行排列;

2、如何确定要输入的多项式的项数;

3、如何将输入的两个一元多项式进行显示出来;

4、如何将输入的两个一元多项式进行相加操作;

5、如何将输入的两个一元多项式进行相减操作。

次程序是链表的应用,通过链表实现一元多项式的相加相减操作。

要对一元多项式进行表示:

一元多项式的表示在计算机内可以用链表来表示为了节省存储空间,我们只存储多项式中系数非0 的项。链表中的每一个节点存放多项式的一个系数非0项,它包含三个域,分别存放该项的系数、指数以及指向下一多项式项节点的指针。

下图1所示为该结点的结构:

图1结点的结构

创建一元多项式链表,对一元多项式的运算中会出现各种可能情况进行分析,实现一元多项式的相加、相减操作。

2、数据结构的选择和概要设计

本题设计要求能够按照指数降序排列建立并输出多项式;能够完成两个多项式的相加,相减,并将结果输入。

(1)数据结构的选用

A:基于链表中的节点可以动态生成的特点,以及链表可以灵活的添加或删除节点的数据结构,为了实现任意多项式的加法,减法,因此选择单链表的结构体,它有一个系数,指数,下一个指针3个元属;例如,图2中的两个线性链表分别表示一元多项式和一元多项式。从图中可见,每个

结点表示多项式中的一项。

图2 多项式表的单链存储结构

B:本设计使用了以下数据结构:

struct Node

{ //结点类型

float coef; //系数

int exp; //指数

};

C:设计本程序需用到九个模块,用到以下九个子函数如下:

1、CreateLink(Link &L,int n); //创建含有n个链表类型结点的项,即创建一个n项多项式

2、PrintList(Link L); //输出链表

3、PolyAdd(Link &pc,Link pa,Link pb); //将两个一元多项式相加

4、PolySubstract(Link &pc,Link pa,Link pb);// 将两个一元多项式相减

5、CopyLink(Link &pc,Link pa); //把一个链表的内容复制给另一个链表

6、JudgeIfExpSame(Link pa,Link e); /*判断指数是否与多项式中已存在的某项相同*/

7、DestroyLink(Link &L);

8、Menu()//菜单函数

9、main()//主程序模块调用链一元多项式的各种基本操作模块。

(2)多项式的输入

采用尾插法的方式,输入多项式中一个项的系数和指数,就产生一个新的节点,建立起它的右指针,并用头节点指向它;为了判断一个多项式是否输入结束,在输入前先确定要输入的项数。

(3)两个多项式的加法

“和多项式”链表中的结点无需另生成,而应该从两个多项式的链表中摘取。其运算规则如下:

假设指针q a和q b分别指向多项式A和多项式B中当前进行比较的某个结点,则比较两个结点中的指数项,有下列3种情况:

①指针q a所指结点的指数值<指针q b所指结点的指数值,则应摘取q a指针所指结点插入到“和多项式”链表中去;

②指针q a所指结点的指数值>指针q b所指结点的指数值,则应摘取指针q b所指结点插入到“和多项式”链表中去;

③指针q a所指结点的指数值=指针q b所指结点的指数值,则将两个结点中的系数相加,

若和数不为零,则修改q a所指结点的系数值,同时释放q b所指结点;反之,从多项式A的链表中删除相应结点,并释放指针q a和q b所指结点。例如,由图2中的两个链表表示的多项式相加得到的“和多项式”链表如图3所示,图中的长方框表示已被释放的结点。

图3 相加得到的和多项式

上述多项式的相加过程归并两个有序表的过程极其类似,不同之处仅在于,后者在比较数据元素时只出现两种情况。因此,多项式相加的过程也完全可以利用线性链表的基本操作来完成。

(4)两个多项式的减法

两个多项式的减法实现,是从2个多项式的尾部开始,2个多项式的某一项都不为空时,如果指数相等的话,系数就应该相减;相减的和不为0的话,用尾插法建立一个新的节点。p的系数小于q的系数的话,就应该复制q接点到多项式中。p的系数大于q的系数的话,就应该复制p接点到多项式中,并且建立的接点的系数为原来的相反数;当第2个多项式空,第1个数不为空时,将第一个数剩下的全用新节点产生。当第1个多项式空,第1个数不为空时,将第2个数剩下的全用新节点产生,并且建立的接点的系数为原来的相反数。

(5)程序流程图:

一元多项式相减流程图如图4:

图4多项式相减流程图一元多项式相加流程图如图5:

图5相加流程图

3、详细设计和编码

(1)、算法思想

(1)输入并建立多项式——CreateLink ()

(2)输出多项式,输出形式为整数序列,序列按指数降序排列——PrintList ()

(3)多项式a和b相加,建立多项式a+b,输出相加的多项式——PolyAdd ()

(4)多项式a和b相减,建立多项式a-b,输出相减的多项式——PolySubstract ()用带表头结点的单链表存储多项式。

此程序需要完成如下的要求:将多项式按照指数降序排列建立并输出,将两个一元多项式进行相加、相减操作,并将结果输入。

(2)、算法描述

1、定义结点类型

用float cofe表示一元多项式的系数,int exp表示一元多项式的指数创建链表的结点类型。

struct Node

{float coef;//结点类型

int exp;

};

2、定义链表的类型

struct LNode

{polynomial data;//链表类型

LNode *next;

};

3、创建含有n个链表类型结点的项,即创建一个n项多项式,用函数void CreateLink(Link &L,int n)表示,创建头结点(L->data).exp=-1; 创建多项式没有成功,递归调用重新创建CreateLink(L,n);

4、用函数int JudgeIfExpSame(Link L,Link e)判断指数是否与多项式中已存在的某项相同,如果输入的一元多项式有重复的指数需重新输入。

5输出链表用函数void PrintList(Link L)表示,这个部分根据项系数的不同分为项的系数大于0的5种情况和项的系数小于0的5种情况。

6、链表内容的复制:把一个链表的内容复制给另一个链表用函数void CopyLink(Link &pc,Link pa)表示。

8、将多项式按照指数降序排列建立并输出,本程序用冒泡排序的方法将多项式的指数从大到小的顺序进行排列void paixu(Link head1)

对链表进行排序过程中用循环来确定链表的长度

while(head1!=NULL){

n++;

head1=head1->next;

}

将链表中的元素按照从大到小的顺序排列

if((p->data).exp<(q->data).exp){

(m->data).coef=(p->data).coef;

(m->data).exp=(p->data).exp;

(p->data).coef=(q->data).coef;

(p->data).exp=(q->data).exp;

(q->data).coef=(m->data).coef;

(q->data).exp=(m->data).exp;

}

9、将两个一元多项式相加用函数void PolyAdd(Link &pc,Link pa,Link pb)表示

“和多项式”链表中的结点无需另生成,而应该从两个多项式的链表中摘取。其运算规则如下:

假设指针q a和q b分别指向多项式A和多项式B中当前进行比较的某个结点,则比较两个结点中的指数项,有下列3种情况:

①指针q a所指结点的指数值<指针q b所指结点的指数值,则应摘取q a指针所指结点插入到“和多项式”链表中去;

②指针q a所指结点的指数值>指针q b所指结点的指数值,则应摘取指针q b所指结点插入到“和多项式”链表中去;

③指针q a所指结点的指数值=指针q b所指结点的指数值,则将两个结点中的系数相加,若和数不为零,则修改q a所指结点的系数值,同时释放q b所指结点;反之,从多项式A 的链表中删除相应结点,并释放指针q a和q b所指结点。10、将两个多项式相减

10、将两个一元多项式相减用函数void PolySubstract(Link &pc,Link pa,Link pb)表示,两个多项式的减法实现,是从2个多项式的尾部开始,2个多项式的某一项都不为空时,如果指数相等的话,系数就应该相减;相减的和不为0的话,用尾插法建立一个新的节点。p的系数小于q的系数的话,就应该复制q接点到多项式中。p的系数大于q的系数的话,就应该复制p接点到多项式中,并且建立的接点的系数为原来的相反数;当第2个多项式空,第1个数不为空时,将第一个数剩下的全用新节点产生。当第1个多项式空,第1个数不为空时,将第2个数剩下的全用新节点产生,并且建立的接点的系数为原来的相反数。

4、上机调试

1、语法错误及修改:编译中出现的语法问题主要在于子函数和变量的定义,括号的配对,关键字和函数名称的书写,以及一些库函数的规范使用。这些问题均可以根据编译器的警告提示,对应的将其解决。

2、逻辑问题修改和调整:由于一元多项式的计算中,在输入多项式的系数和一元多项式的指数是会有多种情况,所以设计过程中经常出现各种没有考虑到的情况,通过查找课本和资料最终比较全面的囊括了一元多项式会出现的各种情况。

3、经验体会:在开始看到程序题目的时候会以为一元多项式的加减会很简单,可是在课程设计的过程中发现程序的编写并不是开始想象的那么简单,在这过程也中遇到了难题,比如题目的要求中要对一元多项式的指数进行排序实现从大到小的循序进行输入,所以在对指数的排序中运行经常出错,最终用冒泡排序的方法解决了这个问题。

5、测试结果及其分析

菜单界面如图6:

图6菜单界面

创建要运算的两个一元多项式如图7:

图7创建要运算的两个一元多项式

显示输入的两个多项式如图8:

图8显示输入的两个多项式将两个一元多项式相加如图9:

图9将两个一元多项式相加将两个一元多项式相减如图10:

图10多项式相减

销毁创建的两个多项式如图11:

图11销毁创建的两个多项式

6、用户使用说明

本程序运行后出现菜单界面,根据菜单提示进行操作。在创建多项式多项式的时候根据提示先确定要输入的多项式的项数,再依次输入各项的系数和指数,值得注意的时候在输入指数的时候输入的指数一定不能小于0,当指数小于0的时候会提示出“你输入有误,指数不允许为负!”重新输入;在输入的项数中如果出现前面已经输入过的系数时会出现提示重新输入。

7、参考文献

[1] 郑莉,董渊,张瑞丰C++语言程序设计(第3版)清华大学出版社

[2] 王昆仑,李红数据结构与算法中国铁道出版社

8、附录(源程序)

#include

using namespace std;

struct Node

{

float coef;//结点类型

int exp;

};

typedef Node polynomial;

struct LNode

{

polynomial data;//链表类型

LNode *next;

};

typedef LNode* Link;

void CreateLink(Link &L,int n);

void PrintList(Link L);

void PolyAdd(Link &pc,Link pa,Link pb);

void PolySubstract(Link &pc,Link pa,Link pb);

void CopyLink(Link &pc,Link pa);

int JudgeIfExpSame(Link pa,Link e);

void DestroyLink(Link &L);

int CompareIfNum(int i);

void DestroyLink(Link &L)

{

Link p;

p=L->next;

while(p)

{

L->next=p->next;

delete p;

p=L->next;

}

delete L;

L=NULL;

}

//创建含有n个链表类型结点的项,即创建一个n项多项式void CreateLink(Link &L,int n)

{

if(L!=NULL)

{

DestroyLink(L);

}

Link p,q,newp;

L=new LNode;

L->next=NULL;

(L->data).exp=-1;//创建头结点

p=L;

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

{

newp=new LNode;

cout<<"请输入第"<

cout<<"系数:";

cin>>(newp->data).coef;

cout<<"指数:";

cin>>(newp->data).exp;

if(newp->data.exp<0)

{cout<<"您输入有误,指数不允许为负值!"<

delete newp;

i--;

continue;

}

newp->next=NULL;

p=L;

if(newp->data.coef==0)

{

cout<<"系数为零,重新输入!"<

delete newp;

i--;

continue;

}

while((p->next!=NULL)&&((p->next->data).exp>(newp->data).exp))

{

p=p->next; //p指向指数最小的那一个

}

q=p->next;

if(!JudgeIfExpSame( L, newp))

{p->next=newp;

newp->next=q;

}

else

{

cout<<"输入的该项指数与多项式中已存在的某项相同,请重新创建一个正确的多项"<

DestroyLink(L);

CreateLink(L,n); //创建多项式没有成功,递归调用重新创建

break;

}

}

}

/*判断指数是否与多项式中已存在的某项相同*/ int JudgeIfExpSame(Link L,Link e)

{

Link p;

p=L->next;

while(p!=NULL&&(e->data.exp!=p->data.exp)) p=p->next;

if(p==NULL)return 0;

else return 1;

}

/*输出链表*/

void PrintList(Link L)

{

Link p;

if(L==NULL||L->next==NULL)

cout<<"该一元多项式为空!"<

else

{

p=L->next;

//项的系数大于0的5种情况

if((p->data).coef>0)

{

if((p->data).exp==0)

cout<<(p->data).coef;

else if((p->data).coef==1&&(p->data).exp==1) cout<<"x";

else if((p->data).coef==1&&(p->data).exp!=1) cout<<"x^"<<(p->data).exp;

else if((p->data).exp==1&&(p->data).coef!=1) cout<<(p->data).coef<<"x";

else cout<<(p->data).coef<<"x^"<<(p->data).exp; }

//项的系数小于0的5种情况

if((p->data).coef<0)

{

if((p->data).exp==0)

cout<<(p->data).coef;

else if(p->data.coef==-1&&p->data.exp==1)

cout<<"-x";

else if(p->data.coef==-1&&p->data.exp!=1)

cout<<"-x^"<data.exp;

else if(p->data.exp==1)

cout<data.coef<<"x";

else cout<<(p->data).coef<<"x^"<<(p->data).exp;

}

p=p->next;

while(p!=NULL)

{if((p->data).coef>0)

{if((p->data).exp==0)

cout<<"+"<<(p->data).coef;

else if((p->data).exp==1&&(p->data).coef!=1)

cout<<"+"<<(p->data).coef<<"x";

else if((p->data).exp==1&&(p->data).coef==1)

cout<<"+"<<"x";

else if((p->data).coef==1&&(p->data).exp!=1)

cout<<"+"<<"x^"<<(p->data).exp;

else cout<<"+"<<(p->data).coef<<"x^"<<(p->data).exp; }

if((p->data).coef<0)

{

if((p->data).exp==0)

cout<<(p->data).coef;

else if(p->data.coef==-1&&p->data.exp==1)

cout<<"-x";

else if(p->data.coef==-1&&p->data.exp!=1)

cout<<"-x^"<data.exp;

else if(p->data.exp==1)

cout<data.coef<<"x";

else cout<<(p->data).coef<<"x^"<<(p->data).exp;

}

p=p->next;

}

}

cout<

}

/*把一个链表的内容复制给另一个链表*/

void CopyLink(Link &pc,Link pa)

{

Link p,q,r;

pc=new LNode;

pc->next=NULL;

r=pc;

p=pa;

while(p->next!=NULL)

{

q=new LNode;

q->data.coef=p->next->data.coef;

q->data.exp=p->next->data.exp;

r->next=q;

q->next=NULL;

r=q;

p=p->next;

}

}

//对链表进行排序

void paixu(Link head1)

{

Link m,p1,p,q;

m=new LNode;

int n,i,j;

p1=head1;

while(head1!=NULL){ //用循环来确定链表的长度

n++;

head1=head1->next;

}

head1=p1;

head1=head1->next;

for(p=head1;p!=NULL;p=p->next) //冒泡排序

for(q=p->next;q!=NULL;q=q->next)

if((p->data).exp<(q->data).exp){ //将链表中的元素按照从大到小的顺序排列(m->data).coef=(p->data).coef;

(m->data).exp=(p->data).exp;

(p->data).coef=(q->data).coef;

(p->data).exp=(q->data).exp;

(q->data).coef=(m->data).coef;

(q->data).exp=(m->data).exp;

}

head1=p1;

}

/*将两个一元多项式相加*/

void PolyAdd(Link &pc,Link pa,Link pb)

{

Link p1,p2,p,pd;

CopyLink(p1,pa);

CopyLink(p2,pb);

pc=new LNode;

pc->next=NULL;

p=pc;

p1=p1->next;

p2=p2->next;

while(p1!=NULL&&p2!=NULL)

{

if(p1->data.expdata.exp)

{

p->next=p1;

p=p->next;

p1=p1->next;

}

else if(p1->data.exp>p2->data.exp)

{

p->next=p2;

p=p->next;

p2=p2->next;

}

else

{p1->data.coef=p1->data.coef+p2->data.coef; if(p1->data.coef!=0)

{

p->next=p1;

p=p->next;

p1=p1->next;

p2=p2->next;

}

else

{pd=p1;

p1=p1->next;

p2=p2->next;

delete pd;

}

}

}

if(p1!=NULL)

{

p->next=p1;

}

if(p2!=NULL)

{p->next=p2;

}

paixu(pc);

}

/*将两个多项式相减*/

void PolySubstract(Link &pc,Link pa,Link pb)

{

Link p,pt;

CopyLink(pt,pb);

p=pt;

while(p!=NULL)

{

(p->data).coef=(-(p->data).coef);

p=p->next;

}

PolyAdd(pc,pa,pt);

DestroyLink(pt);

}

//清屏函数

void Clear()

{system("pause");

system("cls");

}

//菜单函数

void Menu()

{

cout<<"\t*\t\t *"<

cout<

cout<<"\t*******************一元多项式的简单运算*********************"<

cout<<"\t*\t\t 1创建要运算的两个一元多项式\t\t *"<

cout<<"\t*\t\t 2将两个一元多项式相加\t\t\t *"<

cout<<"\t*\t\t 3将两个一元多项式相减\t\t\t *"<

cout<<"\t*\t\t 4显示两个一元多项式\t\t\t *"<

cout<<"\t*\t\t 5销毁所创建的二个多项式\t\t *"<

cout<<"\t*\t\t 6退出\t\t\t\t\t *"<

cout<<"\t*\t\t\t\t\t\t\t *"<

cout<<"\t*******************一元多项式的简单运算*********************"<

cout<<"\t*\t\t 请输入你要进行的操作(1-6)\t\t *"<

}

//判断输入的整数是不是为1到6的数字

int CompareIfNum(int i)

{

if(i>0&&i<8)

return 0;

else return 1;

}

void main()

{

int n;

Link L,La=NULL,Lb=NULL;//La,Lb分别为创建的两个多项式

int choose;

while(1)

{

Menu(); //调用菜单函数

cin>>choose;

switch(choose)

{

case 1:

cout<<"请输入你要运算的第一个一元多项式的项数:"<

cin>>n;

if(CompareIfNum(n)==1)

{

cout<<"您的输入有误,请重新输入……"<

Clear();

break;

}

CreateLink(La,n);

cout<<"请输入你要运算的第二个一元多项式的项数:"<

cin>>n;

if(CompareIfNum(n)==1)

{

cout<<"您的输入有误,请重新输入……"<

Clear();

break;

}

CreateLink(Lb,n);

Clear();

break;

case 2:

if(La==NULL||Lb==NULL)

{cout<<"您的多项式创建有误,请重新选择……"<

Clear();

break;

}

PolyAdd(L,La,Lb);

cout<<"相加的两个一元多项式为:"<

PrintList(La);

PrintList(Lb);

cout<<"相加后的结果为:"<

PrintList(L);

Clear();

DestroyLink(L);

break;

case 3:

if(La==NULL||Lb==NULL)

{

cout<<"您的多项式创建有误,请重新选择……"<

break;

}

PolySubstract(L,La,Lb);

cout<<"相减的两个一元多项式为:"<

PrintList(La);

PrintList(Lb);

cout<<"相减后的结果为:"<

PrintList(L);

Clear();

DestroyLink(L);

break;

case 4:

if(La==NULL||Lb==NULL)

{

cout<<"您的多项式创建有误,请重新选择……"<

break;

}

cout<<"第一个一元多项式为:"<

PrintList(La);

cout<<"第二个一元多项式为:"<

PrintList(Lb);

Clear();

break;

case 5:

if(La&&Lb)

{

DestroyLink(La);

DestroyLink(Lb);

cout<<"多项式销毁成功!"<

Clear();

}

else

{

cout<<"多项式不存在,请重新选择^^^"<

Clear();

}

break;

case 6:

exit(0); //exit(0)强制终止程序,返回状态码0表示正常结束default:

cout<<"您的输入有误,请重新选择操作……"<

break;

}

}

}

顺序链式一元多项式加法、减法、乘法运算的实现

1.1设计内容及要求 1)设计内容 (1)使用顺序存储结构实现多项式加、减、乘运算。 例如: 10321058)(2456+-+-+=x x x x x x f ,x x x x x x g +--+=23451020107)( 求和结果:102220128)()(2356++-+=+x x x x x g x f (2)使用链式存储结构实现多项式加、减、乘运算, 10305100)(1050100+-+=x x x x f ,x x x x x x g 320405150)(10205090+++-= 求和结果:1031040150100)()(102090100++-++=+x x x x x x g x f 2)设计要求 (1)用C 语言编程实现上述实验内容中的结构定义和算法。 (2)要有main()函数,并且在main()函数中使用检测数据调用上述算法。 (3)用switch 语句设计如下选择式菜单。 ***************数据结构综合性实验**************** *******一、多项式的加法、减法、乘法运算********** ******* 1.多项式创建 ********** ******* 2.多项式相加 ********** ******* 3.多项式相减 ********** ******* 4.多项式相乘 ********** ******* 5.清空多项式 ********** ******* 0.退出系统 ********** ******* 请选择(0—5) ********** ************************************************* *请选择(0-5): 1.2数据结构设计 根据下面给出的存储结构定义: #define MAXSIZE 20 //定义线性表最大容量

一元稀疏多项式计算器实验(报告+程序)

一元稀疏多项式计数器预习报告 :刘茂学号0062 一、实验要求 (1)输入并建立多项式; (2)输出多项式,输出形式为整数序列:n,c1,e1,c2,e2……cn,en,其中n是多项式的项数,ci,ei分别为第i项的系数和指数。序列按指数降序排列; (3)多项式a和b相加,建立多项式a+b; (4)多项式a和b相减,建立多项式a-b。 (5)多项式求值; (6)多项式求导; (7)求多项式的乘积。 二、测试数据: 1、(2x+5x^8-3.1x^11)+(7-5x^8+11x^9)=(-3.1x^11+11x^9+2x+7); 2、(6x^-3-x+4.4x^2-1.2x^9+1.2x^9)-(-6x^-3+5.4x^2-x^2+7.8x^15 )=(-7.8x^15-1.2x^9+12x^-3-x); 3、(1+x+x^2+x^3+x^4+x^5)+(-x^3-x^4)=(1+x+x^2+x^5); 4、(x+x^3)+(-x-x^3)=0; 5、(x+x^100)+(x^100+x^200)=(x+2x^100+x^200); 6、(x+x^2+x^3)+0=x+x^2+x^3. 7、互换上述测试数据中的前后两个多项式。

三、思路分析 用带表头结点的单链表存储多项式。 本程序要求输入并建立多项式,能够降幂显示出多项式,实现多项式相加相减的计算问题,输出结果。 采用链表的方式存储链表,定义结点结构体。运用尾差法建立两条单链表,以单链表polyn p和polyn h分别表示两个一元多项式a和b。 为实现处理,设p、q分别指向单链表polya和polyb的当前项,比较p、q 结点的指数项。 ①若p->expnexpn,则结点p所指的结点应是“和多项式”中的一项,令指针p后移。 ②若p->expn=q->expn,则将两个结点中的系数相加,当和不为0时修改结点p的系数。 ③若p->expn>q->expn,则结点q所指的结点应是“和多项式”中的一项,将结点q插入在结点p之前,且令指针q在原来的链表上后移。 四、实验程序 //头文件 #include #include #include //定义多项式的项 typedef struct Polynomial{ float coef; int expn; struct Polynomial *next; }*Polyn,Polynomial;

一元多项式加减乘除运算

中国计量学院实验报告 实验课程:算法与数据结构实验名称:一元二项式班级:学号: 姓名:实验日期: 2013-5-7 一.实验题目: ①创建2个一元多项式 ②实现2个多项式相加 ③实现2个多项式相减 ④实现2个多项式相乘 ⑤实现2个多项式相除 ⑥销毁一元多项式 实验成绩:指导教师:

二.算法说明 ①存储结构:一元多项式的表示在计算机内可以用链表来表示,为了节省存储 空间,只存储多项式中系数非零的项。链表中的每一个结点存放多项式的一个系数非零项,它包含三个域,分别存放该项的系数、指数以及指向下一个多项式项结点的指针。创建一元多项式链表,对一元多项式的运算中会出现的各种可能情况进行分析,实现一元多项式的相加、相减操作。 ②加法算法

三.测试结果 四.分析与探讨 实验数据正确,部分代码过于赘余,可以精简。 五.附录:源代码#include<> #include<> #include<> typedef struct Polynomial { float coef; int expn; struct Polynomial *next; }*Polyn,Polynomial; 出多项式a和b\n\t2.多项式相加a+b\n\t3.多项式相减a-b\n"); printf("\t4.多项式相除a*b\n\t5.多项式相除a/b\n\t6.销毁多项式\n"); printf("\t7.退出

\n*********************************** ***********\n"); printf("执行:"); scanf("%d",&flag); switch(flag) { case(1): printf("多项式a:");PrintPolyn(pa); printf("多项式b:");PrintPolyn(pb);break; case(2): pc=AddPolyn(pa,pb); printf("多项式a+b:");PrintPolyn(pc); DestroyPolyn(pc);break; case(3): pd=SubtractPolyn(pa,pb); printf("多项式a-b:");PrintPolyn(pd); DestroyPolyn(pd);break; case(4): pf=MultiplyPolyn(pa,pb); printf("多项式a*b:");PrintPolyn(pf); DestroyPolyn(pf);break; case(5): DevicePolyn(pa,pb); break; case(6): DestroyPolyn(pa); DestroyPolyn(pb); printf("成功销毁2个一元二项式\n"); printf("\n接下来要执行的操作:\n1 重新创建2个一元二项式 \n2 退出程序\n"); printf("执行:"); scanf("%d",&i); if(i==1) { // Polyn pa=0,pb=0,pc,pd,pf;//定义各式的头指针,pa与pb在使用前付初值NULL printf("请输入a的项数:"); scanf("%d",&m); pa=CreatePolyn(pa,m);// 建立多项式a printf("请输入b的项

实验报告——2 一元稀疏多项式计算器

华北水利水电学院一元稀疏多项式计算器实验报告 2010~2011学年第一学期 09 级计算机科学与技术专业班级: 2009119 学号: 200911902 姓名:万婷婷 一、实验目的 设计一个医院稀疏多项式简单计算器 熟练掌握线性表的基本操作在两种存储结构上的实现,其中以各种链表的操作和应用 二、实验要求 a)输入并建立多项式 b)输出多项式,输出形式为整数序列:n,c 1,e 1 ,c 2 ,e 2 ……c n ,e n ,其中n是多 项式的项数,c i ,e i 分别为第i项的系数和指数。序列按指数降序排列。 c)多项式a和b相加,建立多项式a+b,输出相加的多项式。 d)多项式a和b相减,建立多项式a-b,输出相减的多项式。 用带表头结点的单链表存储多项式。 测试数据: (1) (2x+5x8-3.1x11)+(7-5x8+11x9) (2) (6x-3-x+4.4x2-1.2x9)-(-6x-3+5.4x2+7.8x15) (3)(1+x+x2 +x3 +x4 +x5)+( -x3- x4) (4)(x+x2+x3)+0 (5)(x+x3)-(-x-x-3) (6) (x+x2 +x3 )+0 三、实验内容 主要算法设计 typedef struct Node { float coef; int index; struct Node *next; }LinkList; 本程序涉及到多项式的建立、多项式的输出、两个多项式的相加减。用带头结点的单链表存储多项式; 程序中共定义了5个函数:

void Insert(LinkList *p,LinkList *h)//把节点p插入到链表h中LinkList *Creat_L(LinkList *head,int m)//创建一个链表,项数为m void Printf(LinkList *L) LinkList *ADDlist(LinkList *head,LinkList *pb) LinkList *MinusList(LinkList *head,LinkList *pb) 四、程序源代码 #include #include #include #include typedef struct Node { float coef; int index; struct Node *next; }LinkList; void Insert(LinkList *p,LinkList *h)//把节点p插入到链表h中 { LinkList *q1,*q2; int flag=0; q1=h; if(p->coef==0) free(p); else { if(q1->next==NULL) { q1->next=p; }

数据结构中实现一元多项式简单计算

数据结构中实现一元多项式简单计算: 设计一个一元多项式简单的计算器。 基本要求: 一元多项式简单计算器的基本功能为: (1)输入并建立多项式; (2)输出多项式; (3)两个多项式相加,建立并输出和多项式; (4)两个多项式相减,建立并输出差多项式; #include #include #define MAX 20 //多项式最多项数 typedef struct//定义存放多项式的数组类型 { float coef; //系数 int exp; //指数 } PolyArray[MAX]; typedef struct pnode//定义单链表结点类型 { float coef; //系数 int exp; //指数 struct pnode *next; } PolyNode; void DispPoly(PolyNode *L) //输出多项式 { PolyNode *p=L->next; while (p!=NULL) { printf("%gX^%d ",p->coef,p->exp); p=p->next; } printf("\n"); } void CreateListR(PolyNode *&L,PolyArray a,int n) //尾插法建表 { PolyNode *s,*r;int i; L=(PolyNode *)malloc(sizeof(PolyNode)); //创建头结点 L->next=NULL; r=L; //r始终指向终端结点,开始时指向头结点for (i=0;i

多项式的运算(c语言实现)

#include"stdio.h" #include"stdlib.h" #include"conio.h" typedef struct Item{ double coef;//系数 int expn;//指数 struct Item *next; }Item,*Polyn; #define CreateItem(p) p=(Item *)malloc(sizeof(Item)); #define DeleteItem(p) free((void *)p); /************************************************************/ /* 判断选择函数 */ /************************************************************/ int Select(char *str) { char ch; printf("%s\n",str); printf("Input Y or N:"); do{ ch=getch(); }while(ch!='Y'&&ch!='y'&&ch!='N'&&ch!='n'); printf("\n"); if(ch=='Y'||ch=='y') return(1); else return(0); } /************************************************************/ /* 插入位置定位函数 */ /**************************************************************/ int InsertLocate(Polyn h,int expn,Item **p) { Item *pre,*q; pre=h; q=h->next; while(q&&q->expnnext; } if(!q) { *p=pre; return(1); } else if(q->expn==expn) { *p=q; return(0); } else { *p=pre; return(-1); } } /************************************************************/ /* 插入结点函数 */ /************************************************************/ void insert(Item *pre,Item *p) {

(整理)一元稀疏多项式计算器

云南大学软件学院数据结构实验报告 (本实验项目方案受“教育部人才培养模式创新实验区(X3108005)”项目资助)实验难度: A □ B □ C □ 学期:2012秋季学期 任课教师: 实验题目: 一元稀疏多项式计算器 小组长: 联系电话: 电子邮件: 完成提交时间:2012 年 11 月 10 日 云南大学软件学院2012学年秋季学期

《数据结构实验》成绩考核表 学号: 20111120 姓名:本人承担角色:算法设计整体流程控制 综合得分:(满分100分) 指导教师: 年月日

云南大学软件学院2010学年秋季学期 《数据结构实验》成绩考核表 学号: 20111120 姓名:本人承担角色:函数实现整体流程控制 综合得分:(满分100分) 指导教师: 年月日

(下面的内容由学生填写,格式统一为,字体: 楷体, 行距: 固定行距18,字号: 小四,个人报告按下面每一项的百分比打分。难度A满分70分,难度B满分90分)一、【实验构思(Conceive)】(10%) 多项式计算器的呈现方式是用控制台程序呈现,;多项式的加减乘以及求导的函数中利用链表保存头结点以及循环结构保存和输出数据;还有利用一个简单的降序排列的函数,在输出时更加明了。 二、【实验设计(Design)】(20%) 在头文件中申明变量,源文件中创建指数和系数的指针的头结点,并为此申请空间。首先考虑指数为0,1和系数为0,1时的特殊情况的表示;然后利用SORT函数对输出时进行降序排列;其次就是加减乘以及求导函数的实现;最后是一个输出界面的设计。 三、【实现描述(Implement)】(30%) //--------函数原型说明-------- typedef struct Node { double xishu; int zhishu;//数据域 //int data; struct Node* pnext;//指针域 }Node,*pNode; pNode phead=(pNode)malloc(sizeof(Node));//创建头节点 pNode creat_list(void);创建链表 void traverse_list(pNode phead);//遍历链表 pNode sort(pNode phead);//对链表进行降序排列 pNode add(pNode phead1,pNode phead2);//两个多项式相加 pNode hebing(pNode phead)//合并同类项 pNode multi(pNode phead1,pNode phead2);//多项式相乘 pNode sub(pNode phead1,pNode phead2);//多项式相减 //多项式求导没有声明和定义函数,而是直接卸载程序里了

数据结构一元多项式的计算

课程设计成果 学院: 计算机工程学院班级: 13计科一班 学生姓名: 学号: 设计地点(单位): 设计题目:一元多项式的计算 完成日期:年月日 成绩(五级记分制): _________________ 教师签名:_________________________ 目录 1 需求分析 ......................................................................... 错误!未定义书签。 2 概要设计 ......................................................................... 错误!未定义书签。 2.1一元多项式的建立 ............................................................... 错误!未定义书签。 2.2显示一元多项式 ................................................................... 错误!未定义书签。 2.3一元多项式减法运算 ........................................................... 错误!未定义书签。 2.4一元多项式加法运算 ........................................................... 错误!未定义书签。 2.5 设计优缺点.......................................................................... 错误!未定义书签。3详细设计 .......................................................................... 错误!未定义书签。 3.1一元多项式的输入输出流程图........................................... 错误!未定义书签。 3.2一元多项式的加法流程图................................................... 错误!未定义书签。 3.3一元多项式的减法流程图.................................................. 错误!未定义书签。 3.4用户操作函数....................................................................... 错误!未定义书签。4编码 .................................................................................. 错误!未定义书签。5调试分析 .......................................................................... 错误!未定义书签。4测试结果及运行效果...................................................... 错误!未定义书签。5系统开发所用到的技术.................................................. 错误!未定义书签。参考文献 ............................................................................. 错误!未定义书签。附录全部代码................................................................... 错误!未定义书签。

C语言一元多项式计算

C语言一元多项式计算集团标准化工作小组 #Q8QGGQT-GX8G08Q8-GNQGJ8-MHHGN#

#include <> #include <> #include <> #define LEN sizeof(node) //结点构造 typedef struct polynode { int coef; //系数 int exp; //指数 struct polynode *next; }node; node * create(void) { node *h,*r,*s; int c,e; h=(node *)malloc(LEN); r=h; printf("系数:"); scanf("%d",&c); printf("指数:"); scanf("%d",&e); while(c!=0) { s=(node *)malloc(LEN); s->coef=c; s->exp=e; r->next=s; r=s; printf("系数:"); scanf("%d",&c); printf("指数:"); scanf("%d",&e); } r->next=NULL; return(h);

} void polyadd(node *polya, node *polyb) { node *p,*q,*pre,*temp; int sum; p=polya->next; q=polyb->next; pre=polya; while(p!=NULL&&q!=NULL) { if(p->exp>q->exp) { pre->next=p; pre=pre->next; p=p->next; } else if(p->exp==q->exp) { sum=p->coef+q->coef; if(sum!=0) { p->coef=sum; pre->next=p;pre=pre->next;p=p->next; temp=q;q=q->next;free(temp); } else { temp=p->next;free(p);p=temp; temp=q->next;free(q);q=temp; } } else { pre->next=q; pre=pre->next; q=q->next; } } if(p!=NULL) pre->next=p; else pre->next=q; } void print(node * p) {

一元稀疏多项式计算器C语言课程设计

2014-2015学年第二学期学号1308210115 《软件工程》 课程设计报告 题目:一元稀疏多项式计算器 专业:计算机科学与技术 班级:计算机科学与技术(2)班 姓名: 指导教师: 成绩:

一、问题描述 (3) 二、需求分析 (3) 三、概要设计 (4) 四、详细设计 (5) 五、源代码 (6) 六、程序测试 (18) 七、使用说明 (24) 八、课设总结 (25)

一、问题描述 1.1基本要求 (1)输入并建立多项式; (2)输出多项式,输出形式为整数序列:n,c1,e1, c2,e2,,,,,,, cn,en,其中n是多项式的项数,ci,ei,分别是第i项的系数和指数,序列按指数降序排序; (3)多项式a和b相加,建立多项式a+b; (4)多项式a和b相减,建立多项式a-b; (5)计算多项式在x处的值。 (6)计算器的仿真界面。 1.2设计目的 数据结构是实践性很强的课程。课程设计是加强学生实践能力的一个强有力手段。课程设计要求学生在完成程序设计的同时能够写出比较规范的设计报告。严格实施课程设计这一环节,对于学生基本程序设计素养的培养和软件工作者工作作风的训练,将起到显著的促进作用 二、需求分析 2.1 设计开发环境: 软件方面:系统windows 7 编程软件:VC++ 6.0 2.2思路分析: ①一般情况下的一元n次多项式可写成 pn(x)=p1xe1+p2xe2+……+pmxem 其中,p1是指数为ei的项的非零系数,且满足0≦e1

一元稀疏多项式计算器(数据结构)

【问题描述】 设计一个一元稀疏多项式简单计算器 【基本要求】 一元多项式简单计算器的基本功能是: 1,输入并建立多项式; 2,输出多项式,输出形式为整数序列:n,c1,e1,c2,c2,...,cn,en,其中n是多项式的项数,ci和ei分别是第i项的系数和指数,序列按指数降序排列; 3,多项式a和b相加,建立多项式a+b; 4,多项式a和b相减,建立多项式a-b. 【测试数据】 1,(2x+5x^8-3.1x^11)+(7-5x^8+11x^9)=(-3.1x^11+11x^9+2x+7) 【实现提示】 用带表头结点的单链表存储多项式。 #include #include typedef struct node { float coef; int expn; struct node *next; }Lnode, *polynmial; void create(polynmial &L); //输入并建立多项式L void display(polynmial L); //显示,输出多项式L void sort(polynmial &L); //多项式L按指数排序 void reverse(polynmial &L); //逆置 void select(); //用户选择加减操作 void add(polynmial La, polynmial Lb, polynmial &Lc); //多项式La,Lb相加void subtract(polynmial La, polynmial Lb, polynmial &Ld); //多项式La减去Lb,结果给Ld void create(polynmial &L) //输入并建立多项式L { int i, n; static struct node *p; scanf("%d", &n); L = (struct node *)malloc (sizeof(struct node)); L->next = NULL; for(i = 0; i < n; i++) { p = (struct node *)malloc(sizeof(struct node)); scanf("%f %d", &p->coef, &p->expn); p->next = L->next; L->next = p; } }

一元多项式计算问题课程设计

长沙学院课程设计说明书 题目一元多项式计算问题系(部) 计算机系 专业(班级) 10级软件D班 姓名向栋良 学号2010022D08 指导教师邓旭东 起止日期2011.9.4-2011.9.8

课程设计任务书 课程名称:数据结构与算法 设计题目:一元多项式计算问题 已知技术参数和设计要求: 问题描述: 设计一个稀疏多项式简单计算器 基本要求: (1)输入并分别建立多项式A和B (2)输入输出多项式,输出形式为整数序列:n,c1,e1,c2,e2……,其中n是多项式的项数,ci和ei是第i项的系数和指数,序列按指数降序排列 (3)完成两个多项式的相加、相减,并将结果输出; 测试数据: (1) A+B A= 3x14-8x8+6x2+2 B=2x10+4x8+-6x2 (2) A-B A=11x14+3x10+2x8+10x6+5 B=2x14+3x8+5x6+7 (3) A+B A=x3+x1B=-x3-x1 (4) A+B A=0 B=x7+x5+x3+x1 (5) A-B A=100x100+50x50+20x20+x B=10x100+10x50+10x20+x 选作内容: (1).多项式在x=1时的运算结果 (2)求多项式A和B的乘积 设计工作量: 40课时 日期节次地点设计方式9月4日(周日)1-4 科1408 讲授内容 9月4日(周日)5-8 科1608 答疑 9月5日(周一)1-4科1408上机调试 9月5日(周一)5-8 科1608 答疑 9月6日(周二)1-4科1408上机调试 9月6日(周二)5-8 科1608 答疑 9月7日(周三)1-4科1408上机调试 9月7日(周三)5-8 科1608 答疑 9月8日(周四)1-4科1608答疑 9月8日(周四)5-8 科1408 答辩

一元多项式计算器

一元多项式计算器 目录 摘要 (1) 1绪论 (1) 2系统分析 (1) 2.1功能需求 (1) 2.2数据需求 (1) 2.3性能需求 (1) 3总体设计 (2) 3.1系统设计方案 (2) 3.2功能模块设计 (2) 4详细设计 (3) 4.1建立多项式 (4) 4.2多项式相加 (4) 4.3多项式相减 (5) 4.4多项式相乘 (5) 4.5计算器主函数 (6) 5调试与测试 (7) 5.1调试 (7) 5.2测试 (8) 6结论 (9) 结束语 (9) 参考文献 (9) 附录1-用户手册 (10) 附录2-源程序 (12)

摘要 随着生活水平的提高,现代科技也日益发达。日常生活中多位计算再所难免,因此设计一个简单计算器可解决许多不必要的麻烦。 开发这样一个程序主要运用了C的结点,链表等方面知识。系统主要实现了多项式的建立,多项式的输入输出,以及多项式加减乘等运算。 报告主要从计算器的程序段,对输入输出数据的要求,计算器的性能,以及总体的设计来介绍此计算器程序的实现过程。 关键词:多项式;链表;结点 1绪论 随着日益发达的科技,计算器已应用于各行各业。设计一个计算器需要运用C中多方面知识,更是以多项式的建立,输入输出,以及结点,链表为主。(扩充) 任务书。。。。。 2系统分析 2.1 功能需求 多项式的建立多项式输入输出多项式加减乘等运算 2.2数据需求 在输入过程中,首先要确定输入的数据,数据不能是字母,只能是数字。不能连续输入数据,必须按要求配以空格输入要计算的数据。 (1) 链节节点数字 (2) 数字 2.3 性能需求 系统必须安全可靠,不会出现无故死机状态,速度不宜过慢。

一元稀疏多项式计算器实验

一元稀疏多项式计数器预习报告 姓名:刘茂学号2220 一、实验要求 (1)输入并建立多项式; (2)输出多项式,输出形式为整数序列:n,c1,e1,c2,e2……cn,en,其中n是多项式的项数,ci,ei分别为第i项的系数和指数。序列按指数降序排列; (3)多项式a和b相加,建立多项式a+b; (4)多项式a和b相减,建立多项式a-b。 (5)多项式求值; (6)多项式求导; (7)求多项式的乘积。 二、测试数据: 1、(2x+5x^^11)+(7-5x^8+11x^9)=^11+11x^9+2x+7); 2、(6x^-3-x+^^9+^9)-(-6x^-3+^2-x^2+^15 )=^^9+12x^-3-x); 3、(1+x+x^2+x^3+x^4+x^5)+(-x^3-x^4)=(1+x+x^2+x^5); 4、(x+x^3)+(-x-x^3)=0; 5、(x+x^100)+(x^100+x^200)=(x+2x^100+x^200); 6、(x+x^2+x^3)+0=x+x^2+x^3. 7、互换上述测试数据中的前后两个多项式。 三、思路分析 用带表头结点的单链表存储多项式。 本程序要求输入并建立多项式,能够降幂显示出多项式,实现多项式相加相减的计算问题,输出结果。

采用链表的方式存储链表,定义结点结构体。运用尾差法建立两条单链表,以单链表polyn p和polyn h分别表示两个一元多项式a和b。 为实现处理,设p、q分别指向单链表polya和polyb的当前项,比较p、q 结点的指数项。 ① 若p->expnexpn,则结点p所指的结点应是“和多项式”中的一项,令指针p后移。 ② 若p->expn=q->expn,则将两个结点中的系数相加,当和不为0时修改结点p的系数。 ③ 若p->expn>q->expn,则结点q所指的结点应是“和多项式”中的一项,将结点q插入在结点p之前,且令指针q在原来的链表上后移。 四、实验程序 //头文件 #include<> #include<> #include<> //定义多项式的项 typedef struct Polynomial{ float coef; int expn; struct Polynomial *next; }*Polyn,Polynomial; void Insert(Polyn p,Polyn h){ if(p->coef==0) free(p);//系数为0的话释放结点 else

一元稀疏多项式计算器(数据结构)

院系:计算机科学学院 专业:软件工程 年级: 2013级 课程名称:数据结构 姓名:韦宜(201321092034)指导教师:宋中山 2015年 12 月 15日

题目:设计一个一元稀疏多项式简单计算器 班级:软件工程1301 姓名:韦宜学号:201321092034 完成日期:12月15日 一、需求分析 问题描述:设计一个一元多项式加法器 基本要求: 输入并建立多项式; (2)两个多项式相加; (3)输出多项式:n, c1, e1, c2, e2, …cn , en, 其中,n是多项式项数,ci和ei分别是第i 项的系数和指数,序列按指数降序排列。 (4)计算多项式在x处的值; (5)求多项式的导函数。 软件环境:Windows,UNIX,Linux等不同平台下的Visual C++ 6.0 硬件环境: 512MB内存,80Gb硬盘,Pentium4 CPU,CRT显示器。

二、概要分析 本程序有五个函数: PolyNode *Input()(输入函数); PolyNode *Deri(PolyNode *head)(求导函数); PolyNode * Plus(PolyNode *A,PolyNode *B)(求和函数); void Output(PolyNode*head)(输出函数); int main()(主函数) 本程序可使用带有附加头结点的单链表来实现多项式的链表表示,每个链表结点表示多项式的一项,命名为node,它包括两个数据成员:系数coef和指数exp,他们都是公共数据成员,*next为指针域,用链表来表示多项式。适用于不定的多项式,特别是对于项数再运算过程中动态增长的多项式,不存在存储溢出的问题。其次,对于某些零系数项,在执行加法运算后不再是零系数项,这就需要在结果多项式中增添新的项;对于某些非零系数项,在执行加法运算后可能是零系数项,这就需要在结果多项式中删去这些项,利用链表操作,可以简单的修改结点的指针以完成这种插入和删除运算(不像在顺序方式中那样,可能移动大量数据项)运行效率高。

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

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

一、系统设计 1、算法思想 根据一元多项式相加的运算规则:对于两个一元多项式中所有指数相同的项,对应指数相加(减),若其和(差)不为零,则构成“和(差)多项式”中的一项;对于两个一元多项式中所有指数不相同的项,则分别写到“和(差)多项式”中去。 因为多项式指数最高项以及项数是不确定的,因此采用线性链表的存储结构便于实现一元多项式的运算。为了节省空间,我采用两个链表分别存放多项式a 和多项式b,对于最后计算所得的多项式则利用多项式a进行存储。主要用到了单链表的插入和删除操作。

(1)一元多项式加法运算 它从两个多项式的头部开始,两个多项式的某一项都不为空时,如果指数相等的话,系数就应该相加;相加的和不为零的话,用头插法建立一个新的节点。P 的指数小于q的指数的话就应该复制q的节点到多项式中。P的指数大于q的指数的话,就应该复制p节点到多项式中。当第二个多项式空,第一个多项式不为空时,将第一个多项式用新节点产生。当第一个多项式空,第二个多项式不为空时,将第二个多项式用新节点产生。 (2)一元多项式的减法运算 它从两个多项式的头部开始,两个多项式的某一项都不为空时,如果指数相等的话,系数就相减;相加的和不为零的话,用头插法建立一个新的节点。p的指数小于q的指数的话,就应该复制q的节点到多项式中。P的指数大于q的指数的话就应该复制p的节点到多项式中,并且建立的节点的系数为原来的相反数;当第二个多项式空,第一个多项式不为空时,将第一个多项式用新节点产生。当第一个多项式空,第二个多项式不为空时,将第二个多项式用新节点产生,并且建立的节点的系数为原来的相反数。 2、概要设计 (1)主函数流程图: (注:a代表第一个一元二次方程,b代表第二个一元二次方程)

数据结构实验,多项式计算器

实验题目:多项式运算器 实验内容:1、熟悉编程环境 2、用链式存储结构实现稀疏一元多项式运算器 实验目的和要求: 1、通过本实验,掌握VC++6.0的基本使用,包括源程序的输入,编译运行及调 试。调试的目的是找程序的运行错误,通过DEBUG菜单设置断点实现。 2、用链式存储结构实现一元多项式的运算。 熟练掌握指针和链表的基本操作,利用菜单进行功能选择。 功能基本要求:创建、显示、求和、求差、求值、销毁、清空、修改 实验算法: 1、数据结构描述: 输入的稀疏每一个多项式用一个链表存储,链表的每一个节点存储多项式的一个非零项。定义为LNode型结构体,其中保存该项的系数和指数。主 函数中用一个数组存储每一个多项式的第一项的头指针以调用多项式。 2、函数和算法描述: 主函数main定义LNode*数组a[]存储每一个多项式头节点的地址,并构建菜单以选择调用函数进行多项式的操作,对多项式进行操作的函数返回新 改动的多项式头结点地址。 Createpolyn函数用以创建一个多项式,在用户输入结束指令之前,不断的申请空间,构建LNode型结点并加至构建的链表的表尾,输入结束指令之 后,表尾设NULL并返回表头指针。 Printpolyn函数用以在屏幕上打印多项式,接收需要打印的多项式链表的头结点,构造循环体在表尾之前,不断以mx^n格式打印对应结点中的数 据。 Copypolyn函数用以复制多项式,接收需要复制的多项式a和复制位置b 的指针,构造循环体,在a到表尾之前循环,在b对应的链表中构建新的结 点,结点上的数据赋值为a中对应的值,返回b的头结点地址。 Addpolyn函数用以求两个已知多项式a、b的和存入c,先构建循环体,在a、b链表都未进行到表尾时,比较两个结点中的次数值,如果相同,将 系数相加赋于c的当前结点,如果不同,将次数较小多项式y(a或b)的结 点赋值给c当前结点,在将y链表向后推。 Subtract函数用以求两多项式的差,类似求和算法。 Value函数用以求一个多项式的值,接收x的值,构建循环体,在表尾之前循环以遍历多项式链表。内置循环体,以次数n为限循环,求出x^n的 值,乘以系数并将每一项的值叠加得值。 Destroypolyn函数用以销毁已有的多项式,将此多项式链表的空间FREE 掉,返回空指针。 Clearpolyn函数用以清空多项式,构建循环体,将多项式的各项的系数、指数置零。 3、时空分析: L= sizeof(struct LNode) 一个含有N项的多项式占用的储存空间为NL+1

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

一元多项式的计算—加,减 摘要(题目)一元多项式计算 任务:能够按照指数降序排列建立并输出多项式; 能够完成两个多项式的相加、相减,并将结果输入; 目录 1.引言 2.需求分析 3.概要设计 4.详细设计 5.测试结果 6.调试分析 7.设计体会 8.结束语 一:引言: 通过C语言使用链式存储结构实现一元多项式加法、减法和乘法的运算。按指数

降序排列。 二:需求分析 建立一元多项式并按照指数降序排列输出多项式,将一元多项式输入并存储在内存中,能够完成两个多项式的加减运算并输出结果 三:概要设计 存储结构:一元多项式的表示在计算机内可以用链表来表示,为了节省存储空间,只存储多项式中系数非零的项。链表中的每一个结点存放多项式的一个系数非零项,它包含三个域,分别存放该项的系数、指数以及指向下一个多项式项结点的指针。创建一元多项式链表,对一元多项式的运算中会出现的各种可能情况进行分析,实现一元多项式的相加、相减操作。 1.单连表的抽象数据类型定义: ADT List{ 数据对象:D={ai|ai∈ElemSet,i=1,2,…,n,n≥0} 数据关系:R1={| ai-1, ai∈D,i=2,…,n} 基本操作: InitList(&L) //操作结果:构造一个空的线性表 CreatPolyn(&L) //操作结果:构造一个以单连表存储的多项试 DispPolyn(L) //操作结果:显示多项试 Polyn(&pa,&pb) //操作结果:显示两个多项试相加,相减的结果 } ADT List 2.本程序包含模块: typedef struct LNode //定义单链表 { }LNode,*LinkList; void InitList(LinkList &L) //定义一个空表 { } void CreatPolyn(LinkList &L) //用单链表定义一个多项式 { } void DispPolyn(LinkList L) //显示输入的多项式

相关主题
文本预览
相关文档 最新文档