数据结构课程设计报告顺序结构动态链表结构下的一元多项式的加法减法乘法的实现。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
山东理工大学计算机学院课程设计(数据结构)
级班
名姓
号学
指导教师
二○一二年一月十日
课程设计任务书及成绩评定
顺序结构、动态链表结构下的一元多项式的加法、减法、乘法的课题名称实现。
Ⅰ、题目的目的和要求:
1. 巩固和加深对数据结构的理解,通过上机实验、调试程序,加深对课本知识的理解,最终使学生能够熟练应用数据结构的知识写程序。
1)通过本课程的学习,能熟练掌握几种基本数据结构的基本操作。
2)能针对给定题目,选择相应的数据结构,分析并设计算法,进而给出问题的正确求解过程并编写代码实现。
2.设计题目要求:
1)首先判定多项式是否稀疏
2)分别采用顺序和动态存储结构实现;
结果M(x)3)中无重复阶项和无零系数项;
要求输出结果的升幂和降幂两种排列情况; 4)
Ⅱ、设计进度及完成情况
Ⅲ、主要参考文献及资料
[1] 严蔚敏数据结构(C语言版)清华大学出版社 1999
[2] 严蔚敏数据结构题集(C语言版)清华大学出版社 1999
[3] 谭浩强 C语言程序设计清华大学出版社
[4] 与所用编程环境相配套的C语言或C++相关的资料
Ⅳ、成绩评定:
设计成绩:(教师填写)
(签字)指导老师:
日十月一年二○一二
目录
第一章概述 (1)
第二章系统分析 (2)
第三章概要设计 (3)
第四章详细设
计 (4)
第五章运行与测试 (17)
第六章总结与心得 (19)
20
参考文献……………………………………………………………….第一章概述
课程设计是实践性教学中的一个重要环节,它以某一课程为基础,可以涉及和课程相关的各个方面,是一门独立于课程之外的特殊课程。
课程设计是让同学们对所学的课程更全面的学习和应用,理解和掌握课程的相关知识。
《数据结构》是一门重要的专业基础课,是计算机理论和应用的核心基础课程。
数据结构课程设计,要求学生在数据结构的逻辑特性和物理表示、数据结构的选择和应用、算法的设计及其实现等方面,加深对课程基本内容的理解。
同时,在程序设计方法以及上机操作等基本技能和科学作风方面受到比较系统和严格的
训练。
在这次的课程设计中我选择的题目是顺序结构、动态链表结构下的一元多项式的加法、减法、乘法的实现。
分别采用顺序结构和链式存储结构,利用多项得结果,最后得多项式中不含有重复阶项和零系数得项。
除此之外,还得分为降幂和升幂两种排序方式。
1
第二章系统分析
1.顺序结构、动态链表结构下的一元多项式的加法、减法、乘法的实现。
可以分为几个模块:输入模块、输出模块(升幂降幂)、数据处理模块(多项式的加减乘)、主程序模块。
2.在程序过程中加入汉字提示符,让使用者清楚明白的操作该程序。
运行程序时看起来简洁有序,操作简单明了。
3.程序执行时的命令:①选择创建两个一元多项式②输入第一个一元多项式的项数③依次输入一元多项式的系数和指数④以相同方式输入第二个一元多项式⑤选择操作方式⑥选择降幂或升幂排序⑦输出结果⑧是否退出。
4. 测试数据。
输入的一元多项式系数指数分别为7 0,3 1,9 8,5 17和8 1,22 7,-9 8。
加法结果为;升幂降幂
减法结果为:升幂降幂
乘法结果为:升幂降幂
2
第三章概要设计
1、数据结构的设计
在该程序中分别分为顺序存储和链式存储结构。
2、算法的设计
本程序主要分为四大模块
①主程序模块
②输入模块:通过main函数输入
③输出模块(升幂降幂):PrintPolyn函数实现输出
④数据处理模块(多项式的加减乘):通过一元多项式的Polynomial基本操作实现
3、抽象数据类型的设计
一元多项式抽象数据类型的定义:
抽象数据类型Polynomial的定义:
3
第四章详细设计
#include<iostream>
using namespace std;
struct term//顺序表和链表的的定义
{
float xishu; //系数
int zhishu; //指数
};
struct LNode
{
term data; //term多项式值
struct LNode *next;
};
typedef LNode* polynomail;
*/
/*合并同类项polynomail hebing(polynomail Head)
{
polynomail r,q,p,Q;
for(q=Head->next;q!=NULL;q=q->next)//合并同类项
for(p=q->next,r=q;p!=NULL;)
if(q->data.zhishu==p->data.zhishu)//指数相等系数相加
{
q->data.xishu=q->data.xishu+p->data.xishu;
r->next=p->next;
Q=p;p=p->next;
p
释放delete Q;//
}
else
{
r=r->next;
4
p=p->next;
}
return Head;//得到不含同类项的多项式
}
/*又小到大排列*/
void arrange1(polynomail pa)
{
polynomail h=pa,p,q,r;
for(p=pa;p->next!=NULL;p=p->next);r=p;//r指向参与比较的最后一个while(h->next!=r)// 大的沉底
{
for(p=h;p->next!=r&&p!=r;p=p->next)
if(p->next->data.zhishu>p->next->next->data.zhishu)// 比较指数的大小 {
q=p->next->next;
p->next->next=q->next;//指数大的向前移动
q->next=p->next;
p->next=q;
}
指向参与比较的最后一个,不断向前移动r=p;//r
}
}
*/
/*由大到小排序void arrange2(polynomail pa)
{
polynomail h=pa,p,q,r;
for(p=pa;p->next!=NULL;p=p->next); r=p;
while(h->next!=r)//小的沉底
{
5
for(p=h;p->next!=r&&p!=r;p=p->next)
if(p->next->data.zhishu<p->next->next->data.zhishu)//指数比较大小{
q=p->next->next;
p->next->next=q->next;//指数小的向后移动
q->next=p->next;
p->next=q;
}
r=p;//r指向参与比较的最后一个,不断向前移动
}
}
/*判断多项式的稀疏 */
bool judge(polynomail Head)//逻辑变量字符bool
{
arrange2(Head);
polynomail p;
p=Head->next;
bool xi=false;
while(p!=NULL&&p->next!=NULL&&!xi)
{
if(p->data.zhishu-p->next->data.zhishu>1)
xi=true;
p=p->next;
}
return xi;
}
*/ 求项数,打印多项式/*void printpolyn(polynomail P)
{
int i;
6
polynomail q;
if(P==NULL)
潣瑵? 无项<<endl;
else if(P->next==NULL)
cout<<Y=0<<endl;
else
{
潣瑵? 该多项式为Y=;
q=P->next;
i=1;
if(q->data.xishu!=0&&q->data.zhishu!=0)
{
cout<<q->data.xishu<<X^<<q->data.zhishu;
i++;
}
if(q->data.zhishu==0&&q->data.xishu!=0)
打印第一项 cout<<q->data.xishu;//q=q->next;
if(q==NULL)
{
cout<<endl;
return ;
}
while(1)//while中,打印剩下项中系数非零的项,{
if(q->data.xishu!=0&&q->data.zhishu!=0)
{
if(q->data.xishu>0)
cout<<+;
cout<<q->data.xishu<<X^<<q->data.zhishu;
7
i++;
}
if(q->data.zhishu==0&&q->data.xishu!=0)
{
if(q->data.xishu>0) cout<<+;
cout<<q->data.xishu;
}
q=q->next;
if(q==NULL)
{
cout<<endl;
break;
}
}
}
}
/*1、创建并初始化多项式链表*/ polynomail creatpolyn(int m)
{
polynomail Head,r,s;
int i;
Head=new LNode;
r=Head;
for(i=0;i<m;i++)
{
s=new LNode;
潣瑵?请输入第?椼??项的系数和指数: ; cin>>s->data.xishu>>s->data.zhishu; r->next=s; r=s;
}
8
r->next=NULL;
if(m>1)
{
Head=hebing(Head);
}
return Head;
}
/*2、两多项式相加*/
polynomail addpolyn(polynomail pa,polynomail pb)
{
polynomail s,newHead,q,p,r;int j;
p=pa->next;
q=pb->next;
newHead=new LNode;
r=newHead;
while(p)
{
s=new LNode;
s->data.xishu=p->data.xishu;
s->data.zhishu=p->data.zhishu;
r->next=s; r=s;
p=p->next;
}
while(q)
{
s=new LNode;
s->data.xishu=q->data.xishu;
s->data.zhishu=q->data.zhishu;
r->next=s; r=s;
q=q->next;
9
}
r->next=NULL;
if(newHead->next!=NULL&&newHead->next->next!=NULL)//合并同类项 newHead=hebing(newHead);
潣瑵?升序 1 , 降序 2<<endl;
潣瑵? 选择:;
cin>>j;
if(j==1)
arrange1(newHead);
else
arrange2(newHead);
return newHead;
}
/*3、两多项式相减*/
polynomail subpolyn(polynomail pa,polynomail pb)
{
polynomail s,newHead,q,p,r; int j;
p=pa->next;q=pb->next;
newHead=new LNode;
r=newHead;
while(p)
{
s=new LNode;
s->data.xishu=p->data.xishu;
s->data.zhishu=p->data.zhishu;
r->next=s; r=s;
p=p->next;
}
while(q)
10
{
s=new LNode;
s->data.xishu=-q->data.xishu;
s->data.zhishu=q->data.zhishu;
r->next=s; r=s;
q=q->next;
}
r->next=NULL;
if(newHead->next!=NULL&&newHead->next->next!=NULL)//合并同类项 newHead=hebing(newHead);
潣瑵?升序 1 , 降序 2<<endl;
潣瑵?选择:;
cin>>j;
if(j==1)
arrange1(newHead);
else
arrange2(newHead);
return newHead;
}
*/
/*4两多项式相乘polynomail mulpolyn(polynomail pa,polynomail pb) {
polynomail s,newHead,q,p,r;
int j;
newHead=new LNode;
r=newHead;
for(p=pa->next;p!=NULL;p=p->next)
for(q=pb->next;q!=NULL;q=q->next)
{
s=new LNode;
11
s->data.xishu=p->data.xishu*q->data.xishu;
s->data.zhishu=p->data.zhishu+q->data.zhishu;
r->next=s;
r=s;
}
r->next=NULL;
潣瑵?升序 1 , 降序 2<<endl;
潣瑵?选择 :;
cin>>j;
if(j==1) arrange1(newHead);
else arrange2(newHead);
if(newHead->next!=NULL&&newHead->next->next!=NULL)//合并同类项
newHead=hebing(newHead);
return newHead;
}
/*5、销毁已建立的两个多项式*/
void delpolyn(polynomail pa,polynomail pb)
{
polynomail p,q;
p=pa;
while(p!=NULL)
q=p;
p=p->next;
free(q);
}
p=pb;
while(p!=NULL)
{
q=p;
12
p=p->next;
free(q);
}
潣瑵?两个多项式已经销毁 <<endl;
}
void main()
{
polynomail pa=NULL,pb=NULL;
polynomail addp=NULL,subp=NULL,mulp=NULL;
int n,m;
while(1)
{
cout<<、创建两个一元多项式<<endl;
cout<< 、两多项式相加得一新多项式<<endl;
cout<< 、两多项式相减得一新多项式 <<endl; cout<<
、两多项式相乘得一新多项式 <<endl;
cout<<_x0005_ 、销毁已建立的两个多项式 <<endl;
cout<< 、退出<<endl;
潣瑵?请选择: ;
cin>>n;
switch(n)
{
case 1:
if(pa!=NULL)
{
潣瑵?已建立两个一元多项式,请选择其他操作! ;
break;
}
:<<endl; 潣瑵? 请输入第一个多项式
;
潣瑵? 要输入几项:13
cin>>m;
while(m==0)
{
cout<<m 不能为 0,请重新输入m:;
cin>>m;
}
pa=creatpolyn(m);
printpolyn(pa);
if(judge(pa))
<<endl; 潣瑵?该多项式稀疏else
潣瑵? 该多项式稠密 <<endl;
潣瑵? 请输入第二个多项式 :<<endl;
潣瑵? 要输入几项:<<endl;
cin>>m;
pb=creatpolyn(m);
printpolyn(pb);
if(judge(pb))
潣瑵? 该多项式稀疏 <<endl;
else
潣瑵? 该多项式稠密 <<endl;
break;
case 2:
if(pa==NULL)
{
潣瑵?请先创建两个一元多项式! <<endl;
break;
}
多项式相加 addp=addpolyn(pa,pb);//printpolyn(addp);
14
break;
case 3:
if(pa==NULL)
{
潣瑵?请先创建两个一元多项式 !<<endl;
break;
}
多项式相减 subp=subpolyn(pa,pb);// 打印输出printpolyn(subp);//break;
case 4:
if(pa==NULL)
{
潣瑵? 请先创建两个一元多项式 !<<endl;
break;
}
多项式相乘 mulp=mulpolyn(pa,pb);//
打印输出printpolyn(mulp);//
break;
case 5:
if(pa==NULL)
{
潣瑵?请先创建两个一元多项式 <<endl;
break;
}
多项式的删除delpolyn(pa,pb);//pa=pb=NULL; break;
case 6:
delpolyn(pa,pb);
15
exit(0);
}
}
}
16
第五章运行与测试
程序开始界面
分别输入两个多项
17
7+3x+9x^8+5x^17
第一项:2x^4+4x^3+5x^6
第二项:
18
第六章总结与心得
通过这次的课程设计,让我深有感触。
以前总是不注重基本的知识,到了真正应用的时候才知道自己知识的匮乏,才意识到自己对于课本都不是非常了解,这些让我在真实构造程序框架的时候真的是大费周章,后来经过查询资料,才恍然大悟,原来都是一些自己原本很熟悉的东西,知识因为自己对于知识的认识不够深刻才使得自己在真正用到他们的时候不能得心应手。
另外,在刚刚把程序做完的时候,自己好像成功了一般,但是我错了,因为程序的运行时一项非常重要的过程,而我才刚刚意识到,如此当然是漏洞百出,那是我真的一时都不知所措,错误太多了,后来我才知道,程序需要一步一步的运行,保证每一个小项都没有错误才能使得整个程序没有错误,就这样,这个程序才能真正的运行了。
其实,我明白一个程序可以运行固然重要,但是如果可以在这基础上令程序简洁而有效将是一个质的提高,我也是在不断的思考不断的改进,让这个程序能够简单有效。
19
参考文献:
[1] 严蔚敏、吴伟民主编《数据结构》(C语言版)清华大学出版社 2002
[2] 殷人昆等著《数据结构》(C++版)清华大学出版社 2001
[3] 金远平著《数据结构》(C++描述)清华大学出版社 2005
[4] 许卓群等著高等教育出版社 2004 《数据结构与算法》等著《数据结构与C++高级教程》清华大学出版社 2004 [5] Frank M.Carrano 《数据结构习题集》(C语言版)清华大学出版社 [6] 严蔚敏、吴伟民
20。