顺序表基本运算的实现(第二章:线性表)

顺序表基本运算的实现

基本运算—初始化线性表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;
}

④ 平均情况时间复杂度
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_44630560/article/details/107592668