数据结构课程设计报告一元多项式加减运算.docx
《数据结构课程设计报告一元多项式加减运算.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计报告一元多项式加减运算.docx(24页珍藏版)》请在冰豆网上搜索。
数据结构课程设计报告一元多项式加减运算
山东理工大学计算机学院
课程设计
(数据结构)
班级
计科1102
姓名
张汝全
学号
1111051010
指导教师
肖爱梅
2013年1月7日
课程设计任务书及成绩评定
课题名称
动态链表结构下的一元多项式的加法、减法和乘法的实现。
Ⅰ、题目的目的和要求:
1.巩固和加深对数据结构的理解,通过上机实验、调试程序,加深对课本知识的理解,最终使学生能够熟练应用数据结构的知识写程序。
(1)通过本课程的学习,能熟练掌握几种基本数据结构的基本操作。
(2)能针对给定题目,选择相应的数据结构,分析并设计算法,进而给出问题的正确求解过程并编写代码实现。
2.设计题目要求:
1)首先判定一元多项式是否稀疏
2)分别采用顺序和链式结构实现;
3)结果在M(x)中无重复阶项和无零系数项;
4)要求结果以升幂排列输出
Ⅱ、设计进度及完成情况
日期
内容
1.7-1.9
选取参考书,查阅有关文献资料,完成资料搜集和系统分析工作。
1.10-1.12
创建相关数据结构,录入源程序。
1.13-1.15
调试程序并记录调试中的问题,初步完成课程设计报告。
1.16
上交课程设计报告打印版并进行课程设计答辩,要求每个同学针对自己的设计回答指导教师3-4个问题。
1.17
考核结束后将课程设计报告和源程序的电子版交班长统一刻光盘上交。
Ⅲ、主要参考文献及资料
[1]严蔚敏数据结构(C语言版)清华大学出版社1999
[2]严蔚敏数据结构题集(C语言版)清华大学出版社1999
[3]谭浩强C语言程序设计清华大学出版社
[4]与所用编程环境相配套的C语言或C++相关的资料
Ⅳ、成绩评定:
设计成绩:
(教师填写)
指导老师:
(签字)
二年月日
第一章概述……………………………………………………………1
第二章系统分析………………………………………………………2
第三章概要设计………………………………………………………3
第四章详细设计………………………………………………………4
第五章运行与测试……………………………………………………18
第六章总结与心得……………………………………………………20
参考文献………………………………………………………………21
第一章概述
课程设计是实践性教学中的一个重要环节,它以某一课程为基础,可以涉及和课程相关的各个方面,是一门独立于课程之外的特殊课程。
课程设计是让同学们对所学的课程更全面的学习和应用,理解和掌握课程的相关知识。
《数据结构》是一门重要的专业基础课,是计算机理论和应用的核心基础课程。
数据结构课程设计,要求学生在数据结构的逻辑特性和物理表示、数据结构的选择和应用、算法的设计及其实现等方面,加深对课程基本内容的理解。
同时,在程序设计方法以及上机操作等基本技能和科学作风方面受到比较系统和严格的训练。
在这次的课程设计中我选择的题目是动态链表结构下的一元多项式的加法、减法和乘法的实现。
一元多项式计算是用C语言设计一个一元多项式简单计算器。
它能够实现按指数升序排列建立并输出多项式,并且能够完成两个多项式的相加、相减与相乘的运算和将其结果输入的功能。
通过设计一元多项式,初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能提高,综合运用所学的理论知识和方法独立分析和解决问题的能力;加深对常用数据结构的理解,强化逻辑思维能力和动手能力,巩固良好的编程习惯,掌握工程软件设计的基本方法,为后续课程的学习打下坚实基础。
第二章系统分析
1.动态链表结构下的一元多项式的加法、减法、乘法的实现。
可以分为几个模块:
输入模块、输出模块(升幂)、数据处理模块(多项式的加减乘)、主程序模块。
2.在程序执行过程中加入汉字提示符,让使用者清楚明白的操作该程序。
运行程序时看起来简洁有序,操作简单明了。
3.程序执行时的命令:
①创建两个一元多项式②输入第一个一元多项式的项数③依次输入一元多项式的系数和指数④以相同方式输入第二个一元多项式⑤数据处理⑥输出结果。
4.测试数据。
输入的一元多项式系数指数分别为70,31,98,517和81,227,-98。
加法结果为:
7+11x+22x^(7)+5x^(17)
减法结果为:
7-5x-22x^(7)+18x^(8)+5x^(17)
5.乘法结果为:
56x+24x^
(2)+154x^(7)+3x^(8)+45x^(9)+198x^(15)-81x^(16)+40x^(18)+110x^(24)-45x^(25)
第三章概要设计
1.数据结构的设计
为了节省存储空间,只存储多项式中系数非零的项,本程序使用链式存储结构。
2.算法的设计本设计从总体上划分为3个模块。
a)主函数模块。
程序的入口,主要实现各个函数的调用。
b)头文件模块。
定义类和结构体。
c)函数模块。
数据处理和实现每个功能。
3.抽象数据类型
ADTlist{
数据对象:
D={ai|ai∈ElenSet,i=1,2,…,n,n≥0}
数据关系:
R1={|ai-1,ai∈D,i=2,…,n}
基本操作:
InitLink(&head,len)
初始条件:
链表为空。
操作结果:
创建链表。
Sparsity(&head,len)
初始条件:
链表已存在。
操作结果:
判断是否稀疏。
Display(head)
初始条件:
链表已存在。
操作结果:
输出多项式。
Merge(&head)
初始条件:
链表已存在。
操作结果:
合并指数相同的项。
SelectSort(&head)
初始条件:
链表已存在。
操作结果:
选择排序。
Negative(&head)
初始条件:
链表已存在。
操作结果:
取负。
DelZero(&head)
初始条件:
链表已存在。
操作结果:
删除系数为0的项。
operator+(&head,&b);
初始条件:
链表已存在。
操作结果:
重载+。
operator*(&head,&b);
初始条件:
链表已存在。
操作结果:
重载*。
}
第四章详细设计
1.类定义。
polynomial.h
#ifndefPOLYNOMIAL_H_INCLUDED
#definePOLYNOMIAL_H_INCLUDED
template
structNode{
Tcoef;//定义系数
Texpn;//定义指数
Node*next;
};//定义结构体
template//模板类
classLinkList{
private:
Node*head;//定义头结点
public:
LinkList();//初始化链表
voidInitLink(intlen);//建立链表
voidSparsity(intlen);//是否稀疏
voidDisplay();//显示
voidMerge();//合并指数相同的项
voidSelectSort();//选择排序
voidNegative();//取负
voidDelZero();//删除系数为0的项
LinkListoperator+(LinkList&b);//重载+
LinkListoperator*(LinkList&b);//重载*
};
#endif//POLYNOMIAL_H_INCLUDED
2.成员函数。
polynomial.cpp
#include
#include"polynomial.h"
usingnamespacestd;
template
LinkList:
:
LinkList(){
head=newNode;
head->next=NULL;
}//初始化
template
voidLinkList:
:
InitLink(intlen){
Node*p,*q;
q=head;
cout<<"系数指数:
"<while(len--){
p=newNode;
cin>>p->coef>>p->expn;
p->next=NULL;
q->next=p;
q=p;
}
}//建立多项式
template
voidLinkList:
:
Display(){
DelZero();
Node*q;
q=head->next;
if(!
q){//空链表输出0
cout<<"0"<return;
}
if(q->coef){
if(q->coef==1){
if(q->expn==0){
cout<coef;
}
elseif(q->expn==1){
cout<<"x";
}
else{
cout<<"x^"<<"("<expn<<")";
}
}
elseif(q->coef==-1){
if(q->expn==0){
cout<coef;
}
elseif(q->expn==1){
cout<<"-x";
}
else{
cout<<"-x^"<<"("<expn<<")";
}
}
else{
if(q->expn==0){
cout<coef;
}
elseif(q->expn==1){
cout<coef<<"x";
}
else{
cout<coef<<"x^"<<"("<expn<<")";
}
}
}
q=q->next;
while(q){
if(q->coef){
if(q->coef>0){
if(q->coef==1){
if(q->expn==0){
cout<<"+";
}
elseif(q->expn==1){
cout<<"+x";
}
else{
cout<<"+x^"<<"("<expn<<")";
}
}
else{
if(q->expn==0){
cout<<"+"<coef;
}
elseif(q->expn==1){
cout<<"+"<coef<<"x";
}
else{
cout<<"+"<coef<<"x^"<<"("<expn<<")";
}
}
}
else{
if(q->coef==-1){
if(q->expn==0){
cout<coef;
}
elseif(q->expn==1){
cout<<"-x";
}
else{
cout<<"-x^"<<"("<expn<<")";
}
}
else{
if(q->expn==0){
cout<coef;
}
elseif(q->expn==1){
cout<coef<<"x";
}
else{
cout<coef<<"x^"<<"("<expn<<")";
}
}
}
}
q=q->next;
}
cout<}//输出多项式
template
voidLinkList:
:
Sparsity(intlen){
if(head->next==NULL){
cout<<"0"<cout<<"不稀疏!
"<return;
}
Node*p,*q;
q=head;
p=head->next;
while(q->next){
q=q->next;
}
doublex=1.0*len/(q->expn-p->expn);
Display();
if(x<=0.05)
cout<<"稀疏!
"<else
cout<<"不稀疏!
"<}//判断是否稀疏
template
voidLinkList:
:
Merge(){
Node*p,*q,*t;
for(q=head->next;q;q=q->next){
for(p=q->next;p&&p->expn==q->expn;){
q->coef+=p->coef;
q->next=p->next;
t=p;
p=p->next;
free(t);
}
}
}//合并指数相同的项
template
voidLinkList:
:
SelectSort(){
Node*p,*q;
for(q=head->next;q;q=q->next){
for(p=q->next;p;p=p->next){
if(q->expn>p->expn){
swap(q->coef,p->coef);
swap(q->expn,p->expn);
}
}
}
Merge();
}//选择排序升幂
template
voidLinkList:
:
Negative(){
Node*p;
p=head->next;
while(p){
p->coef=0-p->coef;
p=p->next;
}
}//取负
template
voidLinkList:
:
DelZero(){
Node*p,*q,*t;
p=head->next;
q=head;
while(p){
if(p->coef==0){
q->next=p->next;
t=p;
p=p->next;
free(t);
}
else{
q=p;
p=p->next;
}
}
}//删除系数为0的项
template
LinkListLinkList:
:
operator+(LinkList&b){
LinkListm;
Node*q,*p;
Node*pa,*pb;
pa=head->next;
pb=b.head->next;
q=m.head;
while(pa&&pb){
Tx=pa->expn-pb->expn;
if(x<0){
p=newNode;
p->coef=pa->coef;
p->expn=pa->expn;
p->next=NULL;
q->next=p;
q=p;
pa=pa->next;
}
elseif(x>0){
p=newNode;
p->coef=pb->coef;
p->expn=pb->expn;
p->next=NULL;
q->next=p;
q=p;
pb=pb->next;
}
else{
Tcoef=pa->coef+pb->coef;
if(coef){
p=newNode;
p->coef=coef;
p->expn=pa->expn;
p->next=NULL;
q->next=p;
q=p;
pa=pa->next;
pb=pb->next;
}
else{
pa=pa->next;
pb=pb->next;
}
}
}
while(pa){
p=newNode;
p->coef=pa->coef;
p->expn=pa->expn;
p->next=NULL;
q->next=p;
q=p;
pa=pa->next;
}
while(pb){
p=newNode;
p->coef=pb->coef;
p->expn=pb->expn;
p->next=NULL;
q->next=p;
q=p;
pb=pb->next;
}
returnm;
}//重载+
template
LinkListLinkList:
:
operator*(LinkList&b){
LinkListm;
Node*q,*p;
Node*pa,*pb;
q=m.head;
for(pa=head->next;pa;pa=pa->next){
for(pb=b.head->next;pb;pb=pb->next){
p=newNode;
p->coef=pa->coef*pb->coef;
p->expn=pa->expn+pb->expn;
p->next=NULL;
q->next=p;
q=p;
}
}
returnm;
}//重载*
voidmenu(){
for(inti=0;i<80;i++)
cout<<"*";
cout<cout<<"1.建立多项式\t\t2.输出多项式\t\t3.多项式相加"<cout<<"4.多项式相减\t\t5.多项式相乘\t\t0.退出系统"<for(i=0;i<80;i++)
cout<<"*";
cout<cout<<"请选择:
";
}
3.主函数。
main.c
#include
#include
#include
#include
#include
#include"polynomial.cpp"
usingnamespacestd;
intmain(){
//freopen("data1.in","r",stdin);//输入重定向
//freopen("data1.out","w",stdout);//输出重定向
LinkLista,b,m1,m2,m3;
intn,flag;
intALen,BLen;
menu();
while(cin>>n,n)
{
system("cls");
switch(n)
{
case0:
{
cout<<"欢迎下次使用!
"<exit(0);
}
case1:
{
flag=0;
cout<<"请输入第一个一元多项式的长度:
";
cin>>ALen;
a.InitLink(ALen);//建立一元多项式
a.SelectSort();//升幂排序
cout<<"请输入第二个一元多项式的长度:
";
cin>>BLen;
b.InitLink(BLen);//建立一元多项式
b.SelectSort();//升序排序
break;
}
case2:
{
cout<<"a=";
a.Sparsity(ALen);//判断是否稀疏
cout<<"b=";
b.Sparsity(BLen);//判断是否稀疏
break;
}
case3:
{
m1=a+b;
m1.SelectSort();
cout<<"a+b=";
m1.Display();//输出a+b
break;
}
case4:
{
if(flag==0){
b.Negative();//对b取负
flag=1;
}
m2=a+b;
m2.SelectSort();
cout<<"a-b=";
m2.Display();//输出a-b
break;
}
case5:
{
if(flag==1){
b.Negative();//b取负
flag=0;
}
m3=a*b;
m3.SelectSort();
cout<<"a*b=";
m3.Display();//输出a*b
break;
}
default:
cout<<"输入错误,请重新输入!
"<}
menu();
}
return0;
}
第五章运行与测试
程序开始界面。
选择1,分别输入两个一元多项式
选择2,输出两个一元多项式
分别选择3、4、5
输入0结束程序
第六章总结与心得
这次课程设计使本学期所学的数据结构知识得到了巩固和应用,并且对C++也有了更进一步的了解。
虽然在设计过程中遇到了一些困难,但感觉收获还是挺多的,自己扩充了很多知识点。
通过这周的课程设计,我意识到好的学习方法的重要性,在学习中要学会主动,学会自学,不要什么东西都指望别人,要靠自己去细心观察,多问自己一个为什么,多动手查查、看看,不会的问题,抬头是google,这样自己学到手的东西才会更多!
参考文献:
[1]严蔚敏、吴伟民主编《数据结构》(C语言版)清华大学出版社2002
[2]殷人昆等著《数据结构》(C++版)清华大学出版社2001
[3]金远平著《数据结构》(C++描述)清华大学出版社2005
[4]许卓群等著《数据结构与算法》高等教育出版社2004
[5]FrankM.Carrano等著《数据结构与C++高级教程》清华大学出版社2004
[6]严蔚敏、吴伟民《数据结构习题集》(C语言版)清华大学出版社
[7]谭浩强