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

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

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

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

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

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

成绩

南京工程学院

课程设计说明书(论文)

题目

课程名称数据结构

院(系、部、中心)通信工程

专业计算机通信

班级算通111

学生姓名余丹红

学号208110410

设计地点信息楼322

指导教师郝慧珍

设计起止时间:

2012年12月17日至2012年12月18日

1.设计目标1

2.总体设计1

2.1数据结构描述与定义1

2.2模块设计2

3.测试结果与分析11

4.课程设计总结13

参考文献:

15

附录A:

源程序清单15

 

通过课程设计,达到理论与实际应用相结合,提高学生组织数据及编写大型程序的能力,使学生能够根据数据对象的特性,掌握数据组织、算法设计、算法性能分析的方法,并培养良好的程序设计能力。

本程序是利用单链表来表示一元多项式然后实现各项指数和系数的输入,进行多项式建立,并以多项式的形式输出,实现多项式的相加,相减和多项式的相乘这三种运算。

2•总体设计

2.1数据结构描述与定义

元多项式定义系数和指数结构如下:

coef

expn

next

coef域--存放结点的系数值

expn域--存放结点的指数值

next域--存放结点的直接后继的地址(位置)的指针域(链域)

定义多项式的结构为线性链表的存储结构,每个结点包含三个元素:

系数

coef,指数expn和指向下一个结点的指针*next。

通过指针,我们就可以把多个单项式连接起来,形式一个多项式,需要说明的是从广义的角度讲,单项式也是一个多项式。

基于以上的分析,我们定义多项式的数据结构为如下结构体形式:

typedefstructPolynomial{

floatcoef;//系数

intexpn;//指数

structPolynomial*next;//下一个指针

}*Polyn,Polynomial;

//Polyn结构体变量名

从实现多项式式运算过程的角度来分析,至少需要这样一些子功能模块

1多项式创建功能

2多项式销毁功能

3多项式输出功能

4多项式的相加功能

5多项式的相减功能

6多项式的相乘功能

定义并调用的函数有:

voidInsert(Polynp,Polynh);〃将结点p插入链表h

PolynCreatePolyn(Polynhead,intm);〃创建链表(多项式)

voidDestroyPolyn(Polynp);〃销毁

voidPrintPolyn(PolynP);〃输出

PolynAddPolyn(Polynpa,Polynpb);//a+b

PolynSubtractPolyn(Polynpa,Polynpb);//a-b

PolynMultiplyPolyn(Polynpa,Polynpb);//a*bvoidmain()〃主函数

系统共分几个模块,每个模块的算法描述及流程图(核心模块)

1•系统模块图(模块划分)

程諾躊携矗

窑项式的创建

多项式的相乘

多项式的相减

多项式的相加

多项式的输出

多项式的销毁

 

图1系统模块划分图

2.模块流程图及算法描述

①分模块流程图

多项式的销毁

⑴多项式的创建⑵

 

 

(3)多项式的输出

 

 

(4)多项式的相加

开始

定义存储和链表he动态分配空间qa=pa->next

qb=pb->next

 

qa的各个值赋给qe

qa指向qa的next

qb的各个值赋给qc

qb指向qb的next

 

qa的系数加qb的系数赋给qe的系数

qa的指数赋给qc的指数

qa指向qa的next

qb指向qb的next

 

 

 

结束

 

 

②算法描述

(1)多项式的创建

PolynCreatePolyn(Polynhead,intm)

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

//在主程序初始时,先输入的多项式中的项数mn在这里为m主程序中的pa、pb在此

为head

inti;//用来计数

动态分配空间,建立头结点

建立新结点以接收数据

上面循环中i从0开始,所以

Polynp;//定义一个p链表p=head=(Polyn)malloc(sizeof(structPolynomial));//head->next=NULL;

for(i=0;i

{

p=(Polyn)malloc(sizeof(structPolynomial));//

printf(”请输入第%4项的系数与指数:

",i+1);//

此处为i+1

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

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

}

returnhead;

}

(2)多项式的销毁

利用循环逐渐销毁多项式

voidDestroyPolyn(Polynp)//销毁多项式p

{Polynq1,q2;

q1=p->next;

q2=q1->next;

while(q1->next)//利用循环逐渐销毁多项式P{

free(q1);

q1=q2;//指针后移

q2=q2->next;

}

free(q1);

}

(3)多项式的输出

voidPrintPolyn(PolynP)

{//输出多项式

Polynq=P->next;

intflag=1;//项数计数器

if(!

q)

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

putchar('0');printf("\n");return;

}

while(q)//多项式存在

{

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

=1)

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

表示使用%。

或%f,哪个输出宽度稍短就使用

若指数为1

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

if(q->coef!

=1&&q->coef!

=-1)//{

printf("%g",q->coef);//%g哪一个

if(q->expn==1)

putchar('X');//

else

if(q->expn)

printf("XA%d",q->expn);//指数不为1

}

else

{

if(q->coef==1)//系数为1的情况

{

if(!

q->expn)

putchar('1');//指数为0,则为1

else

if(q->expn==1)

putchar('X');//指数为1则为xelse

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

}if(q->coef==-1)//系数为-1的情况

{

if(!

q->expn)

printf("-1");//指数为0,则为-1

else

if(q->expn==1)

printf("-X");II指数为1,则为-x

else

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

}

}

q=q->next;

flag++;II项数加1

}

printf("\n");

}

(4)多项式的相加

利用对ab两个多项式每一项分模块讨论进行的,如a指数大或者b空,则将a项该节点插入新链c中,若b指数大或者a空,则将b项插入到c中,如若a、b两项指数相等,则合并后再插入到c链中。

PolynAddPolyn(Polynpa,Polynpb)

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

Polynqa=pa->next;

Polynqb=pb->next;

Polynheadc,hc,qc;

hc=(Polyn)malloc(sizeof(structPolynomial));//建立头结点

hc->next=NULL;

headc=hc;

while(qa||qb)

{

qc=(Polyn)malloc(sizeof(structPolynomial));switch(compare(qa,qb))

{

case1:

{

qc->coef=qa->coef;

qc->expn=qa->expn;//aqa=qa->next;//qabreak;

}

case0:

{

qc->coef=qa->coef+qb->coef;qc->expn=qa->expn;//qcqa=qa->next;qb=qb->next;//qabreak;

}

case-1:

{

的指数大或b为空,把qa赋值给qc指向下一个

等于qa与qb的和

,qb都分别指向下一个

的指数大或a为空,把qb赋值给qc

指向下一个

qc->coef=qb->coef;//bqc->expn=qb->expn;qb=qb->next;//qb

break;}

}if(qc->coef!

=0)

{

qc->next=hc->next;//qc插入到hc中去,并重新生成新的hc,到最后实现a

与b的和

hc->next=qc;hc=qc;

}

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

}

returnheadc;//返回头指针,实现多项式a与b的相加

}

(5)多项式的相减

利用a-b=a+(-b)来进行的,即只将b系数取反即可。

PolynSubtractPolyn(Polynpa,Polynpb)

{//求解并建立多项式a-b,返回其头指针,将pb的系数取反后调用相加的函数,实现相减功能

Polynh=pb;

Polynp=pb->next;

Polynpd;

while(p)

{//

p->coef*=-1;

p=p->next;//p

}pd=AddPolyn(pa,h);for(p=h->next;p;p=p->next)//

p->coef*=-1;returnpd;//

(6)多项式的相乘

将a中的每一项乘b中的每一项,即系数相乘,指数相加,将它放在新节点中并

插入新链h,最后返回链ho

PolynMultiplyPolyn(Polynpa,Polynpb)

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

Polynhf,pf;

Polynqa=pa->next;

建立头结点

Polynqb=pb->next;

hf=(Polyn)malloc(sizeof(structPolynomial));//hf->next=NULL;

for(;qa;qa=qa->next)

{

for(qb=pb->next;qb;qb=qb->next)

{

pf=(Polyn)malloc(sizeof(structPolynomial));

pf->coef=qa->coef*qb->coef;

pf->expn=qa_>expn+qb_>expn;

Insert(pf,hf);//调用Insert函数以合并指数相同的项

}

}

returnhf;

3.测试结果与分析

 

系统选择界面如图1

图1

 

输入数据为:

2(enter)

2(pase)3(enter)

8(pase)2(enter)

3(enter)

5(pase)1(enter)

3(pase)6(enter)

7(pase)2(enter)

请揃一入扶的项数池请勒入壘项的系数与扌旨数汐3请输入笫项的系数与箱数涓2请输入h的项数汩

项的系数与扌旨数汚1请输人響项的系数則旨数汩6请侖入雳3项的系数与塘数汐2

图2

输出菜单:

如图2

图3

分别输入a,b,c,d,e五个选项

 

显示结果:

如图4

输入f,结束,显示结果:

如图五

图4

*D:

\UserData\Ad>inistrator\桌面\Debug\yydxs.exe

Ii-ir-if.]qIIIIIIIrr-斗[I、■

Pressanykeytocontinue

zi

4.课程设计总结

一.程序总结

计算一元多项式加法,其结果取决于多项式的各项系数与指数,因此程序核心是处理两个多项式的系数与指数。

定义结构体将多项式的各项系数与指数存放,定义结构体类型链表为程序的循环控制提供了可能,利用对链表的运算来确

定结果多项式的各项系数与次数,同理算出相应的幕数。

链表是在计算机内存中使用一组连续的存储单元保存数据类型和名字相同的变量。

就链表这种数据类型而言,在排列上采用的方法也是按序排放,先存放第一行,接着存放第二行,……,直到所有数据元素被存放。

多项式采用的是链表形式,以牺牲一定的空间提高程序的运行速度和可行性。

采用链式结构存储多项式,用链表结构体的一个域标记多项式的次数,另一个域标记多项式的系数,程序中采用的是m表示最高次系数,进行加法运算时,标记系数域相加即为相加的对应系数,标记指数域相同则表示为同类项。

链表的特性是在中间任意位置添加删除元素的都非常的快,不需要移动其它的元素。

链表顾名思义,要把各个元素链接起来才算撒。

通常链表每一个元素都要保存一个指向下一个元素的指针(单链表)。

二.错误分析

错误产生的原因有很多:

1.函数定义冲突;

2.函数调用错误;

3.符号字母等输入错误;

4.链表的定义错误;

5.变量名重复发生冲突;

6.指针指向发生错误;

7.未释放空空间;

错误显示:

如图6

三.收获与体会

本次课程设计,我查找过资料,请教过同学,以及自己的努力,不仅培养了独立思考、动手操作的能力,在各种其它能力上也都有了提高。

更重要的是,在程序设计中,我学会了很多学习的方法,而这是日后最实用的,真的是受益匪浅。

本学期的程序设计课程,我锻炼了能力,学到很多东西,比如思考问题的角度也会从多方面着手;对自己的专业也有自己的想法在和同学的交流过程中,互

动学习,将知识融会贯通。

通过这次课程设计,我对很多的函数有了新的认识,也学会了运用多种函数,我也明白了写软件的基本过程和基本方法。

在程序的设计过程中遇到了很多的困难,在程序一次一次的调试失败下曾经想过要放弃,我最后还是让自己坚持下来,毫不畏惧困难,在同学的帮助与讲解下我总算是顺利的完成了程序的课程设计。

另外也需要提出的是在这次程序设计的过程中,非常感谢老师对我们的耐心指导。

老师在教学过程中表现出来的对学术专研一丝不苟的精神让我非常有收获。

在这几天的编写过程中我对语言有了更进一步的认识和了解,也感受到了编程给我带来的快乐与充实,明白了想成为一个合格的甚至是优秀的程序员,我还需要更多更难的锻炼。

所以我还要不断地学习不断地学习,不断地成长。

参考文献:

1•严蔚敏,吴伟民•数据结构(C语言版).北京:

清华大学出版社,1997

2.朱战立.数据结构.西安:

西安电子科技大学出版社,2004

3•严蔚敏,吴伟民.数据结构题集(C语言版).北京:

清华大学出版社,2000

附录A:

源程序清单

#include

#include

#include

//定义多项式数据结构typedefstructPolynomial{floatcoef;//系数

intexpn;//指数

structPolynomial*next;//下一个指针

}*Polyn,Polynomial;//Polyn结构体变量名

voidInsert(Polynp,Polynh);//将结点p插入链表hPolynCreatePolyn(Polynhead,intm);//创建链表(多项式)voidDestroyPolyn(Polynp);//销毁voidPrintPolyn(PolynP);//输出intcompare(Polyna,Polynb);//比较a,b的指数大小,为下面a+b做铺垫PolynAddPolyn(Polynpa,Polynpb);//a+b

PolynSubtractPolyn(Polynpa,Polynpb);//a-b

PolynMultiplyPolyn(Polynpa,Polynpb);//a*b

/***************

主函数*******************/

voidmain()

intm,n,a,x;

charflag;

Polynpa=0,pb=0,pc;//system("colorF5");//字体颜色system("color5F");//背景颜色

printf("\n");

E*

**\n\n");

ELCOM

printf("

**\n\n");

*********************************************************************

printf("*****【使用说明:

您可建立a,b两个多项式,并进行相加、相减、相乘三种运算】******\n\n");

*********************************************************************

printf("请输入a的项数:

");

scanf("%d",&m);pa=CreatePolyn(pa,m);//建立多项式aprintf("请输入b的项数:

");scanf("%d",&n);

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

system("cls");

printf("\n");

H*************************************************************************

**\n");

****************************

H*************************************************************************

);

while

(1)

{printf("\n请选择操作:

");

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

switch(flag)

{

case'A':

case'a':

{

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

PrintPolyn(pa);

break;

}

case'B':

case'b':

{

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

PrintPolyn(pb);

break;

}

case'C':

case'c':

{pc=AddPolyn(pa,pb);printf("\na+b=");PrintPolyn(pc);

break;

}

case'D':

case'd':

{pc=SubtractPolyn(pa,pb);printf("\na-b=");PrintPolyn(pc);

break;

}

case'E':

case'e':

{pc=MultiplyPolyn(pa,pb);printf("\na*b=");PrintPolyn(pc);

break;

case'F':

case'f':

{

system("cls");printf("\n");printf("\n");

printf("\t*

****************************************************************

\n");

\n");

DestroyPolyn(pa);

DestroyPolyn(pb);

return;

}

default:

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

\n");

 

*************

合并两个多项式

****************************

voidInsert(Polynp,Polynh)

{//将两个多项式合并的算法,即将p插入h来实现

if(p->coef==0)

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

{

Polynq1,q2;

q1=h;

q2=h->next;

while(q2&&p->expnexpn)

{//查找插入位置,直到p结点指数大于等于h结点

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;//将q2释放掉free(q2);

}

}

else

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

p->next=q2;//将p结点插入到h中去q1->next=p;

}

}

}

PolynCreatePolyn(Polynhead,intm)

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

pa、pb在此

〃在主程序初始时,先输入的多项式中的项数m、n在这里为m。

主程序中的

为head

inti;〃用来计数

Polynp;//定义一个p链表

p=head=(Polyn)malloc(sizeof(structPolynomial));//动态分配空间,建立头结点head->next=NULL;

for(i=0;i

所以此处为

{p=(Polyn)malloc(sizeof(structPolynomial));//建立新结点以接收数据printf("请输入第%d项的系数与指数:

",i+1);//上面循环中i从0开始,

i+1

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

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

}

returnhead;

*****************************

销毁多项式

*******************************

 

voidDestroyPolyn(Polynp)//销毁多项式p

{Polynq1,q2;

q1=p->next;

q2=q1->next;

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

当前位置:首页 > 医药卫生 > 药学

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

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