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

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

数据结构课程设计报告题目:一元多项式计算

院(系):计算机与信息科学学院

专业:软件工程

班级:软件1202班

学号:02 05 40

姓名:陈潇潇刘敏易庆鹏

指导教师:彭代文

2013年12月

目录

一、课程设计介绍 ........................错误!未定义书签。

1.1课程设计目的 (3)

1.2课程设计内容 (3)

1.2课程设计要求 (3)

二、需求设计 ............................错误!未定义书签。

2.1课设题目粗略分析 (3)

2.2原理图介绍.......................... 错误!未定义书签。

2.2.1 功能模块图...................... 错误!未定义书签。

2.2.2 流程图分析 (4)

三、需求分析 .............................错误!未定义书签。

3.1存储结构 (5)

3.2算法描述 (6)

四、调试与分析 ...........................错误!未定义书签。(1)调试过程 .......................... 错误!未定义书签。(2)程序执行过程...................... 错误!未定义书签。参考文献.................................错误!未定义书签。总结.....................................错误!未定义书签。附录(关键部分程序清单)...............错误!未定义书签。

一、课程设计介绍

1.1课程设计目的

⑴熟悉使用c语言编码程序,解决实际问题;

⑵了解数据结构与算法的设计方法,具备初步的独立分析和设计能力。

⑶初步掌握软件开发过程的分析能力,系统设计,程序编码,测试等基本能力。

⑷提高综合运用的能力,运用所学理论知识与独立分析能力。

1.2课程设计内容

一元多项式计算

任务:⑴能够按照指数降序排列建立并输出多项式

⑵能够完成两个多项式的相加,并将结果输入

⑶在上交资料中请写明:存储结构、多项式相加的基本过程的算法(可以使用程序流程图)、源程序、测试数据和结果、算法的时间复杂度、另外可以提出算法的改进方法

1.3课程设计要求

⑴学生必须仔细阅读《数据结构》课程设计方案,认真主动完成课设的要求。有问题及时主动通过各种方式与教师联系沟通。

⑵学生要发挥自主学习的能力,充分利用时间,安排好课设的时间计划,并在课设过程中不断检测自己的计划完成情况,及时的向教师汇报。

⑶课程设计按照教学要求需要一周时间完成,一周中每天(按每周5天)至少要上3-4小时的机来调试C语言设计的程序,总共至少要上机调试程序30小时。

⑷课程设计在期末考试之前交。最好一起上交。

⑸同班同学之间最好不要相同。源代码可以打印,但是下面模块要求的内容必须手写。

二、需求设计

2.1 课设题目粗略分析

建立一元多项式并按照指数降序排列输出多项式,将一元多项式输入并存储在内存中,能够完成两个多项式的加减运算并输出结果

2.2 流程图分析

1、输入输出

(1)功能:将要进行运算的多项式输入输出。

(2)数据流入:要输入的多项式的系数与指数。

(3)数据流出:合并同类项后的多项式。

(4)程序流程图:多项式输入流程图如图1所示。

(5)测试要点:输入的多项式是否正确,若输入错误则重新输入

图表1

2、多项式的加法

(1)功能:将两多项式相加。

(2)数据流入:输入函数。

(3)数据流出:多项式相加后的结果。

(4)程序流程图:多项式的加法流程图如图2所示。

(5)测试要点:两多项式是否为空,为空则提示重新输入,否则,进行运算。

图表 1

开始 申请结点空间 输入多项式的项数 输入多项式各项的系数 x, 指数 y 输出已输入的多项式 合并同类项 结束

否 是 是否输入正确

三、需求分析

3.1 存储结构

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

开始

定义存储结果的空链 r 是

否 输出存储多项式的和的链r 结束

是 否

同指数项系数相加后存入r 直接把p 中各项存入r

直接把q 中各项存入r 存储多项式2的空链Q 是否为空 存储多项式1的空链P 是否为空

合并同类项

3.2 算法描述

#include

#include

typedef struct Polynomial{

float coef;

int expn;

struct Polynomial *next;

}*Polyn,Polynomial; //Polyn为结点指针类型void Insert(Polyn p,Polyn h){

if(p->coef==0) free(p); //系数为0的话释放结点

else{

Polyn 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;

}

}

}//Insert

Polyn CreatePolyn(Polyn head,int m){//建立一个头指针为head、项数为m的一元多项式

int i;

Polyn p;

p=head=(Polyn)malloc(sizeof(struct Polynomial));

head->next=NULL;

for(i=0;i

p=(Polyn)malloc(sizeof(struct Polynomial));//建立新结点以接收数据

printf("请输入第%d项的系数与指数:",i+1);

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

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

}

return head;

}//CreatePolyn

void DestroyPolyn(Polyn p){//销毁多项式p

Polyn q1,q2;

q1=p->next;

q2=q1->next;

while(q1->next){

free(q1);

q1=q2;//指针后移

q2=q2->next;

}

}

void PrintPolyn(Polyn P){

Polyn q=P->next;

int flag=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');

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

}

else{

if(q->coef==1){

if(!q->expn) putchar('1');

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

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

}

if(q->coef==-1){

if(!q->expn) printf("-1");

else if(q->expn==1) printf("-X");

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

}

}

q=q->next;

flag++;

}//while

printf("\n");

}//PrintPolyn

int compare(Polyn a,Polyn b){

if(a&&b){

if(!b||a->expn>b->expn) return 1;

else if(!a||a->expnexpn) return -1;

else return 0;

}

else if(!a&&b) return -1;//a多项式已空,但b多项式非空

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

}//compare

Polyn AddPolyn(Polyn pa,Polyn pb){//求解并建立多项式a+b,返回其头指针

Polyn qa=pa->next;

Polyn qb=pb->next;

Polyn headc,hc,qc;

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

hc->next=NULL;

headc=hc;

while(qa||qb){

qc=(Polyn)malloc(sizeof(struct Polynomial));

switch(compare(qa,qb)){

case 1:

{

qc->coef=qa->coef;

qc->expn=qa->expn;

qa=qa->next;

break;

}

case 0:

{

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;

}

}//switch

if(qc->coef!=0){

qc->next=hc->next;

hc->next=qc;

hc=qc;

}

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

}//while

return headc;

}//AddPolyn

Polyn SubtractPolyn(Polyn pa,Polyn pb){//求解并建立多项式a+b,返回其头指针

Polyn h=pb;

Polyn p=pb->next;

Polyn pd;

while(p){ //将pb的系数取反

p->coef*=-1;

p=p->next;

}

pd=AddPolyn(pa,h);

for(p=h->next;p;p=p->next) //恢复pb的系数

p->coef*=-1;

return pd;

}//SubtractPolyn

int main(){

int m,n,flag=0;

float x;

Polyn pa=0,pb=0,pc,pd,pe,pf;//定义各式的头指针,pa与pb在使用前付初值NULL

printf("请输入a的项数:");

scanf("%d",&m);

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

printf("请输入b的项数:");

scanf("%d",&n);

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

//输出菜单

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

printf("操作提示:\n\t1.输出多项式a和b\n\t2.建立多项式a+b\n\t3.建立多项式a-b\n");

printf("\t4.退出\n**********************************************\n");

for(;;flag=0){

printf("执行操作:");

scanf("%d",&flag);

if(flag==1){

printf("多项式a:");PrintPolyn(pa);

printf("多项式b:");PrintPolyn(pb);continue;

}

if(flag==2){

pc=AddPolyn(pa,pb);

printf("多项式a+b:");PrintPolyn(pc);

DestroyPolyn(pc);continue;

}

if(flag==3){

pd=SubtractPolyn(pa,pb);

printf("多项式a-b:");PrintPolyn(pd);

DestroyPolyn(pd);continue;

}

if(flag==4) break;

if(flag<1||flag>4) printf("Error!!!\n");continue;

}//for

DestroyPolyn(pa);

DestroyPolyn(pb);

return 0;

}

四、调试与分析

4.1调试过程

4.2测试的数据

4.3算法的时间复杂度及改进

算法的时间复杂度:一元多项式的加法运算的时间复O(m+n),减法运算的时间复杂度为O(m-n),其中m,n分别表示二个一元多项式的项数。

问题和改进思想:在设计该算法时,出现了一些问题,例如在建立链表时头指针的设立导致了之后运用到相关的指针时没能很好的移动指针出现了数据重复输出或是输出系统缺省值,不能实现算法。实现加法时该链表并没有向通常那样通过建立第三个链表来存放运算结果,而是再度利用了链表之一来进行节点的比较插入删除等操作。为了使输入数据按指数降序排列,可在数据的输入后先做一个节点的排序函数,通过对链表排序后再进行之后加减运算。

参考文献:《数据结构》、《C程序》

总结:每一次课设都是对自己综合能力的提高,这次也不例外。数据结构是一门应用性很高的基础课程。

1.通过此次课设,我复习了C语言课程,并在此基础上,利用数据结

构,能够变出更具有实用性,也具有更复杂功能的程序。很多以前想象不

到的功能,通过数据结构巧妙的安排,也可以轻松实现。

2.通过此次课设,我能够借阅资料。通过更为广泛的寻找来为自己获得启发;通过请教他人,运用合作意识,让自己的做事效率更高,为自己增添信心。

相关文档
最新文档