跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI 生图工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
C算法

数据结构基础:顺序表详解与动态实现

顺序表是线性表的顺序存储结构,底层基于连续数组。静态与动态顺序表的区别,重点演示了动态顺序表的 C 语言实现,涵盖初始化、尾插、头插及自动增容逻辑。通过三文件协同开发模式,展示了如何管理内存与数据结构,分析了不同操作的效率特点,为后续深入学习链表与算法打下基础。

baireiraku发布于 2026/3/16更新于 2026/10/1985 浏览
数据结构基础:顺序表详解与动态实现

数据结构基础:顺序表详解与动态实现

线性表是 n 个具有相同特性的数据元素的有限序列,逻辑上呈线性结构。常见的线性表包括顺序表、链表、栈、队列等。在物理存储上,线性表通常采用顺序结构或链式结构。

一、什么是顺序表?

定义: 顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,底层通常基于数组实现。

注意: 顺序表不等于数组。数组只是底层存储介质,顺序表是对数组的封装,提供了增删查改等接口。

文章配图

二、顺序表的分类

1. 静态顺序表

使用定长数组存储元素。缺点是空间固定,可能不够用或造成浪费。

文章配图

2. 动态顺序表

空间按需申请,灵活性更高。

文章配图

三、动态顺序表的实现

为了模块化开发,我们通常将头文件、源文件和测试文件分开。

SeqList.h

#pragma once
#include <stdio.h>
#include <stdlib.h>

// 定义数据类型,方便后续修改
typedef int SLTDataType;

// 定义顺序表结构
typedef struct SeqList {
    SLTDataType* arr;  // 存储数据的指针
    int size;          // 有效数据个数
    int capacity;      // 当前容量
} SL;

// 初始化函数声明
void SLInit(SL* ps);

SeqList.c

#define _CRT_SECURE_NO_WARNINGS
#include "SeqList.h"

// 初始化顺序表
void SLInit(SL* ps) {
    if (ps == NULL) return;
    ps->arr = NULL;
    ps->size = 0;
    ps->capacity = 0;
}

// 打印顺序表
void SLPrint(SL* ps) {
    if (ps == NULL || ps->arr == NULL) {
        printf("Empty List\n");
        return;
    }
    for (int i = 0; i < ps->size; i++) {
        printf("%d ", ps->arr[i]);
    }
    printf("\n");
}

// 检查容量并增容
void SLCheckCapacity(SL* ps) {
    if (ps->size == ps->capacity) {
        int newCapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;
        SLTDataType* tmp = (SLTDataType*)realloc(ps->arr, newCapacity * sizeof(SLTDataType));
        if (tmp == NULL) {
            perror("realloc fail!");
            exit(1);
        }
        ps->arr = tmp;
        ps->capacity = newCapacity;
    }
}

// 尾插
void SLPushBack(SL* ps, SLTDataType x) {
    assert(ps);
    SLCheckCapacity(ps);
    ps->arr[ps->size++] = x;
}

// 头插
void SLPushFront(SL* ps, SLTDataType x) {
    assert(ps);
    SLCheckCapacity(ps);
    // 整体向后移动
    for (int i = ps->size; i > 0; i--) {
        ps->arr[i] = ps->arr[i - 1];
    }
    ps->arr[0] = x;
    ps->size++;
}

test.c(测试文件)

#define _CRT_SECURE_NO_WARNINGS
#include "SeqList.h"

void test_basic() {
    SL s1;
    SLInit(&s1);
    SLPushBack(&s1, 1);
    SLPushBack(&s1, 2);
    SLPushBack(&s1, 3);
    SLPrint(&s1);
}

void test_head_insert() {
    SL s2;
    SLInit(&s2);
    SLPushFront(&s2, 1);
    SLPushFront(&s2, 2);
    SLPushFront(&s2, 3);
    SLPrint(&s2);
}

int main() {
    test_basic();
    test_head_insert();
    return 0;
}

调试建议: 编写代码时,养成断点调试的习惯。运行到函数内部时,观察变量 size 和 capacity 的变化,能帮助你更好地理解内存分配过程。

四、关键操作解析

1. 尾插与增容

当 size 等于 capacity 时,需要扩容。通常采用 2 倍扩容策略。虽然会有一定空间浪费,但能显著减少 realloc 调用次数,摊还时间复杂度更优。

文章配图

2. 头插与移位

头插需要在头部腾出位置,因此需要将现有数据整体后移。这会导致 O(N) 的时间复杂度,但在顺序表中这是不可避免的代价。

文章配图

五、总结

顺序表通过连续的物理空间实现了高效的随机访问,插入和删除操作则涉及数据移动。理解其底层机制(如增容策略、传址调用)对于掌握数据结构至关重要。在实际开发中,根据数据量是否变化选择静态或动态顺序表,能有效平衡性能与资源。

目录

  1. 数据结构基础:顺序表详解与动态实现
  2. 一、什么是顺序表?
  3. 二、顺序表的分类
  4. 1. 静态顺序表
  5. 2. 动态顺序表
  6. 三、动态顺序表的实现
  7. SeqList.h
  8. SeqList.c
  9. test.c(测试文件)
  10. 四、关键操作解析
  11. 1. 尾插与增容
  12. 2. 头插与移位
  13. 五、总结

更多推荐文章

查看全部
  • 基于 Spring Boot 的 Web 三大核心交互案例详解
  • llama.cpp 多 GPU 分布式计算优化实践指南
  • 2026我为什么开始用 Megick:一个更轻量、更顺手的 AI 创作工作台
  • ASR 自动语音识别原理与 Whisper 模型解析
  • C++ 模板初阶:从函数重载到泛型编程的优雅过渡
  • Java 岗位面试经验:JVM、分布式、消息队列与协议
  • Docker 国内镜像源:如何选择与设置
  • Agent 设计模式全解析:原理、架构与代码示例
  • Java 面试基础:封装、继承与多态详解
  • 2026 年 3 月 GESP C++ 一级真题:数字替换
  • 二叉树遍历:由后序与中序推导层序结果(多语言实现)
  • Java JDK 23 详细安装配置指南
  • 基于 Java 与高德地图的县域烟花销售点 GIS 盘点实践
  • FastAPI:Python 高性能 Web 框架
  • DeepSeek-R1-Distill-Llama-8B 数学与逻辑推理能力展示
  • 软体机器人动作捕捉系统:6 大主流方案深度测评与选型指南
  • 5 款免费 AI 视频生成工具推荐
  • AI 产品经理必修:神经网络核心原理与应用解析
  • C++11 左值与右值引用区别及移动语义解决传值返回销毁问题
  • FPGA 内部资源详解:LUT、FF、BRAM、DSP、PLL 及综合报告解读

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online