线性表—顺序表 数据结构与算法 王道咸鱼 自用笔记

90 阅读2分钟

第二章 线性表-顺序表

55f003adc5cafbf66fdcae67f7ab6aea.png

0646e81eb07c951785a350349c91963a.png

2011ccc170fd50e84c9db1ec791b2da1.png

8dadf2cd7b6f831cb0ee6839de1d762e.png

88a9bdcd91c0307a5de0440ffbab2d2a.png

cfc0ec8eedee97e68eccbb33daf9d4ec.png

1b0e44b85f2d6d7f37157c47c2816e17.png

顺序表SqList

//顺序表SqList
#include <iostream>

#define MaxSize 10	// 定义顺序表的最大容量(静态分配大小)

// 顺序表存储结构 
typedef struct{
	int data[MaxSize];	// 使用静态数组存储数据元素
	int length;	        // 顺序表的当前长度(有效元素个数)
}SqList;	            // 顺序表的类型定义

// 初始化顺序表
void InitList(SqList &L){
	L.length = 0;	// 顺序表初始长度为0(没有有效元素)
	// 注意:静态数组不需要初始化内容,通过length控制访问范围
}

// 在顺序表L的第i个位置插入新元素e 
bool ListInsert(SqList &L, int i, int e){
	// 有效性检查:插入位置i必须在1到length+1之间
	if(i < 1 || i > L.length + 1) // 当i > length+1时插入位置不连续
		return false;
	
	// 检查存储空间:顺序表已满则无法插入
	if(L.length >= MaxSize) 
	    return false;
	
	// 元素后移操作:从最后一个元素开始向后移动
	// 注意:从后向前移动避免覆盖未移动的数据
	for(int j = L.length; j >= i; j--) {
		L.data[j] = L.data[j - 1]; // 将每个元素向后移动一位
	}
	
	L.data[i - 1] = e; // 在位置i处放入新元素e(数组下标从0开始)
	L.length++;	       // 长度加1(增加一个有效元素)
	return true;       // 插入成功
} 

// 删除顺序表L的第i个位置的元素
bool ListDelete(SqList &L, int i, int &e){
	// 有效性检查:删除位置i必须在1到length之间
	if(i < 1 || i > L.length)
		return false;
	
	e = L.data[i - 1]; // 保存被删除的元素值(通过引用参数返回)
	
	// 元素前移操作:从删除位置开始向前覆盖
	// 注意:j从i开始,将后面的元素依次前移
	for(int j = i; j < L.length; j++) {
		L.data[j - 1] = L.data[j]; // 将后续元素向前移动一位
	}
	
	L.length--;   // 长度减1(减少一个有效元素)
	return true;  // 删除成功
} 

// 按位查找:获取第i个位置的元素的值 
int GetElem(SqList L, int i){
	// 注意:这里假设调用者确保1 ≤ i ≤ length
	// 实际应用中应添加边界检查:if(i<1||i>L.length) return -1;
	return L.data[i - 1]; // 直接返回数组元素(位置i对应下标i-1)
} 
 
// 按值查找:获取第一个元素值等于e的元素的位序 
int LocateElem(SqList L, int e){
	// 遍历顺序表查找目标元素
	for(int i = 0; i < L.length; i++) {
		if(L.data[i] == e)
			return i + 1; // 返回位序(位置从1开始计数)
	}
	return 0; // 未找到返回0(表示查找失败)
}