线性表是一种最简单、最常用的数据结构,根据存储方式可以分为顺序表和链表。
顺序表: 顺序表指的是用一组地址连续的存储单元依次存储线性表的数据元素,称为线性表的顺序存储结构或顺序映像(sequential mapping)。它以“物理位置相邻”来表示线性表中数据元素间的逻辑关系,可随机存取表中任一元素。
链表:链表指的是用一组任意的存储单元存储线性表中的数据元素,称为线性表的链式存储结构。它的存储单元可以是连续的,也可以是不连续的。在表示数据元素之间的逻辑关系时,除了存储其本身的信息之外,还需存储一个指示其直接后继的信息(即直接后继的存储位置),这两部分信息组成数据元素的存储映像,称为结点(node)。
接下来就是具体实现了(C++)
这里是 SeqList 这个类的成员变量
//数据集合
T *Data;
//当前顺序表中元素数量
int Length;
//顺序表容量
int Size;
首先是构造函数
template<class T>
SeqList<T>::SeqList(T *Data, int Length, int Size)
{
this->Data = Data;
this->Size = Size;
this->Length = Length;
this->Data = new T[Size+1];
for(int i=0;i<Length;i++)
this->Data[i+1] = Data[i];
}
接下来是几个主要的成员方法
插入函数
向指定位置插入一个元素,由于顺序表是顺序存储的,所以需要考虑所给位置是否超过当前顺序表长度,插在末尾即为(length+1),所以未知参数在[1,Length+1]范围内才能进行插入操作。这时,由于顺序表是以数组作为存储结构,还要考虑在插入一个元素之后会不会发生数组越界,即(Length+1<Size)时,才能进行插入,否则要进行扩容,这里每次长度不够时长度增加10,即创建一个新的数组,容量为(Size+10)。
template<class T>
void SeqList<T>::ele_insert(int loca,T data)
{
if(loca>Length+1 || loca<1)
throw "out of size";
if(Length+1>=Size)
{
T* p = Data;
Data = new T[Size+10];
for(int i=1;i<=Length;i++)
Data[i] = p[i];
delete []p;
p = nullptr;
Size+=10;
}
for(int i=Length+1;i>loca;i--)
Data[i] = Data[i-1];
Data[loca] = data;
Length++;
}
删除函数
删除指定位置的元素。思路就是依次前移将指定位置的元素覆盖掉,直接上代码。
template<class T>
void SeqList<T>::ele_delete(int loca)
{
if(loca<1 || loca>Length)
throw"out of size";
for(int i=loca;i<Length;i++)
Data[i] = Data[i+1];
Length--;
}
查询函数
查询顺序表中是否存在某个元素,存在则返回第一次出现位置的下标(下标从1开始),否则返回-1,简单的遍历。
template<class T>
int SeqList<T>::ele_locate(T data)
{
for(int i=1;i<=Length;i++)
{
if(Data[i] == data)
return i;
}
return -1;
}
这里所列出的只是几个常用功能的实现,具体可以根据自己的需求进行扩充,放个源码链接
SeqList.h
SeqList.cpp