线性表是具有相同特性的数据元素的一个有限序列
同一线性表中的元素必定具有相同特性,数据元素间的关系是线性关系
线性表顺序存储:把逻辑上相邻的数据元素存储在物理上相邻的存储单元中的存储结构
线性表顺序存储结构占用一片连续的存储空间
特点:地址连续、依次存放、随机存取、类型相同
缺点:1)插入,删除操作需要移动大量的元素,浪费存储空间
2)属于静态存储形式,数据元素个数不能自由扩充
线性表的定义和初始化
//线性表的定义
#define MAXSIZE 100 //定义线性表长100
typedef int ElemType;
typedef struct Sqlist {
ElemType * base; //顺序线性表的表头
int length; //顺序线性表的长度
} Sqlist;
//线性表的初始化
bool InitList(Sqlist& L)
{
L.base = new ElemType[MAXSIZE]; //在堆区开辟内存 使用new定义
if (!L.base) { //没有表头,说明线性表不存在
cout << "error" << endl;
return false;
}
L.length = 0; //线性表初始长度为0
return true;
}
//判断线性表是否为空
bool IsEmpty(Sqlist& L)
{
if (L.length == 0)
return true;
else return false;
}
获取线性表元素
//获取线性表元素
bool GetElem(const Sqlist& L, const size_t i, ElemType& e)
//要获取的元素的位置为i,不是下标位置!!
{
if (i<1 || i>MAXSIZE) //元素非法位置判断
{
cout << "out of range" << endl;
return false;
}
e = L.base[i - 1]; //获取位置为i的元素,因为数组下标是从0开始的,所以要减去1
return true;
}
查找线性表元素
//查找线性表元素 (算法时间复杂度为O(n))
void LocateList(const Sqlist& L, const ElemType& e)
{
for (int i = 0; i < L.length; i++) //遍历数组当中的所有元素
{
if (L.base[i] == e) //查找成功,返回其查找元素在数组当中的位置,也就是下标值加1
{
cout << "查找的元素在第" << i + 1 << "个位置" << endl;
return;
}
}
cout << "查找的元素不在此线性表中" << endl;// 查找元素不在循序表中
}
线性表的清空和销毁
//线性表的清空及销毁
void ClearList(Sqlist& L)
{
L.length = 0; //线性表清空即把线性表长度置为0
}
void DestroyList(Sqlist& L)
{
if (L.base)
delete L.base;
//线性表销毁意味着表中元素连表头都没有了,所以此操作就是删除表中所有元素直至表头元素
}
线性表中元素的插入
//线性表中元素的插入(算法时间复杂度为O(n))
bool InsertList(Sqlist& L, const ElemType& e, const int& i)
//在线性表L第i个位置(i表示元素位置)插入元素e
{
if (L.length == MAXSIZE)
{
cout << "线性表已满,无法插入元素" << endl;
return false;
}
if (i<1 || i>L.length+1) //非法元素插入位置判断
{
cout << "wrong insert position" << endl;
return false;
}
if (L.length > 0) //线性表不为空的初始条件
{
//令p为数组中最后一个元素位置,将位于插入位置i之后的元素依次向后移动一个位置
for (int p = L.length-1; p >= i-1; --p)
{
L.base[p + 1] = L.base[p];
}
}
L.base[i-1] = e; //在下标为i的位置插入元素e
L.length += 1; //线性表的长度加1
return true;
}
线性表元素的删除
//线性表中元素的删除(算法时间复杂度为O(n))
bool DeleteList(Sqlist& L, const int &i)
//删除线性表第i个位置(i表示元素位置)的元素,如果想要储存该元素的话可引入e
{
if (L.length == 0) {
cout << "线性表为空,无法删除元素" << endl;
return false;
}
if (i<0 || i>L.length) { //非法元素删除位置判断
cout << "wrong delete position" << endl;
return false;
}
if (L.length > 0) {
//令p为数组中要删除的元素的后一个位置,将位于删除位置i之后的元素依次向前移动一个位置
for (int p = i; p < L.length; ++p) {
L.base[p - 1] = L.base[p];
}
}
L.length -= 1; //线性表的长度减1
return true;
}
线性表中元素的输入以及输出
//线性表的输入
void CreateList(Sqlist& L)
{
cout << "输入线性表中的元素:(以-1作为结束标志)" << endl;
int i = 0; //线性表数组元素的下标
cin >> L.base[i];
while (L.base[i]!=-1 ) //线性表结束输入的标志
{
L.length++;
i++;
cin >> L.base[i];
}
}
//线性表的输出
void PrintSqList(Sqlist &L)
{
int i;
for (i = 0; i < L.length; i++) {
cout << L.base[i] << ' ';
}
}
主函数
void main()
{
Sqlist L; //定义线性表L
InitList(L); //初始化线性表L
CreateList(L); //线性表的输入
cout << "线性表为:" << endl;
PrintSqList(L); //线性表的输出
cout << endl << "此时线性表中的元素个数为:" << L.length;
cout <<endl<< "---------------------------------------";
//while(!IsEmpty(L)){
int a1,x1 = 0;
cout <<endl<< "要获取第几个元素" << endl;
cin >> x1;
GetElem(L, x1,a1);
cout << "获取第"<<x1<<"个元素为:" <<a1<<endl;
int a;
cout << "请输入要查找的元素:" << endl;
cin >> a;
LocateList(L, a);
int x2, b;
cout << "要插入的位置 ";
cin >> x2;
cout<< "要插入的元素 ";
cin >> b;
InsertList(L, b, x2);
cout << "线性表为:" << endl;
PrintSqList(L); //线性表的输出
int x3;
cout <<endl<< "要删除第几个元素?";
cin >> x3;
DeleteList(L, x3);
cout << "线性表为:" << endl;
PrintSqList(L); //线性表的输出
//}
system("pause");
return ;
}
测试
ps:本人菜鸟一枚,如有错误欢迎批评指正~