数据结构——顺序表

文章目录

  • 一、顺序存储
  • 二、定义
  • 三、基本操作
      • 1、初始化
      • 2、销毁顺序线性表
      • 3、将顺序表重置为空表
      • 4、判断顺序表是否为空表
      • 5、求顺序表的长度
      • 6、根据位置i获取相应位置数据元素的内容
      • 7、顺序查找法
      • 8、顺序表的插入
      • 9、顺序表的删除
    • 插入、删除算法的时间复杂度分析

这是根据B站青岛大学王卓老师的数据结构课程总结的复习笔记

一、顺序存储

将“具有 ‘一对一’ 逻辑关系的数据按照次序连续存储到一整块物理空间上”的存储结构就是顺序存储结构。顺序表存储数据时,会提前申请一整块足够大小的物理空间,然后将数据依次存储起来,存储时做到数据元素之间不留一丝缝隙。顺序表使用数组存储数据。数据结构——顺序表_第1张图片线性表中第i个元素的储存单元:
Locate(ai) = Locate(a0) + sizeof(DataType) * i

二、定义

线性表的顺序存储结构:把线性表中的所有元素按照其逻辑顺序依次存储到从计算机存储器中指定存储位置开始的一块连续的存储空间中。逻辑位序和物理位序相差1

typedef struct {
	ElemType elem[MAXSIZE];
	//ElemType *elem;动态定义
	int length;
}SqList;

三、基本操作

1、初始化

顺序表的初始化即创建一个空的顺序表,把长度置0。需要实现的操作为:
(1)申请足够大小的物理空间
(2)给length 赋初值


Status InitList_Sq(SqList& L) {
	L.elem = new ElemType[MAXSIZE];
	if (!L.elem) exit(OVERFLOW);
	L.length = 0;
	return OK;
}

2、销毁顺序线性表

释放空间,长度和存储容量置零

void DestroyList(SqList& L) {//只有对实参进行了修改时才使用&
	if (L.elem)
		delete L.elem;
}

3、将顺序表重置为空表

int GetLength(SqList& L) {
	return  L.length;
}

4、判断顺序表是否为空表

bool IsEmpty(SqList L) {
	if (L.length == 0)
		return true;
	else return false;
}

5、求顺序表的长度

int LengthSeq(SqList L){
    if (L == NULL){
        return 0;
    }
    return L.length;
}

6、根据位置i获取相应位置数据元素的内容

int GetElem(SqList L, int i, ElemType e) {
	if (i < 1 || i > L.length)
		return ERROR;
	e = L.elem[i - 1];
	return OK;
}

7、顺序查找法

/**************************

平均查找长度ASL(期望值)=累加和(每个被查找的概率,即1/n *每个出现的次数)
                         =(1+n)/2

***************************/
int LocateElem(SqList L, ElemType e) {
	for (int i = 0; i < L.length; i++)
		if (L.elem[i] == e) return i + 1;
	return 0;
}

8、顺序表的插入

/**************************

平均移动次数=(0+1+2+...+n)/(n+1)
            =n/2

***************************/
Status ListInsert_Sq(SqList& L, int i, ElemType e) {
	if (i < 1 || i > L.length + 1) return ERROR;//i是逻辑位置而表示物理下标
	if (L.length == MAXSIZE) return ERROR;
	for (int j = L.length - 1; j >= i - 1; j--) //j是物理下标
		L.elem[j+1] = L.elem[j];
	L.elem[i - 1] = e;
	L.length++;
	return OK;
}

9、顺序表的删除

/**************************

平均移动次数==(n-1)/2
平均时间复杂度O(n)

***************************/
Status ListDelect(SqList& L, int i) {
	if (i < 1 || i > L.length) return ERROR;//逻辑位置进行判断
	for (int j = i; j <= L.length - 1; j++) //物理下标进行移动
		L.elem[j - 1] = L.elem[j];
	L.length--;
	return OK;	
}

插入、删除算法的时间复杂度分析

数据结构——顺序表_第2张图片

你可能感兴趣的:(数据结构)