这学期在学习数据结构,就开始写y一些关于数据结构的相关知识吧
今天说的是顺序表
首先,顺序表,顾名思义是顺序的表,这里的顺序指的是存储的数据在物理结构上是连续的,也就是数据存储时在实际的内存上是连续存储的。因为顺序表在物理空间上是连续的一片内存,故此在读取数据时时候可以达到随机存取的特点(随机存取指的是可以快速查找而不是随机插入和删除,本人刚学的时候总是弄混),所以当存储需要快速查找的数据时,可以考虑使用顺序表。
然后,开始创建简单的顺序表,并实现一些基本的数据操作。由于顺序表的物理结构是连续的,故此在创建顺序表时,不可置否的想到了数组,用一个大小固定的数组来创建顺序表(这里就是顺序表的一个缺点:创建顺序表的同时需要规定其大小,这就导致如果小了出现表满的情况,而表大了,就容易导致存储空间的浪费)。
其次,顺序表的基本操作有如下
1:创建顺序表并初始化
由上文已经可以知道,顺序表是用一个数组来创建表的容量,但是我们还需要知道表中的元素个数以及是否表满,所以在创建声明一个数组的同时,我们还需要定义一个整型数据,始终指向表中的最后一个元素来确定表长,是否表满等信息。当刚刚创建表时由于表中没有元素,所以我们将整型变量声明为-1。故此,在顺序表的创建和初始化中,我们需要做的就是,定义一个数组a[max],以及一个始终指向表中最后一个元素的变量last,并将last赋值为-1。
2:顺序表的插入和删除
创建了表后,我们相应的需要做的就是对表进行基本的插入以及删除,在插入算法中,由于顺序表的物理结构,所以当我们想在表中插入一个元素时,我们需要将插入位置后的所有元素的存储位置都向后移一位。同理,删除操作时,我们需要将删除位置后的所有元素都向前移一位。
3:顺序表的按值查找
顺序表的按值查找有很多种查找,如二分查找,等等,这里仅仅说最简单的顺序查找。所谓顺序查找就是从顺序表的第一个元素开始遍历整个顺序表直到找到查找的值。
#include<iostream>
using namespace std;
template<typename DataType,int Maxsize>
class SeqList{
private:
DataType data[Maxsize];
int last;
public:
SeqList();
~SeqList();
int Insert_SeqList(int i,DataType d);
int Delete_SeqList(int i);
int Location_SeqList(DataType d);
};
void *SeqList<DataType,Maxsize>::SeqList()/*通过修改最后元素位置的LAST的值初始化顺序表,也就是对类模版中的构造函数SeqList() 的实例化。
由于创建的是顺序表L为指针参数,所以在实例化的同时,在*/
{
last=-1;
}
int SeqList<DataType,Maxsize>::Insert_SeqList(int i,DataType d)
{
if(last==Maxsize-1)//判断顺序表是否有剩余空间
return 0;
if(i<1||i>last+2)//判断所插入位置是否正确
return 0;
for(int j=last;j<=i-1;j--)//将第I个元素换成第i个元素所在数组的下表,从最后新增的数组空间开始替换,所以J为变量控制循环
data[j+1]=data[j];
data[i-1]=d;
last++;//更改顺序表最后元素位置的数组下标
return 1;
}
int SeqList<DataType,Maxsize>::Delete_SeqList(int i)
{
if(i<1||i>last+1)
return 0;
for(int j=last;i-1<=j;i++)
data[i]=data[i-1];
last--;
return 1;
}
int SeqList<DataType,Maxsize>::Location_SeqList(DataType d)
{
int j=1;
for(int i=0;i<=last;i++)
{
if(data[i]==x)
{
j=0;
return i+1;
}
if(j)
return -1;
}
int main()
{
SeqList <int,10> L;
int choose,juicp=0,loc;
cin>>choose;
if(choose>3||choose||<1)
cout<<"error";
else
switch(choose)
case '1':
{
juicp=L.Insert_SeqList();
if(juicp)
cout<<"OK";
break;
}
case '2':{
juicp=L.Insert_SeqList();
if(juicp)
cout<<"OK";
break;
}
case '3'{
loc=L.Location_Seqlist();
if(loca=-1)
cout<<"error";
else
cout<<loc;
break;
}
return 0;
}
(PS:顺序表很简单,但顺序表是最基本的数据结构之一。虽然单一使用顺序表的情况很少,但很多情况下都是通过结构体来定义顺序表的数据元素,将顺序表与接下来会说的链表结合,形成各种全新的较为复杂的数据结构。)