线性表与顺序表概述
在深入具体实现前,先明确线性表的概念。线性表是由 n 个具有相同特性的数据元素组成的有限序列。生活中常见的线性表包括顺序表、链表、栈、队列和字符串等。从逻辑上看,线性表是连续的;但在物理存储上,它不一定连续,通常以数组或链表结构进行存储。
顺序表的概念
顺序表使用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组进行存储。简单来说,顺序表的底层就是数组。
既然底层是数组,为什么还要封装成顺序表?直接用数组不行吗?这是因为顺序表对数组进行了封装,实现了增删查改等常用功能,使得数据操作更加高效和规范。
顺序表的分类
顺序表主要分为两类:静态顺序表和动态顺序表。
静态顺序表
静态顺序表的长度相对固定,使用定长数组存储元素。其结构体定义如下:
typedef int Elemtype;
#define N 10
typedef struct Sqlist {
Elemtype arr[N]; // 定长数组
int length; // 当前有效数据个数
} Sqlist;
静态顺序表开发维护成本低,但存在致命缺陷:预分配的空间 N 若过小则不够用,过大则浪费内存,无法灵活满足'按需分配'的需求。因此,实际开发中更常使用动态顺序表。
动态顺序表
动态顺序表支持内存的动态伸缩,能够根据需求调整容量。其基本结构如下:
typedef int Elemtype;
typedef struct Sqlist {
Elemtype* data; // 指向动态分配的数组首地址
int length; // 当前有效元素个数
int size; // 当前顺序表的总容量
} Sqlist;
顺序表的实现
在开始编码之前,准备好必要的头文件:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h> // 用于 malloc、realloc
#include <assert.h> // 用于断言检查
Elemtype;


