南邮数据结构实验一.docx
- 文档编号:26737298
- 上传时间:2023-06-22
- 格式:DOCX
- 页数:14
- 大小:575.23KB
南邮数据结构实验一.docx
《南邮数据结构实验一.docx》由会员分享,可在线阅读,更多相关《南邮数据结构实验一.docx(14页珍藏版)》请在冰豆网上搜索。
南邮数据结构实验一
实验报告
(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;i elements[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、一步步耐心写下这好几百行的代码,觉得比较满足和欣慰。 五、指导教师评语 成绩 批阅人 日期
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 实验