顺序表笔记

一、学习顺序表的核心目的

学习数据结构的核心诉求是解决程序运行的效率问题与算法实现的基础支撑问题,而顺序表作为线性表的基础实现形式,是理解这两个核心的关键起点:

  1. 效率优化:原生数组在处理大规模数据时,插入 / 删除元素需移动大量数据、无法灵活统计有效数据个数,顺序表通过封装数组并规范操作逻辑,可针对性优化这些场景的时间 / 空间效率;
  2. 算法基础:栈、队列等常用数据结构的底层可基于顺序表实现,掌握顺序表是后续学习复杂算法(如排序、查找)的必要前提。

二、顺序表的核心概念

1. 定义

顺序表本质是对原生数组的封装,通过结构体整合 "存储数据的数组" 和 "记录有效数据个数的变量",并封装增、删、查、改等操作,让数组的使用更规范、高效。

2. 分类

根据存储空间的灵活性,顺序表分为两类:

类型 特点
静态顺序表 数组长度通过宏定义(如#define N 10)固定,存储空间编译时确定,无法动态扩容
动态顺序表 用数组指针指向存储空间,新增 "容量变量" 记录空间大小,可按需扩容,空间利用率更高

三、顺序表的核心实现(C 语言)

1. 基础结构定义

(1)静态顺序表
复制代码
#include <stdio.h>
#include <stdlib.h>

// 宏定义数组长度(静态顺序表固定长度)
#define MAX_SIZE 10

// 定义静态顺序表结构体
typedef struct {
    int data[MAX_SIZE];  // 存储数据的数组
    int size;            // 有效数据个数
} StaticSeqList;
(2)动态顺序表
复制代码
// 定义动态顺序表结构体
typedef struct {
    int* data;   // 指向存储数据的数组
    int size;    // 有效数据个数
    int capacity;// 数组总容量(存储空间大小)
} DynamicSeqList;

2. 核心操作实现

(1)初始化

初始化的核心是将 "有效数据个数置 0",动态顺序表需额外初始化存储空间:

复制代码
// 静态顺序表初始化
void InitStaticSeqList(StaticSeqList* list) {
    if (list == NULL) return;
    list->size = 0;  // 有效数据个数初始化为0
}

// 动态顺序表初始化(初始容量设为8)
int InitDynamicSeqList(DynamicSeqList* list) {
    if (list == NULL) return -1;
    list->capacity = 8;
    list->data = (int*)malloc(sizeof(int) * list->capacity);
    if (list->data == NULL) return -1;  // 内存分配失败
    list->size = 0;
    return 0;
}
(2)增加元素(尾部插入 + 指定位置插入)

增加元素的核心逻辑:先检查存储空间是否已满→验证位置合法性→插入元素→更新有效数据个数。

复制代码
// 静态顺序表尾部插入
int StaticPushBack(StaticSeqList* list, int value) {
    // 检查顺序表是否已满
    if (list == NULL || list->size >= MAX_SIZE) return -1;
    list->data[list->size] = value;  // 插入到尾部
    list->size++;                    // 有效个数+1
    return 0;
}

// 静态顺序表指定位置插入(pos从0开始)
int StaticInsert(StaticSeqList* list, int pos, int value) {
    // 检查合法性:指针非空、位置合法、顺序表未满
    if (list == NULL || pos < 0 || pos > list->size || list->size >= MAX_SIZE) return -1;
    // 从后往前移动元素,为插入位置腾出空间
    for (int i = list->size; i > pos; i--) {
        list->data[i] = list->data[i-1];
    }
    list->data[pos] = value;  // 插入元素
    list->size++;            // 有效个数+1
    return 0;
}
(3)删除元素

删除的核心逻辑:验证位置合法性→移动元素覆盖待删除值→更新有效数据个数。

复制代码
// 静态顺序表删除指定位置元素
int StaticDelete(StaticSeqList* list, int pos) {
    if (list == NULL || pos < 0 || pos >= list->size) return -1;
    // 从删除位置往后,元素依次前移
    for (int i = pos; i < list->size - 1; i++) {
        list->data[i] = list->data[i+1];
    }
    list->size--;  // 有效个数-1
    return 0;
}
(4)查找与修改
复制代码
// 查找元素:返回第一个匹配值的下标,未找到返回-1
int StaticFind(StaticSeqList* list, int value) {
    if (list == NULL) return -1;
    for (int i = 0; i < list->size; i++) {
        if (list->data[i] == value) {
            return i;
        }
    }
    return -1;
}

// 修改指定位置元素值
int StaticModify(StaticSeqList* list, int pos, int newValue) {
    if (list == NULL || pos < 0 || pos >= list->size) return -1;
    list->data[pos] = newValue;
    return 0;
}
(5)测试示例
复制代码
int main() {
    // 静态顺序表测试
    StaticSeqList list;
    InitStaticSeqList(&list);  // 初始化
    
    // 尾部插入元素
    StaticPushBack(&list, 10);
    StaticPushBack(&list, 20);
    // 指定位置插入(下标1插入15)
    StaticInsert(&list, 1, 15);
    
    // 查找元素20的位置
    int findPos = StaticFind(&list, 20);
    printf("元素20的下标:%d\n", findPos);  // 输出:2
    
    // 修改下标1的元素为18
    StaticModify(&list, 1, 18);
    
    // 删除下标2的元素
    StaticDelete(&list, 2);
    
    // 遍历输出所有元素
    printf("顺序表元素:");
    for (int i = 0; i < list->size; i++) {
        printf("%d ", list.data[i]);  // 输出:10 18
    }
    
    return 0;
}
相关推荐
老鼠只爱大米5 小时前
LeetCode经典算法面试题 #46:全排列(回溯、交换、剪枝等五种实现方案详细解析)
算法·leetcode·剪枝·回溯·全排列·stj算法
Dovis(誓平步青云)6 小时前
《滑动窗口算法:从 “暴力遍历” 到 “线性高效” 的思维跃迁》
运维·服务器·数据库·算法
_OP_CHEN6 小时前
【算法基础篇】(五十七)线性代数之矩阵乘法从入门到实战:手撕模板 + 真题详解
线性代数·算法·矩阵·蓝桥杯·c/c++·矩阵乘法·acm/icpc
天天爱吃肉82186 小时前
【跨界封神|周杰伦×王传福(陶晶莹主持):音乐创作与新能源NVH测试,底层逻辑竟完全同源!(新人必看入行指南)】
python·嵌入式硬件·算法·汽车
im_AMBER6 小时前
Leetcode 114 链表中的下一个更大节点 | 删除排序链表中的重复元素 II
算法·leetcode
xhbaitxl6 小时前
算法学习day38-动态规划
学习·算法·动态规划
多恩Stone6 小时前
【3D AICG 系列-6】OmniPart 训练流程梳理
人工智能·pytorch·算法·3d·aigc
历程里程碑6 小时前
普通数组----轮转数组
java·数据结构·c++·算法·spring·leetcode·eclipse
pp起床6 小时前
贪心算法 | part02
算法·leetcode·贪心算法
sin_hielo6 小时前
leetcode 1653
数据结构·算法·leetcode