南邮数据结构实验一.docx
《南邮数据结构实验一.docx》由会员分享,可在线阅读,更多相关《南邮数据结构实验一.docx(14页珍藏版)》请在冰豆网上搜索。
![南邮数据结构实验一.docx](https://file1.bdocx.com/fileroot1/2023-5/29/97e6567a-2263-4183-a5cd-e9e9e3d40f4a/97e6567a-2263-4183-a5cd-e9e9e3d40f4a1.gif)
南邮数据结构实验一
实验报告
(2016/2017学年第一学期)
课程名称
数据结构A
实验名称
线性表的基本运算及多项式的算术运算
实验时间
2017
年
3
月
22
日
指导单位
计算机学院计算机科学与技术系
指导教师
邹志强
学生姓名
吴爱天
班级学号
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
voidSeqList:
:
Reverse(){
T*elementsTemp;
elementsTemp=newT[n];
intnCopy=n;
intj=0;
while(nCopy>0){
elementsTemp[j]=elements[nCopy-1];
nCopy--;
j++;
}
for(inti=0;ielements[i]=elementsTemp[i];
}
}
注释:
主要的思路为,新建一个elementsTemp[]数组,SeqList依次从尾部向前扫描,每个数组内的数据依次赋给elementsTemp[],最后在从前向后讲elementsTemp[]内的值一一吧SeqList内值覆盖,完成操作,比较简单,复杂度为O(n)级别。
2、在顺序表类SeqList中增加成员函数boolDeleteX(constT&x),删除表中所有元素值等于x的元素.若表中存在这样的元素,则删除之,且函数返回true,否则函数返回false.
●删除所有值为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:
:
~Polynominal(){
Term*p=theList->link;
while(p!
=theList){
theList->link=p->link;
deletep;
p=theList->link;
}
deletetheList;
}
voidPolynominal:
:
AddTerm(istream&in){
Term*p=theList;
intc,e;
while
(1){
cout<<"pleaseinputthecoefandexp:
"<cout<<"coef:
";
cin>>c;
cout<<"exp:
";
cin>>e;
if(e<0)break;
p=p->InsertAfter(c,e);
}
}
voidPolynominal:
:
Output(ostream&out)const{
intfirst=1;
Term*p=theList->link;
cout<<"thepolynominalis:
"<for(;p!
=theList;p=p->link){
if(!
first&&(p->coef>0))out<<"+";//!
first==0表示非第一项
first=0;
out<<*p;//调用重载<<
}
cout<<"\n"<}
voidPolynominal:
:
PolyAdd(Polynominal&r){//把多项式r加到多项式this上
Term*tp,*istLoc=theList,*rp;
rp=r.theList->link;
tp=istLoc->link;
while(rp->coef>0){
if(tp->coef>rp->coef){
istLoc=tp;
tp=tp->link;
continue;
}
if(tp->coef==rp->coef){
tp->coef=tp->coef+rp->coef;
if(tp->coef==0){
istLoc->link=tp->link;
deletetp;
tp=istLoc->link;
}else{
istLoc=tp;
tp=tp->link;
}
}else{
istLoc=istLoc->InsertAfter(rp->coef,rp->exp);
}
rp=rp->link;
}
}
2、在该类上增加成员函数voidPolyMul(Polynominal&r),并重载*运算符.
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、一步步耐心写下这好几百行的代码,觉得比较满足和欣慰。
五、指导教师评语
成绩
批阅人
日期