一、概念
1、线性表
具有相同特性的数据元素的有限序列。
- 相同特性:所有元素属于同一数据类型。
- 有限:数据元素个数是有限的。
- 序列:数据元素由逻辑序号唯一确定。
2、顺序表
按逻辑顺序将线性表内容依次存储到一片连续的存储空间中。
二、顺序表的基本操作
1、定义顺序表
#define ElemType char
const int MaxSize = 20;
struct SqList
{
ElemType data[MaxSize];
int length;
};
2、建立、初始化顺序表
//建立顺序表
void CreateList(SqList *&L,ElemType a[],int n)
{
L = new SqList;
for (int i = 0;i < n;++i)
L->data[i] = a[i];
L->length=n;
}
//初始化顺序表
void InitList(SqList *&L)
{
L = new SqList;
L->length=0;
}
3、销毁顺序表、判断是否为空、获取长度、遍历
//销毁顺序表
void DestroyList(SqList *&L)
{
delete L;
L = nullptr;
}
//判断是否为空
bool ListEmpty(SqList *L)
{
return L->length == 0;
}
//获取长度
int ListLength(SqList *L)
{
return L->length;
}
//遍历
void DispList(SqList *L)
{
for (int i = 0;i < L->length;++i)
printf("%c",L->data[i]);
}
4、获取索引处的值、获取元素在顺序表中的位置
//获取索引处的值
bool GetElem(SqList *L,int index,ElemType &e)
{
if (index < 1 || index > L->length)
return false;
e = L->data[index];
return true;
}
//获取元素在顺序表中的位置
int LocateElem(SqList *L,ElemType e)
{
int i = 0;
while (i < L->length && L->data[i] != e)
++i;
return i >= L->length ? -1 : i;
}
5、在索引处插入值
//在索引处插入值
bool ListInsert(SqList *&L,int index,ElemType e)
{
if (index < 1 || index > L->length+1)
return false;
for (int j = L->length;j > index;--j) //将data[i..n]元素后移一个位置
L->data[j] = L->data[j-1];
L->data[index] = e; //插入元素e
L->length++;
return true;
}
6、删除索引处的值
//删除索引处的值
bool ListDelete(SqList *&L,int index,ElemType &e)
{
if (index < 1 || index>L->length)
return false;
e = L->data[index];
for (int j = index;j < (L->length - 1);++j) //将data[i..n-1]元素前移
L->data[j] = L->data[j+1];
L->length--;
return true;
}
三、顺序表算法示例
1、例1
void delnode1(SqList *&A, ElemType x)
{
int k = 0; //k记录值不等于x的元素个数
for (int i = 0;i < A->length;i++)
if (A->data[i] != x) //若当前元素不为x,将其插入A中
{
A->data[k] = A->data[i];
k++; //不等于x的元素增1
}
A->length = k; //顺序表A的长度等于k
}
void delnode2(SqList *&A, ElemType x)
{
int k = 0,i = 0; //k记录值等于x的元素个数
while (i < A->length)
{
if (A->data[i] == x) //当前元素值为x时k增1
k++;
else //当前元素不为x时将其前移k个位置
A->data[i-k] = A->data[i];
i++;
}
A->length -= k; //顺序表A的长度递减k
}
2、例2
void move2(SqList *&L)
{
int i = 0,j = L->length-1;
ElemType pivot = L->data[0]; //以data[0]为基准
while (i < j)
{
while (j > i && L->data[j] > pivot)
j--; //从右向左扫描,找≤pivot的data[j]
L->data[i] = L->data[j]; //将其放入data[i]处
while (i<j && L->data[i] <= pivot)
i++; //从左向右扫描,找>pivot的记录data[i]
L->data[j] = L->data[i]; //将其放入data[j]处
}
L->data[i] = pivot; //放置基准
}