【数据结构与算法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的地址

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

Screenshot_20221002_090957

顺序表

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

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

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

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

静态分配

Screenshot_20221002_085142

动态分配

Screenshot_20221002_085228

动态申请和释放内存空间

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;
}

顺序表的插入删除查找

插入

Screenshot_20221002_085333
//插入
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;
}

查找

Screenshot_20221002_085422

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

落叶随峰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值