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

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

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

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

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

线性表是 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. 五、总结
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • MCP 开发实战:npx 与 uvx 跨平台安装及对比
  • Vue 框架核心语法与响应式原理详解
  • Spring AI Agent Skills 接入实战与原理剖析
  • STL 文件预览工具 stl-thumb 使用指南
  • 前端代码可读性优化实践
  • 微信小程序 AR 开发实战方案与性能优化
  • 从零搭建 AI 运维系统:MCP AI Copilot 架构与部署
  • C++ 哈希表模拟实现:闭散列与冲突处理
  • OpenClaw 本地部署指南:从零搭建可控 AI Agent 框架
  • AI 机器人安全私信访问机制:Secure DM Pairing 实现原理
  • Docker 镜像源配置与验证指南
  • 使用 Rufus 制作启动盘安装 Windows 与 Ubuntu 系统全流程教程
  • OpenClaw Secure DM Pairing: 为 AI 机器人构建安全私信访问机制
  • Diffusion Transformer (DiT):从图像生成到机器人动作预测的架构演进
  • 用两个栈模拟队列:LIFO 到 FIFO 的转换实现与原理分析
  • 8 大 AI 平台速度与 Token 消耗性能测试
  • 职业低谷期的自我提升:Python 全栈学习路线与技能进阶
  • 在嵌入式中实现 O(1) 的字符串 Switch-Case (编译期哈希)
  • PostgreSQL 模式 (SCHEMA) 详解:数据库对象命名空间管理
  • VS Code 集成 MiniMax M2.1 实现 AI 辅助编程

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如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