数据结构顺序表.docx
《数据结构顺序表.docx》由会员分享,可在线阅读,更多相关《数据结构顺序表.docx(15页珍藏版)》请在冰豆网上搜索。
数据结构顺序表
实验一顺序表
1.目标要求
实现顺序表的所有功能
2.工具/准备工作
在开始前,应回顾或复习相关内容。
需要一台计算机,其中安装有visualC++。
3.实验分析
要实现顺序表的所有功能,主要步骤是建立一系列功能函数,并在主函数中得以实现
4.测试与结论
//头文件:
#ifndefLIST_H
#defineLIST_H
#include
#include
constintdefaultSize=100;
template
classList
{
protected:
T*data;
intmaxsize;
intlast;
voidresize(intnewsize);
public:
List(intsz=defaultSize);//构造函数
List(List&L);//复制构造函数
~List(){delete[]data;}//析构函数
intSize()const{returnmaxsize;}//计算表最大可容纳个数
intLength()const{returnlast+1;}//计算表长度
intSearch(T&x)const;//搜索x在表中位置,函数返回表项序号
intLocate(inti)const;//定位第i个表项,函数返回表项序号
boolgetData(inti,T&x)const//取第i个表项的值
{
if(i>0&&i<=last+1)
{
x=data[i-1];
returntrue;
}
elsereturnfalse;
}
voidsetData(inti,T&Xx)//用x修改第i个表项的值
{
if(i>0&&i<=last+1)
{
data[i-1]=x;
}
}
boolInsert(inti,T&x);//插入x在第i个表项之后
boolRemove(inti,T&x);//删除第i个表项,通过x返回表项的值
boolIsEmpty()//判断空否,空则返回true;否则返回false
{
return(last==-1)?
true:
false;
}
boolIsFull()//判断满否
{
return(last==maxsize-1)?
true:
false;
}
voidinput();//输入
voidoutput();//输出
Listoperator=(List&L);//表整体赋值
};
#endif
template
List:
:
List(intsz)//构造函数
{
if(sz>0)
{
last=-1;
maxsize=sz;
data=newT[maxsize];
if(data==NULL)
{
cerr<<"存储分配错误!
"<exit
(1);
}
}
}
template
List:
:
List(List&L)//复制构造函数
{
maxsize=L.Size();
last=L.Length()-1;
Tvalue;
data=newT[maxsize];//创建顺序表存储数组
if(data==NULL)
{
cerr<<"存储分配错误!
"<exit
(1);
}
for(inti=1;i<=last+1;i++)
{
L.getData(i,value);
data[i-1]=value;
}
}
template
voidList:
:
resize(intnewsize)//扩大数组空间
{
if(newsize<=0)
{
cerr<<"无效的数组大小"<}
if(newsize!
=maxsize)
{
T*newarray=newT[newsize];
if(newarray==NULL)
{
cerr<<"存储分配错误!
"<exit
(1);
}
intn=last+1;
T*srcptr=data;//源数组首地址
T*destptr=newarray;//目的数组首地址
while(n--)
{
*destptr--=*srcptr--;
}
delete[]data;
data=newarray;
maxsize=newsize;
}
}
template
intList:
:
Search(T&x)const//搜索x在表中位置,函数返回表项序号
{
for(inti=0;i<=last;i++)
{
if(data[i]==x)
returni+1;//成功搜索
}
return0;//失败搜索
};
template
intList:
:
Locate(inti)const//定位第i个表项,函数返回表项序号
{
if(i>=1&&ireturni;
elsereturn0;
};
template
boolList:
:
Insert(inti,T&x)//插入x在第i个表项之后
{
if(last==maxsize-1)returnfalse;//表满,不能输入
if(i<0||i>last+1)returnfalse;//参数i不合理,不能插入
for(intj=last;j>=i;j--)
{
data[j+1]=data[j];
}
data[i]=x;
last++;
returntrue;
};
template
boolList:
:
Remove(inti,T&x)//删除第i个表项,通过x返回表项的值
{
if(last==-1)returnfalse;//表空,不能删除
if(i<1||i>last+1)returnfalse;//参数i不合理,不能删除
x=data[i-1];
for(intj=i;j<=last;j++)
{
data[j-1]=data[j];
}
last--;
returntrue;
};
template
voidList:
:
input()//输入
{
cout<<"开始建立顺序表,请输入表中元素个数:
";
while
(1)
{
cin>>last;
last=last-1;
if(last<=maxsize-1)break;
cout<<"表元素个数输入错误,范围不能超过"<";
}
for(inti=0;i<=last;i++)
{
cout<<"请输入第"<
cin>>data[i];
}
};
template
voidList:
:
output()//输出
{
cout<<"顺序表当前元素最后位置为:
"<for(inti=0;i<=last;i++)
{
cout<<"#"<
"<}
};
//主函数
#include
#include"List.h"
usingnamespacestd;
intmain()
{
ListL1;
intx,i;
cout<<"***********实现输入功能************"<L1.input();
cout<<"L1输出数据为:
"<L1.output();
cout<<"***************************************"<cout<<"***********实现复制构造函数功能************"<cout<<"L1输出数据为:
"<L1.output();
ListL2(L1);
cout<<"L2通过复制构造函数输出数据为:
"<L2.output();
cout<<"***************************************"<cout<<"***********实现搜索函数功能************"<cout<<"L1数据为:
"<L1.output();
cout<<"请输入要找的数据:
"<cin>>x;
cout<<"搜索函数输出数据为:
"<cout<<"***************************************"<cout<<"***********实现函数定位功能************"<cout<<"L1数据为:
"<L1.output();
cout<<"请输入要找第几个数据:
"<cin>>i;
cout<<"定位函数输出数据为:
"<cout<<"***************************************"<cout<<"***********实现函数插入功能************"<cout<<"L1数据为:
"<L1.output();
cout<<"请输入要插入到第几个位置:
"<cin>>i;
cout<<"请输入要插入的元素:
"<cin>>x;
cout<<"插入函数输出数据为:
"<L1.output();
cout<<"***************************************"<cout<<"***********实现函数删除功能************"<cout<<"L1数据为:
"<L1.output();
cout<<"请输入要删除第几个元素:
"<cin>>i;
L1.Remove(i,x);
cout<<"删除数据为:
"<cout<<"函数删除后输出数据为:
"<L1.output();
cout<<"***************************************"<return0;
}
结果: