数据结构C++版Word文档下载推荐.docx
- 文档编号:17207527
- 上传时间:2022-11-28
- 格式:DOCX
- 页数:26
- 大小:527.20KB
数据结构C++版Word文档下载推荐.docx
《数据结构C++版Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《数据结构C++版Word文档下载推荐.docx(26页珍藏版)》请在冰豆网上搜索。
实验9 查找42
9.1实验基础知识42
9.2验证实验42
9.3设计实验:
顺序查找和折半查找的性能比较51
实验10 排序52
10.1实验基础知识52
10.2验证实验52
10.3设计实验56
附录一:
VC++6.0和VC++.net上机环境介绍57
附录二:
撰写实验报告的一般格式64
实验1 线性表的顺序存储
1.1实验基础知识
线性表的顺序表表示,其特点是用物理位置上的邻接关系来表示结点间的逻辑关系,这一特点使得顺序表有以下的优缺点。
其优点是:
(1)无需为表示结点间的逻辑关系而增加额外的存储空间。
(2)可以方便地随机存取表中任一结点。
其缺点是:
(1)插入或删除运算不方便,除表尾的位置外,在表的其他位置上进行插入或删除操作都必须移动大量的结点,其效率较低。
(2)由于顺序表要求占用连续的存储空间,存储分配只能预先进行(静态分配)。
因此,当表长变化较大时,难以确定合适的存储规模。
若按可能达到的最大长度预先分配表空间,则可能造成一部分空间长期闲置而得不到充分利用;
若事先对表长估计不足,则插入操作可能使表长超过预先分配的空间而造成溢出。
1.2验证实验
1.2.1实验目的
(1)掌握线性表的顺序存储结构;
(2)验证顺序表及其基本操作的实现;
(3)掌握数据结构及算法的程序实现的基本方法。
1.2.2实验内容
(1)建立含有若干个元素的顺序表;
(2)对已建立的顺序表实现插入、删除、查找等基本操作。
1.2.3实现提示
首先定义顺序表的数据类型——顺序表类SeqList,包括题目要求的插入、删除、查找等基本操作。
template<
classType>
classSeqList
{
public:
SeqList(intMaxSize=defaultSize);
~SeqList(){delete[]data;
}
intLength()const{returnlast+1;
intFind(Type&
x)const;
intInsert(Type&
x,inti);
intRemove(Type&
x);
TypeGet(inti){returni<
0||i>
last?
NULL:
data[i];
private:
Type*data;
intMaxSize;
intlast;
};
其次,建立含有n个数据元素的顺序表,即设计构造函数。
算法如下:
最后,对建立的顺序表设计插入、删除、查找等基本操作的算法。
(1)插入算法
顺序表插入算法Insert
intSeqList<
Type>
:
Insert(Type&
x,inti)
{if(i<
last+1||last==MaxSize-1)
return0;
else
{last++;
for(intj=last;
j>
i;
j--)
data[j]=data[j-1];
data[i]=x;
return1;
}
(2)查找算法
(3)删除算法
1.2.4实验程序
见配套光盘
1.3设计实验
1.3.1问题描述
对于一个给定的整型数组循环左移i位。
1.3.2基本要求
(1)在原数组中实现循环左移,不另外申请空间;
(2)时间性能尽可能好;
(3)分析算法的时间复杂度。
1.3.3设计思想
将这个问题看作是把数组ab转换成数组ba(a代表数组的前i个元素,b代表数组中余下的n-i个元素),先将a逆置得到arb,再将b逆置得到abr,最后将整个arbr逆置得到
(arbr)r=ba。
请设计算法并上机实现。
实验2 线性表的链式存储
2.1实验基础知识
为了克服顺序表的缺点,可以采用链接方式存储线性表。
值得指出的是,链接存储是最常用的存储方法之一,它不仅可用来表示线性表,而且可以用来表示各种非线性的数据结构。
链表是一种动态存储的数据结构,在创建链表时利用动态存储分配函数申请存储空间。
链表的每个结点包含数据域和指针域。
指针域用来指向该结点的下一个结点。
每个链表有一个头指针,存放链表的首地址。
链表的最后一个结点其指针域的值为NULL,表示链表结束。
链表可以进行建立、输出、结点的插入与删除等基本操作。
在顺序表中,用一组地址连续的存储单元来依次存放线性表的结点,因此结点的逻辑次序和物理次序一致。
而链表则不然,链表是用一组任意的存储单元来存放线性表的结点,这组存储单元既可以是连续的,也可以是不连续的,甚至是零散分布在内存中的任何位置上。
因此,链表中结点的逻辑次序和物理次序不一定相同。
2.2验证实验
2.2.1实验目的
(1)掌握线性表的链式存储结构;
(2)验证单链表及其基本操作的实现;
(3)进一步掌握数据结构及算法的程序实现的基本方法。
2.2.2实验内容
(1)用头插法(或尾插法)建立带头结点的单链表;
(2)对已建立的单链表实现插入、删除、查找等基本操作。
2.2.3实现提示
首先,将单链表中的结点类定义如下:
template<
classList;
classListNode{//thenodeclassdefinition
friendclassList<
;
//setlistclassasfriend
public:
ListNode();
ListNode(constType&
item);
//getanodewithdataitem
ListNode<
*NextNode(){returnlink;
}//getnextnodeofthis
voidInsertAfter(ListNode<
*p);
//insertanodehere
*RemoveAfter();
//removeanode
voiddisply(){cout<
<
data;
}//displaythedataofthisnode
private:
Typedata;
//thedatafield
*link;
//thepointerofnextnode
其次,定义单链表的数据类型——单链表类List,包括题目要求的插入、删除、查找等基本操作,为便于查看操作结果,设计一个显示单链表元素的函数。
template<
classList{//listclassdefinition
List(){last=first=newListNode<
last->
link=NULL;
}//emptiedinitilizedlist
~List();
voidMakeEmpty();
//emptyalist
intLength()const;
//getthelistlength
*GetNode(constType&
item,ListNode<
*next);
ListNode<
*Find(inti);
//findanodebynumber
*Findv(Typevalue);
//findanodebyvalue
intInsert(Typevalue,inti);
//insertanodeofdata'
value'
atlocation'
i'
voidAppend(Typevalue);
//addanodeattheend
TypeRemove(inti);
//removetheinode,returnit'
svalue
Type*Get(inti);
//getthevalueoftheinode
*First(){returnfirst;
}//gettheheadoflist
voidconjoin(List<
&
ha,List<
hb);
//conjointwolisttoone
voiddisply();
//displaythedataofalist
*first,*last;
下面对建立的链表设计插入、删除、查找等基本操作的算法。
newnode=GetNode(value,p->
link);
if(p->
link==NULL)last=newnode;
p->
link=newnode;
(2)删除算法
(3)查找算法
2.2.4实验程序
2.3设计实验
2.3.1问题描述
用有序单链表表示集合,实现集合的交、并和差运算。
2.3.2基本要求
(1)对集合中的元素,用有序单链表进行存储;
(2)实现交、并、差运算时,不另外申请存储空间;
(3)充分利用单链表的有序性,算法有较好的时间性能。
2.3.3设计思想
首先,建立两个带头结点的有序单链表表示集合A和B。
其次,根据集合的运算规则,利用单链表的有序性,设计交、并和差运算。
(1)根据集合的运算规则,集合AB中包含所有既属于集合A又属于集合B的元素。
因此,须查找单链表A和B的相同元素并保留在单链表A中。
(2)根据集合的运算规则,集合AB中包含所有或属于集合A或属于集合B的元素。
因此,对单链表B中的每个元素x,在单链表A中进行查找,若存在和x不相同的元素,则将该结点插入到单链表A中。
(3)根据集合的运算规则,集合AB中包含所有属于集合A而不属于集合B的元素。
因此,对单链表B中的每个元素x,在单链表A中进行查找,若存在和x相同的元素,则将该结点从单链表A中删除。
实验3 特殊线性表—栈、队列和串
3.1实验基础知识
3.1.1顺序栈和链栈的特点及基本操作
栈是限定仅在表尾进行插入或删除操作的线性表。
表尾端称为栈顶,表头端称为栈底。
不含元素的空表称为空栈。
假设栈S=(al,a2,…,an),则称al为栈底元素,an为栈顶元素。
栈中元素按al,a2,…,an的次序进栈,退栈的第一个元素应为栈顶元素。
换句话说,栈的修改是按后进先出的原则进行的。
因此,栈又称为后进先出的线性表。
利用一组地址连续地存储单元依次存放自栈底到栈顶的数据元素,同时附设指针top指示栈顶元素的位置,这种栈称为顺序栈。
栈的链式存储结构称为链栈。
链栈的栈顶在链表的表头,新结点的插入和删除都在链表的表头进行。
3.1.2队列的特点及基本操作
队列是一种先进先出的线性表,它只允许在表的一端进行插入,而在另一端删除元素。
最早进入队列的元素最早离开。
在队列中,允许插入的一端称为队尾,允许删除的一端则称为队头。
假设队列为Q=(al,a2,…,an),那么,al就是队头元素,an则是队尾元素。
队列中的元素是按照al,a2,…,an的顺序进入的,退出队列也只能按照这个次序依次退出,也就是说,只有在al,a2,…,an-1都离开队列之后,an才能退出队列。
用链表表示的队列称为链队列,一个链队列需要两个分别指示队头和队尾的指针才能惟一确定。
为了操作方便,给链队列添加一个头结点,并令队头指针指向头结点。
因此,空的链队列的判决条件为队头指针和队尾指针均指向头结点。
链队列的操作即为单链表的插入和删除操作的特殊情况,只是尚需修改队尾指针或队头指针。
在队列的顺序存储结构中,除了用一组地址连续的存储单元依次存放从队头到队尾的元素之外,还需附设两个指针front和rear分别指示队头元素和队尾元素的位置。
初始化建空队列时,令front=rear=0,每当插入新的队列尾元素时,尾指针增1;
每当删除队列头元素时,头指针增1。
因此,在非空队列中,头指针始终指向队头元素,而尾指针始终指向队尾元素的下一个位置。
3.1.3串的基本概念及其含义
串中任意个连续的字符组成的子序列称为该串的子串。
包含子串的串相应地称为主串。
通常称字符在序列中的序号为该字符在串中的位置。
子串在主串中的位置则以子串的第一个字符在主串中的位置来表示。
当且仅当这两个串的值相等。
也就是说,只有当两个串的长度相等,并且各个对应位置的字符都相等时才相等。
3.2验证实验
3.2.1栈操作验证
3.2.1.1实验目的
(1)掌握栈的顺序存储结构;
(2)掌握栈的操作特性;
(3)掌握基于顺序栈的基本操作的实现方法。
3.2.1.2实验内容
(1)建立一个空栈;
(2)对已建立的栈进行插入、删除、取栈顶元素等基本操作。
3.2.1.3实现提示
首先,定义顺序栈的数据类型——顺序栈类Seqstack。
classStack
Stack(int=20);
~Stack(){delete[]elements;
voidPush(constType&
item);
TypePop();
TypeGetTop();
voidMakeEmpty(){top=-1;
intIsEmpty()const{returntop==-1;
intIsFull()const{returntop==maxSize-1;
inttop;
Type*elements;
intmaxSize;
其次,设计构造函数。
最后,对建立的顺序栈设计入栈、出栈、取栈顶元素等基本操作的算法。
(1)入栈算法
(2)出栈算法
(3)取栈顶元素算法
取栈顶元素算法GetTop
TypeStack<
GetTop()
assert(!
IsEmpty());
returnelements[top];
3.2.1.4实验程序
3.2.2队列操作验证
3.2.2.1实验目的
(1)掌握循环队列的存储结构;
(2)掌握循环队列的操作特性;
(3)掌握基于循环队列的基本操作的实现方法。
3.2.2.2实验内容
(1)建立一个空队列;
(2)对已建立的队列进行出队、入队、取队头元素等基本操作。
3.2.2.3实现提示
首先,定义循环队列的数据类型——Queue。
classQueue
Queue(int=10);
~Queue(){delete[]elements;
voidEnQueue(constType&
TypeDeQueue();
TypeGetFront();
voidMakeEmpty(){front=rear=0;
intIsEmpty()const{returnfront==rear;
intIsFull()const{return(rear+1)%maxSize==front;
intLength()const{return(rear-front+maxSize)%maxSize;
intrear,front;
最后,对建立的循环队列设计入队、出队、取队头元素等基本操作的算法。
(1)入队算法
(2)出队算法
出队算法DeQueue
TypeQueue<
DeQueue()
//assert(!
if(!
IsEmpty())
{
front=(front+1)%maxSize;
returnelements[front];
cout<
"
队空"
endl;
(3)取队头元素算法
3.2.2.4实验程序
3.2.3串操作验证
3.2.3.1实验目的
(1)掌握串的顺序存储结构;
(2)掌握串的操作特点。
3.2.3.2实验内容
(1)创建两个串,并采用顺序存储;
(2)求子串在主串中的位置及字符比较次数。
3.2.3.3实现提示
首先定义串的数据类型——String。
classString
String();
~String()
delete[]ch;
voidAppend(char&
intFind(String&
pat,int&
k)const;
intcurLen;
char*ch;
然后定义串的模式匹配算法。
3.2.3.4实验程序
3.3设计实验
3.3.1问题描述
一列货运列车共有n节车厢,每节车厢将停放在不同的车站。
假定n个车站的编号分别为1~n,即货运列车按照第n站至第1站的次序经过这些车站。
为了便于从列车上卸掉相应的车厢,车厢的编号应与车站的编号相同,这样,在每个车站只要卸掉最后一节车厢。
所以,给定任意次序的车厢,必须重新排列它们。
车厢的重排工作可以通过转轨站完成。
在转轨站中有一个入轨、一个出轨和k个缓冲轨,缓冲轨位于入轨和出轨之间。
假定缓冲轨按先进先出的方式运作,设计算法解决火车车厢重排问题。
3.3.2基本要求
(1)设计存储结构表示n个车厢、k个缓冲轨以及入轨和出轨;
(2)设计并实现车厢重排算法;
(3)分析算法的时间性能。
3.3.3设计思想
假设有3个缓冲轨,入轨中有9节车厢,次序为5,8,l,7,4,2,9,6,3,重排后,9节厢出轨次序为9,8,7,6,5,4,3,2,1。
重排过程如下:
3号车厢不能直接移至出轨(因为l号车厢和2号车厢必须排在3号车厢之前),因此,把3号车厢移至H1。
6号车厢可放在H1中3号车厢之后(因为6号车厢将在3号车厢之后出轨)。
9号车厢可以继续放在H1中6号车厢之后,而接下来的2号车厢不能放在9号车厢之后(因为2号车厢必须在9号车厢之前出轨)。
因此,应把2号车厢移至H2。
4号车厢可以放在H2中2号车厢之后,7号车厢可以继续放在4号车厢之后,如图3-1(a)所示。
至此,1号车厢可通过H3直接移至出轨,然后从H2移动2号车厢至出轨,从H1移动3号车厢至出轨,从H2移动4号车厢至出轨,如图3-1(b)所示。
由于5号车厢此时仍在入轨中,所以把8号车厢移动至H2,这样就可以把5号车厢直接从入轨移至出轨。
如图3-1(c)所示。
此后,可依次从缓冲轨中移出6号、7号、8号和9号车厢。
图3-1火车车厢重排过程
由上述重排过程可知:
在把车厢c移至缓冲轨时,车厢c应移动到这样的缓冲轨中:
该缓冲轨中队尾车厢的编号小于c;
如果有多个缓冲轨满足这一条件,则选择队尾车厢编号最大的缓冲轨;
否则选择一个空的缓冲轨。
【思考题】如果缓冲轨按后进先出的方式工作,即用栈表示缓冲轨,应如何解决火车车厢重排问题?
VC++6.0和VC++.net上机环境介绍
(1)在VC6.0环境下新建C++源程序并编译运行
启动VC++后,出现VC++的集成开发环境,如下图1:
图1VC++集成开发环境
在集成环境中,选择“文件”“新建”菜单,如下图2:
图2选择“新建”菜单
先建立一个空白工程。
在出现的面板中选择“工程”项,并选中”Win32ConsoleApplication“,然后输入工程的名字和目录,按下“确定”按钮。
如下图3:
图3新建Win32ConsoleApplication工程
然后选择”Anemptyproject”,如下图4:
图4选择新建空白工程
新建工程结束,如下图5:
图5新建工程完毕
在集成环境中,选择“文件”“新建”菜单,如图6所示,选择“文件”项,并选中”C++Sourcefile“,然后输入文件的名字和目录,按下“确定”按钮,向工程中添加新文件,并进入文件编辑状态,如下图7:
图6新建C++源文件,添加到工程中
图7编辑C++文件
在图8中,源程序编辑完毕后,可以选择“编译”菜单进行编译
若存在错误,可按F4找到错误处,修改后重新编译,直到没有错误为止。
图8编译C++程序
编译通过后,可选择“编译”“执行”菜单,运行程序。
如图9和图10。
图9选择运行程序
图10运行程序窗口
如果此程序不止一个C++文件,可新建文件添加到工程中。
如图11:
图11添加新文件到工程中
如果想把已经存在的文件添
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 C+