数据结构课程设计帅.docx
- 文档编号:3170899
- 上传时间:2023-05-05
- 格式:DOCX
- 页数:16
- 大小:108.62KB
数据结构课程设计帅.docx
《数据结构课程设计帅.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计帅.docx(16页珍藏版)》请在冰点文库上搜索。
数据结构课程设计帅
山东英才学院
课程设计
课程名称:
数据结构
题目:
一元多项式计算
学院信息工程学院
学生姓名左**
学号20120*****
专业层次2012级本科
班级本科信息管理
任课教师
年月日
一、课程设计题目分析
本课程设计要求利用C语言或C++编写,本程序实现了一元多项式的加法、减法、乘法、除法运算等功能。
二、设计思路
本程序采用C语言来完成课程设计。
1、首先,利用顺序存储结构来构造两个存储多项式A(x)和B(x)的结构。
2、然后把输入,加,减,乘,除运算分成五个主要的模块:
实现多项式输入模块、实现加法的模块、实现减法的模块、实现乘法的模块、实现除法的模块。
3、然后各个模块里面还要分成若干种情况来考虑并通过函数的嵌套调用来实现其功能,尽量减少程序运行时错误的出现。
4、最后编写main()主函数以实现对多项式输入输出以及加、减、乘、除,调试程序并将不足的地方加以修改。
三、算法分析
1、相关函数说明:
(1)定义数据结构类型为线性表的链式存储结构类型变量
typedefstructPolynomial{}
(2)其他功能函数
插入函数voidInsert(Polynp,Polynh)
比较函数intcompare(Polyna,Polynb)
建立一元多项式函数PolynCreate(Polynhead,intm)
求解并建立多项式a+b,PolynAdd(Polynpa,Polynpb)
求解并建立多项式a-b,PolynSubtract(Polynpa,Polynpb)
求解并建立多项式a*b,PolynMultiply(Polynpa,Polynpb)
求解并建立多项式a/b,voidDevice(Polynpa,Polynpb)
输出函数输出多项式,voidPrint(PolynP)
销毁多项式函数释放内存,voidDestroy(Polynp)
主函数,voidmain()
2、主程序的流程基函数调用说明
(1)typedefstructPolynomial
{
floatcoef;
intexpn;
structPolynomial*next;
}*Polyn,Polynomial;
在这个结构体变量中coef表示每一项前的系数,expn表示每一项的指数,polyn为结点指针类型,属于抽象数据类型通常由用户自行定义,Polynomial表示的是结构体中的数据对象名。
(2)当用户输入两个一元多项式的系数和指数后,建立链表,存储这两个多项式,主要说明如下:
PolynCreatePolyn(Polynhead,intm)建立一个头指针为head、项数为m的一元多项式
p=head=(Polyn)malloc(sizeof(structPolynomial));为输入的多项式申请足够的存储空间
p=(Polyn)malloc(sizeof(structPolynomial));建立新结点以接收数据
Insert(p,head);调用Insert函数插入结点
这就建立一元多项式的关键步骤
(3)由于多项式的系数和指数都是随即输入的,所以根据要求需要对多项式按指数进行降幂排序。
在这个程序模块中,使用链表,根据对指数大小的比较,对各种情况进行处理,此处由于反复使用指针对各个结点进行定位,找到合适的位置再利用void Insert(Polyn p,Polyn h)进行插入操作。
(4)加、减、乘、除、的算法实现:
在该程序中,最关键的一步是实现四则运算和输出,由于加减算法原则是一样,减法可通过系数为负的加法实现;对于乘除算法的大致流程都是:
首先建立多项式a*b,a/b,然后使用链表存储所求出的乘积,商和余数。
这就实现了多项式计算模块的主要功能。
(5)另一个子函数是输出函数 PrintPolyn();
输出最终的结果,算法是将最后计算合并的链表逐个结点依次输出,便得到整链表,也就是最后的计算式计算结果。
由于考虑各个结点的指数情况不同,分别进行了判断处理。
四、程序新点
通过多次写程序,发现程序在控制台运行时总是黑色的,本次写程序就想着改变一下,于是经过查资料利用system("ColorE0");函数可以解决,这里“E0”,E是控制台背景颜色,0是控制台输出字体颜色。
五、设计中遇到的问题及解决办法
首先是,由于此次课程设计里使用指针使用比较多,自己在指针多的时候易脑子混乱出错,对于此问题我是采取比较笨的办法在稿纸上写明白后开始进行代码编写。
其次是,在写除法模块时比较复杂,自己通过查资料最后成功写出除法模块功能。
最后是,前期分析不足开始急于写代码,中途出现各种问题,算是给自己以后设计时的一个经验吧。
六、测试(程序截图)
1.数据输入及主菜单
2.加法和减法模块
3.乘法和除法模块
七、总结
通过本次应用C语言设计一元多项式基本计算程序,使我更加巩固了C语言程序设计的知识,以前对指针这一点使用是比较模糊,现在通过此次课程设计对指针理解的比较深刻了。
而且对于数据结构的相关算法和函数的调用方面知识的加深。
本次的课程设计,一方面提高了自己独立思考处理问题的能力;另一方面使自己再设计开发程序方面有了一定的小经验和想法,对自己以后学习其他语言程序设计奠定了一定的基础。
八、指导老师评语及成绩
附录:
(课程设计代码)
#include
#include
#include
typedefstructPolynomial
{
floatcoef;
intexpn;
structPolynomial*next;
}*Polyn,Polynomial;//Polyn为结点指针类型
voidInsert(Polynp,Polynh)
{
if(p->coef==0)free(p);//系数为0的话释放结点
else
{
Polynq1,q2;
q1=h;q2=h->next;
while(q2&&p->expn
{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;}//指数为新时将结点插入
}
}
//建立一个头指针为head、项数为m的一元多项式
PolynCreate(Polynhead,intm)
{
inti;
Polynp;
p=head=(Polyn)malloc(sizeof(structPolynomial));
head->next=NULL;
for(i=0;i { p=(Polyn)malloc(sizeof(structPolynomial));//建立新结点以接收数据 printf("请输入第%d项的系数与指数: ",i+1); scanf("%f%d",&p->coef,&p->expn); Insert(p,head);//调用Insert函数插入结点 } returnhead; } //销毁多项式p voidDestroy(Polynp) { Polynq1,q2; q1=p->next; q2=q1->next; while(q1->next) { free(q1); q1=q2;//指针后移 q2=q2->next; } } //输出多项式p intPrint(PolynP) { Polynq=P->next; intflag=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'); elseif(q->expn)printf("X^%d",q->expn); } else { if(q->coef==1) { if(! q->expn)putchar('1'); elseif(q->expn==1)putchar('X'); elseprintf("X^%d",q->expn); } if(q->coef==-1) { if(! q->expn)printf("-1"); elseif(q->expn==1)printf("-X"); elseprintf("-X^%d",q->expn); } } q=q->next; flag++; } printf("\n"); } intcompare(Polyna,Polynb) { if(a&&b) { if(! b||a->expn>b->expn)return1; elseif(! a||a->expn elsereturn0; } elseif(! a&&b)return-1;//a多项式已空,但b多项式非空 elsereturn1;//b多项式已空,但a多项式非空 } //求解并建立多项式a+b,返回其头指针 PolynAdd(Polynpa,Polynpb) { 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; qa=qa->next; break; case0: 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; } if(qc->coef! =0) { qc->next=hc->next; hc->next=qc; hc=qc; } elsefree(qc);//当相加系数为0时,释放该结点 } returnheadc; } //求解并建立多项式a-b,返回其头指针 PolynSubtract(Polynpa,Polynpb) { Polynh=pb; Polynp=pb->next; Polynpd; while(p)//将pb的系数取反 {p->coef*=-1;p=p->next;} pd=Add(pa,h); for(p=h->next;p;p=p->next)//恢复pb的系数 p->coef*=-1; returnpd; } //求解并建立多项式a*b,返回其头指针 PolynMultiply(Polynpa,Polynpb) { 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; } //求解并建立多项式a/b,返回其头指针 voidDevice(Polynpa,Polynpb) { Polynhf,pf,temp1,temp2; Polynqa=pa->next; Polynqb=pb->next; hf=(Polyn)malloc(sizeof(structPolynomial));//建立头结点,存储商 hf->next=NULL; pf=(Polyn)malloc(sizeof(structPolynomial));//建立头结点,存储余数 pf->next=NULL; temp1=(Polyn)malloc(sizeof(structPolynomial)); temp1->next=NULL; temp2=(Polyn)malloc(sizeof(structPolynomial)); temp2->next=NULL; temp1=Add(temp1,pa); while(qa! =NULL&&qa->expn>=qb->expn) { temp2->next=(Polyn)malloc(sizeof(structPolynomial)); temp2->next->coef=(qa->coef)/(qb->coef); temp2->next->expn=(qa->expn)-(qb->expn); Insert(temp2->next,hf); pa=Subtract(pa,Multiply(pb,temp2)); qa=pa->next; temp2->next=NULL; } pf=Subtract(temp1,Multiply(hf,pb)); pb=temp1; printf("商是: "); Print(hf); printf("余数是: "); Print(pf); } voidmain() { intchoose=1; intm,n,flag=0; system("ColorE0"); Polynpa=0,pb=0,pc,pd,pf;//定义各式的头指针,pa与pb在使用前付初值NULL printf("请输入A(x)的项数: "); scanf("%d",&m); printf("\n"); pa=Create(pa,m);//建立多项式A printf("\n"); printf("请输入B(x)的项数: "); scanf("%d",&n); printf("\n"); pb=Create(pb,n);//建立多项式B printf("\n"); printf("**********************************************\n"); printf("*多项式操作菜单*\n"); printf("**********************************************\n"); printf("\t\t1.输出操作\n"); printf("\t\t2.加法操作\n"); printf("\t\t3.减法操作\n"); printf("\t\t4.乘法操作\n"); printf("\t\t5.除法操作\n"); printf("\t\t6.退出操作\n"); printf("**********************************************\n"); while(choose) { printf("执行操作: "); scanf("%d",&flag); switch(flag) { case1: printf("多项式A(x): ");Print(pa); printf("多项式B(x): ");Print(pb); break; case2: pc=Add(pa,pb); printf("多项式A(x)+B(x): "); Print(pc); Destroy(pc); break; case3: pd=Subtract(pa,pb); printf("多项式A(x)-B(x): "); Print(pd); Destroy(pd); break; case4: pf=Multiply(pa,pb); printf("多项式A(x)*B(x): "); Print(pf); Destroy(pf); break; case5: Device(pa,pb); break; case6: exit(0); break; } } Destroy(pa); Destroy(pb); }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 课程设计
![提示](https://static.bingdoc.com/images/bang_tan.gif)