南邮数据结构实验一Word格式文档下载.docx
《南邮数据结构实验一Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《南邮数据结构实验一Word格式文档下载.docx(14页珍藏版)》请在冰豆网上搜索。
吴爱天
班级学号
B15040916
学院(系)
计算机学院
专业
信息安全
线性表的基本运算及多项式的
算术运算
邹志强
实验类型
验证
实验学时
2+2
一、实验目的和要求
(1)深入理解线性表数据结构,掌握线性表的顺序和链接两种存储表示方法.
(2)熟练掌握顺序表的各种基本操作
(3)学会使用顺序表解决应用问题的方法
(4)加深对抽象模板类,类的继承,代码重用,重载等C++语言机制的理解和使用.
二、实验环境(实验设备)
(1)硬件:
MAC
(2)操作系统:
macOS
(3)Xcode
三、实验原理及内容
(1)线性表操作
1在顺序表类SeqList中增加成员函数voidReverse(),实现顺序表的逆转.
2在顺序表类SeqList中增加成员函数boolDeleteX(constT&
x),删除表中所有元素值等于x的元素.若表中存在这样的元素,则删除之,且函数返回true,否则函数返回false.
3编写main函数,调用上述新增函数.
(2)一元多项式的相加和相乘
1设计带表头结点的单链表表示的多项式类,在该类上定义和实现教材2.4节中程序2.7的多项式类上的各个运算.
2在该类上增加成员函数voidPolyMul(Polynominal&
r),并重载*运算符.
3实现菜单驱动的main函数,测试多项式类上的各个运算,输入多项式,显示多项式,多项式加法和乘法运算.
一、线性表操作
1、在顺序表类SeqList中增加成员函数voidReverse(),实现顺序表的逆转.
三个主要类为LinearList、SeqList、SingleList,继承关系如下
●顺序表逆转
template<
typenameT>
voidSeqList<
T>
:
Reverse(){
T*elementsTemp;
elementsTemp=newT[n];
intnCopy=n;
intj=0;
while(nCopy>
0){
elementsTemp[j]=elements[nCopy-1];
nCopy--;
j++;
}
for(inti=0;
i<
n;
i++){
elements[i]=elementsTemp[i];
}
注释:
主要的思路为,新建一个elementsTemp[]数组,SeqList依次从尾部向前扫描,每个数组内的数据依次赋给elementsTemp[],最后在从前向后讲elementsTemp[]内的值一一吧SeqList内值覆盖,完成操作,比较简单,复杂度为O(n)级别。
2、在顺序表类SeqList中增加成员函数boolDeleteX(constT&
●删除所有值为X的元素
主要思路为,依次查找SeqList内的元素,每次都与X的值进行依次对比,如果相同则删除,不同则继续向下扫描,知道SeqList末尾,最后用Search()来检验是否删除干净,复杂度也为O(n).
●测试样例
Reverse()
如图,原数据为74973583072,逆转过后为
72305873497,符合预期。
DeleteX()
如图,原数据中有3个0,输出结果中已经没有0,已经删除干净,符合预期。
二、一元多项式的相加和相乘
1、设计带表头结点的单链表表示的多项式类,在该类上定义和实现教材2.4节中程序2.7的多项式类上的各个运算.
Polynonimal继承于单链表,是一个循环单链表,而且是Term的友元。
多项式类内的各个主要函数为:
Polynominal:
Polynominal(){
theList=newTerm(0,-1);
theList->
link=theList;
~Polynominal(){
Term*p=theList->
link;
while(p!
=theList){
theList->
link=p->
deletep;
p=theList->
deletetheList;
voidPolynominal:
AddTerm(istream&
in){
Term*p=theList;
intc,e;
while
(1){
cout<
<
"
pleaseinputthecoefandexp:
endl;
coef:
;
cin>
>
c;
exp:
e;
if(e<
0)break;
p=p->
InsertAfter(c,e);
Output(ostream&
out)const{
intfirst=1;
thepolynominalis:
for(;
p!
=theList;
p=p->
link){
if(!
first&
&
(p->
coef>
0))out<
+"
//!
first==0表示非第一项
first=0;
out<
*p;
//调用重载<
\n"
PolyAdd(Polynominal&
r){//把多项式r加到多项式this上
Term*tp,*istLoc=theList,*rp;
rp=r.theList->
tp=istLoc->
while(rp->
if(tp->
coef>
rp->
coef){
istLoc=tp;
tp=tp->
continue;
coef==rp->
tp->
coef=tp->
coef+rp->
coef;
coef==0){
istLoc->
link=tp->
deletetp;
}else{
istLoc=istLoc->
InsertAfter(rp->
coef,rp->
exp);
rp=rp->
2、在该类上增加成员函数voidPolyMul(Polynominal&
PolyMul():
主要的思路为,新建一个多项式对象Temp,将两两相乘的所得的项存入
Temp中值得注意的是,每次q多项式每项扫描完毕后,都需要q指针重新归为到它的起点,然后进入p多项式下一个项的相乘周期,复杂度为O(n^2)级别。
3、实现菜单驱动的main函数,测试多项式类上的各个运算,输入多项式,显示多项式,多项式加法和乘法运算.
Main():
加入多项式、多项式相加、多项式相乘
如图,分别检测6X^6+3X^5+4X^2与2X^2+3X相加和相乘运算,得到
6X^6+3X^5+4X^2+2X^2+3X+2X^2+3X和12X^8+18X^7+6X^7+9X^6+8X^4+12X^3,
符合预期。
四、实验小结(包括总结上机调试过程中所遇到的问题和解决方法、感想与建议等)
1、这是我第一次编写这种规模的c++程序,而且加入了图形化菜单,中间突破了很多困难,让我对于c++语法和应用都上了一个台阶。
2、这个程序中的指针操作很多,很多时候一不小心内存就会泄露和报错,debug的时候需要一步步跟踪去查找,费时费力,但是我耐下了心一步步去调试,对于三种新建对象方法的不同之处也有了很深的认识。
3、有些函数中对于边界的判断和逻辑思维的严谨有较高的要求,很多时候找不出出错在哪儿,便会去询问高手,从高手处学到了很多,对于逻辑思维和严谨性的训练,我要用过更多的算法来锻炼。
4、一步步耐心写下这好几百行的代码,觉得比较满足和欣慰。
五、指导教师评语
成绩
批阅人
日期