顺序表基本运算的实现
基本运算—初始化线性表InitList(L)
① 需求
- 构造一个空的线性表L
② 方法
- 分配空间,并将length成员设置为0
③ 算法
void InitList(SqList *&L) //指针的引用
{
L=(SqList *)malloc(sizeof(SqList));
L->length=0;
}
SqList的结构体
#define MaxSize 50
typedef struct
{
ElemType data[MaxSize];
int length;
} SqList;
④ 时间复杂度
- O(1);
基本运算-销毁线性表DestroyList(L)
①需求
- 释放线性表L占用的内存空间
② 方法
- 调用free函数
③ 算法
void DestroyList(SqList *&L)
{
free(L);
}
④时间复杂度
- O(1)
基本运算-判定是否为空表ListEmpty(L)
① 需求
- 该运算返回一个值表示L是否为空表。若
L为空表,则返回true,否则返回false
② 算法
bool ListEmpty(SqList *L)
{
return(L->length==0);
}
③ 时间复杂度
- O(1)
基本运算-求线性表的长度ListLength(L)
① 需求
- 返回顺序表L的长度
② 方法
- 即返回length成员的值
③ 算法
int ListLength(SqList *L)
{
return(L->length);
}
基本运算-输出线性表DispList(L)
①需求:
- 顺序输出顺序表中的所有元素的值
②方法
- 该运算当线性表L不为空时,顺序显示L中各元素的值
③ 算法
void DispList(SqList *L)
{
int i;
if (ListEmpty(L))
return;
for (i=0; i<L->length; i++)
printf("%d ",L->data[i]);
printf("\n");
}
④ 时间复杂度
- O(L->length)或O(n)
基本运算-求某个数据元素值GetElem(L,i,e)
① 需求
- 返回L中第 i(1≤i≤ListLength(L))个元素的值,存放在e中
② 算法
bool GetElem(SqList *L, int i, ElemType &e)
{
if (i<1 || i>L->length)
return false;
e=L->data[i-1];
return true;
}
③ 时间复杂度
- O(1)
基本运算-按元素值查找LocateElem(L,e)
① 需求
- 查找第1个值域与e相等的元素的逻辑位序。若这样的元素不存在,则返回值为0
② 算法
int LocateElem(SqList *L, ElemType e)
{
int i=0;
while (i<L->length && L->data[i]!=e)
i++;
if (i>=L->length)
return 0;
else
return i+1;
}
③ 时间复杂度
- O(L->length)或O(n)
基本运算-插入数据元素ListInsert(L,i,e)
① 需求
- 在顺序表L的第i(1≤i≤ListLength(L)+1)
个位置上插入新的元素e。
② 方法
- 将顺序表原来第i个元素及以后元素均后移一
个位置 - 腾出一个空位置插入新元素
- 最后顺序表长度增1
③ 算法
bool ListInsert(SqList *&L, int i, ElemType e)
{
int j;
if (i<1 || i>L->length+1)
return false;
i--; //将逻辑序号转化为物理序号
for (j=L->length; j>i; j--) //元素后移
L->data[j]=L->data[j-1];
L->data[i]=e; //腾开的位置插入元素e
L->length++; //顺序表长度增1
return true; //成功插入返回true
}
④ 时间复杂度
- 最佳情况:移动0次
- 最差情况:移动n次
- 初步结论:移动次数与插入位置相关
- 关注:平均情况复杂度
基本运算-删除数据元素ListDelete(L,i,e)
①需求:
- 删除顺序表L的第 i 个元素
②方法:
- 将线性表第i个元素以后的元素均向前移动一个位置,覆盖了用来的第i个元素,达到删除该元素(i)的目的
- 最后顺序表长度减1
③算法:
bool ListDelete(SqList *&L,int i, Elemtype &e)
{
int j;
// 判断要删除元素的逻辑位置(最小逻辑位置下标是1)
if(i<i || i>L->length)
return false;
i--; // 存储上的物理位置(最小物理位置下标是0)
e = L->data[i]; // 把要删除的值赋值给 e
// 存储上的物理位置从要删除元素后一位开始往前覆盖
for(j=i; j<L->length-1; j++)
L->data[j]=L->data[j+1];
// 循环结束后,顺序表长度减1
L->length--;
return true;
}
④ 平均情况时间复杂度