数据结构实验报告顺序表文档格式.docx
《数据结构实验报告顺序表文档格式.docx》由会员分享,可在线阅读,更多相关《数据结构实验报告顺序表文档格式.docx(28页珍藏版)》请在冰豆网上搜索。
![数据结构实验报告顺序表文档格式.docx](https://file1.bdocx.com/fileroot1/2022-11/30/ed0a5661-aa42-4767-9593-ee452600a8cc/ed0a5661-aa42-4767-9593-ee452600a8cc1.gif)
顺序表是将所有表项按照其逻辑顺序依次存储到从计算机存储中指定存储位置开始的一块连续存储空间中。
并且对于顺序表所有表项,既可以顺序访问,也可以进行随机访问,各个表项的逻辑顺序与其存放的物理顺序一致,故在设计顺序表的结构时选择将数据基于数组存储,并通过数组的基本操作实现顺序表的功能。
(3)基本操作的设计
顺序表中的关键算法就是搜索、插入和删除操作。
搜索算法是通过顺序搜索实现的,在顺序表中搜索与给定值x匹配的表项,找到则返回该表项是第几个元素,否则函数返回0,表示搜索失败。
在搜索算法函数中通过传递用户需要搜索的数据。
插入算法主要是两步,第一步根据用户输入合理表中表项参数,然后在表中找出位置以及其后的元素往后移动一个位置,将插入的数据放在腾出的位置上。
插入算法函数有两个参数分别是位置参数以及插入的元素值。
删除算法则是通过用户输入定位到需要删除数据表项,然后将该数据之后的元素全部往前移动一个位置,将需要删除的数据进行覆盖。
顺序搜索算法流程图:
插入算法流程图:
删除算法流程图:
五、编程环境与实验步骤
(1)编程环境
操作系统:
Windows操作系统;
编程工具软件:
VisualStudio2017
(2)实验步骤
程序相关文件为Student类文件、SeqList模板类文件、以及主函数调试文件main.cpp。
Student类文件为自定义的一个数据类型,包含学生的基本信息,并且通过重载输入输出操作符实现在SeqList模板类中能够成功调试。
SeqList模板类中主要包括一些功能实现的函数。
主函数调试文件则是对于不同数据类型在一个模板类中完成调试,以及顺序表基本功能的实现。
(3)编译参数
无编译参数,在Vs2017或其他版本中新建项目然后将三个文件main.cpp、SeqList.h、Student.h添加到解决方案中的头文件中调试即可。
六、实现代码
Main.cpp中代码:
#include<
iostream>
string>
#include"
SeqList.h"
Student.h"
stringstr="
"
;
template<
classT>
voidmenu(T&
y,stringstr);
intmain(){
boolfin=false;
intch;
//用户选择
while(!
fin){
cout<
<
"
*****请用户选择顺序表数据类型*****"
<
endl;
-------------1.整数型-------------"
-------------2.浮点型-------------"
-------------3.双浮点型-----------"
-------------4.字符型-------------"
-------------5.学生信息型---------"
-------------6.退出---------------"
请输入你的选择[1-6]:
cin>
>
ch;
switch(ch){
case1:
intx1;
str="
int"
menu(x1,str);
break;
case2:
floatx2;
float"
menu(x2,str);
case3:
doublex3;
double"
menu(x3,str);
case4:
{
stringx4;
string"
menu(x4,str);
}
case5:
Studentx5;
student"
menu(x5,str);
case6:
fin=true;
default:
cout<
输入选择错误,请重新输入!
}
system("
pause"
);
return0;
}
y,stringstr){
intlen,maxSize,choose,locate;
SeqList<
T>
s;
Tx;
inti;
intfini=0;
fini){
-----------1:
文件操作建立新顺序表-------------"
-----------2:
在之前所选数据文件中数据进行操作-"
-----------3:
顺序表的最大可容纳表项个数-------"
-----------4:
顺序表的长度---------------------"
-----------5:
搜索x在表中的位置----------------"
-----------6:
定位到第i个表项------------------"
-----------7:
取第i个表项的值------------------"
-----------8:
用x修改第i个表项的值-------------"
-----------9:
在第i个表项后插入元素x-----------"
-----------10:
删除第i个表项-------------------"
-----------11:
判断表是否为空------------------"
-----------12:
判断表满否----------------------"
-----------13:
文件操作保存数据----------------"
-----------14:
退出:
--------------------------"
请输入你的选择[1-14]:
choose;
switch(choose){
s.Inputfile();
s.InputfileAppend();
maxSize=s.Size();
顺序表的最大可容纳表项个数为:
maxSize<
len=s.Length();
顺序表的长度为:
len<
请输入要搜索的值x:
cin>
x;
i=s.Search(x);
if(i==0)
cout<
顺序表中无此值"
else
{
x<
该数据在表中的第"
i<
个位置"
}
请输入要定位的位置i:
i;
locate=s.Locate(i);
if(locate!
=-1)
定位成功!
在顺序表中下标为:
locate<
定位失败!
case7:
请输入要取表中元素的位置i:
if(s.getData(i,x)){
表中第"
个表项的值为:
取值失败!
检查是否超范围取值"
case8:
请输入要修改的位置i和值x:
表中位置:
cin>
修改值:
s.setData(i,x);
case9:
请输入要插入的位置i和值x:
插入值:
if(s.Insert(i,x))
插入成功!
插入失败!
case10:
请输入要删除的表项的位置i:
if(s.Remove(i,x)){
删除成功!
删除的值为:
删除失败!
case11:
if(s.IsEmpty())
表为空!
表不为空!
case12:
if(s.IsFull())
表满!
表未满!
case13:
s.Outputfile();
保存成功!
case14:
fini=1;
return;
SeqList.h代码:
fstream>
constintdefaultSize=100;
usingnamespacestd;
externstringstr;
classSeqList{
protected:
T*data;
//存放数组
intmaxSize;
//最大可容纳表项的项数
intlast;
//当前已存表项的最后位置(从0开始)
voidreSize(intnewSize);
//改变data数组空间大小
public:
SeqList(intsz=defaultSize);
SeqList(SeqList<
&
L);
intSize(){//计算表最大可容纳表项个数
returnmaxSize;
intLength(){//计算表长度
returnlast+1;
intSearch(T&
x);
intLocate(inti);
boolgetData(inti,T&
x){//取出表中第i个表项得值
if(i>
0&
=last+1){
x=data[i-1];
returntrue;
else{
returnfalse;
voidsetData(inti,T&
x){//用x修改表中第i个表项之后
data[i-1]=x;
stringa="
.txt"
fstreamfile(str+a,ios:
:
out);
for(intj=0;
j<
=last;
j++){
file.write((char*)&
data[j],sizeof(data[j]));
file.close();
boolInsert(inti,T&
boolRemove(inti,T&
boolIsEmpty(){//判断表是否为空,空则返回true,非空返回false
return(last==-1)?
true:
false;
boolIsFull(){//判断表是否满,满则返回true,否则返回false
return(last==maxSize-1)?
voidInputfile();
voidOutputfile();
voidInputfileAppend();
operator=(SeqList<
};
/**
*构造函数
*通过指定参数sz定义数组的长度
*/
SeqList<
SeqList(intsz){
if(sz>
0){
maxSize=sz;
last=-1;
//置表的实际长度为空
data=newT[maxSize];
//创建顺序表存储数组
if(data==NULL){//动态分配失败
cerr<
存储分配错误!
exit
(1);
*复制构造函数
*用参数表中给出的已有顺序表初始化新建的顺序表
SeqList(SeqList<
L){
maxSize=L.Size();
last=L.Length()-1;
Tvalue;
data=newT[maxSize];
if(data==NULL){//动态分配失败
cerr<
for(inti=1;
=last+1;
i++){
L.getData(i,value);
data[i-1]=value;
*改变data数组空间大小
*私有函数:
扩充顺序表的存储数组空间大小,新数组的元素个数为newSize
voidSeqList<
reSize(intnewSize){
if(newSize<
=0)//检查参数的合理性
{
无效的数组大小"
return;
if(newSize!
=maxSize){//修改
T*newarray=newT[newSize];
if(newarray==NULL){
intn=last+1;
T*srcptr=data;
//源数组首地址
T*destptr=newarray;
//目的数组首地址
while(n--){
*destptr++=*srcptr++;
//复制
delete[]data;
//删除老数组
data=newarray;
maxSize=newSize;
//复制新数组
*搜索函数:
搜索x在表中位置,返回表项序号
*在表中顺序搜索与给定值x匹配的表项,找到则函数返回该表项是第几个元素,否则函数返回0,表示搜索失败
intSeqList<
Search(T&
x){
for(inti=0;
=last;
i++)
if(data[i]==x)
returni+1;
*定位函数:
定位第i个表项,函数返回表项序号
*函数返回第i(不超过数组范围)个表项的位置,否则函数返回0,表示定位失败。
Locate(inti){
if(i>
=1&
=last+1)
returni-1;
else
return0;
*插入函数:
插入x在第i个表项之后
*将新元素x插入到表中第i个(不超过数组范围)表项之后。
函数返回插入成功的信息,若插入成功则返回true,否则返回false.
boolSeqList<
Insert(inti,T&
if(last==maxSize-1)//表满不能插入操作
returnfalse;
if(i<
0||i>
last+1)//参数i不合理,不能插入
for(intj=last;
j>
=i;
j--){
data[j+1]=data[j];
//依次后移,为x腾出位置
data[i]=x;
//插入
last++;
//表中最后位置加1
stringa="
fstreamfile(str+a,ios:
for(intj=0;
file.write((char*)&
file.close();
returntrue;
//成功插入
*删除函数:
删除第i个表项,通过x返回表项的值
*从表中删除第i(不超过数组范围)个表项,通过引用型参数x返回删除的元素值。
*函数返回删除成功的信息,若删除成功则返回true,否则返回false。
Remove(inti,T&
x){
if(last==-1)//表空不能删除
1||i>
last+1)//参数i不合理
x=data[i-1];
//存在被删除元素
for(intj=i;
data[j-1]=data[j];
//依次往前移动
last--;
//表中最后位置减1
d