【数据结构与算法02】 顺序表

文章目录

    • 线性表
      • 定义
      • 线性表的基本操作(创销、增删改查)
    • 顺序表
      • 静态分配
      • 动态分配
      • 顺序表的特点
      • 初始化顺序表
    • 顺序表的插入删除查找
      • 插入
      • 删除
      • 查找

线性表

定义

具有相同的数据类型的几个数据元素有限序列,其中n为表长,当n=0时线性表是空表,如下:

线性表的基本操作(创销、增删改查)

  1. InitList(&L):初始化表,构造空的线性表L,分配内存空间
  2. DestroyList(&L):销毁操作,销毁线性表,并释放空间
  3. ListInsert(&L,i,e):插入
  4. ListDelete(&L,i,e):删除
  5. LocateElem(L,e):按值查找
  6. GetElem(L,e):按位查找

&L:取L的地址

什么时候传入引用&? --对参数的修改结果需要"带回来"

【数据结构与算法02】 顺序表_第1张图片

顺序表

逻辑上相邻,物理(地址)上也相邻

顺序存储:逻辑上相邻的元素存在地址相邻的区域内,每个元素占的空间都相等

Q:如何判断一个数据元素的大小

A:sizeof(x),x是数据类型,注意sizeof是C语言32个关键字之一

静态分配

【数据结构与算法02】 顺序表_第2张图片

动态分配

【数据结构与算法02】 顺序表_第3张图片

动态申请和释放内存空间

malloc:开辟一片存储空间,返回一个空的指针

L.data=(ElemType *)malloc(sizeof(ElemType) *Initsize)

ElemType *:强制转型你定义的元素指针

例如:data的数据类型为int,则ElemType也应转为int类型

顺序表的特点

  1. 随机访问
  2. 存储密度高
  3. 扩展容量难

初始化顺序表

typedef struct {
	int *data;//指示动态分配数组的指针
	int MaxSize;//顺序表的最大容量
	int lenght;//顺序表的当前长度
} SeqList;

void InitList(SeqList &L) {
	//使用malloc申请一片连续的存储空间:sizeof(int)=4Byte
	L.data = (int *)malloc(InitSize * sizeof(int));
	L.lenght = 0;
	L.MaxSize = InitSize;
}

顺序表的插入删除查找

插入

【数据结构与算法02】 顺序表_第4张图片
//插入
bool ListInsert(SeqList &L, int i, int e) {
	if (i < 1 || i > L.lenght + 1) {
		return false;
	}
	if (L.lenght > InitSize) {
		return false;
	}
	for (int j = L.lenght; j >= i; j--) {
		L.data[j] = L.data[j - 1];
	}
	L.data[i - 1] = e;
	L.lenght++;
	return true;
}
  1. 传入L,注意这里的L使用了&,所以是传入L的本身,而不是它的复制品

  2. 使用了一个for循环,让第i-1个元素之后的所有元素,都向后移动一位,同时也能逆向找到插入次序i

    for (int j = L.lenght; j >= i; j--) {L.data[j] = L.data[j - 1];}

  3. 插入元素值,L.data[i - 1] = e;

删除

//删除
bool ListDelete(SeqList &L, int i, int &e) {
	printf("%d\n", i);
	if (i < 1 || i > L.lenght) {
		printf("%d", L.lenght);
		return false;
	}
	e = L.data[i - 1];
	for (int j = i; j < L.lenght; j++) {
		L.data[j - 1] = L.data[j];
	}
	L.lenght--;
	return true;
}

查找

【数据结构与算法02】 顺序表_第5张图片

你可能感兴趣的:(数据结构与算法,数据结构,c语言,算法,原力计划,低代码)