【数据结构初阶】--顺序表(一)

【数据结构初阶】--顺序表(一)
🔥个人主页:@草莓熊Lotso

🎬作者简介:C++研发方向学习者

📖个人专栏: 《C语言》 《数据结构与算法》

⭐️人生格言:生活是默默的坚持,毅力是永久的享受。

前言:在上篇博客中我们学习了算法复杂度 ,明确了如何计算时间复杂度,能对写出来的代码进行一个评估,那么我们这篇博客将会给大家分享数据结构中顺序表的相关知识点。


目录

一.初识顺序表

1.1--线性表

1.2--顺序表的概念与结构

二.顺序表的分类

2.1--静态顺序表

2.2--动态顺序表 

三.动态顺序表的实现 --初始化

 seqlist.h:

 seqlist.c:

 test.c:

静态顺序表部分代码实现演示:(只包含.c文件和.h文件,测试文件这里就不写了)


一.初识顺序表

--在正式学习顺序表之前,我们先明确一下线性表这个概念

1.1--线性表

线性表(linear list)是n个具有相同特性的数据元素的有限序列,线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表,链表,栈,队列,字符串……

线性表在逻辑上是线性结构,也就是说连续的一条直线。但是在物理结构上并不一定是连续的。线性表在物理上存储时,通常以数组和链式结构的形式存储。

1.2--顺序表的概念与结构

--概念:顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况采用数组存储。

  • 逻辑结构:线性   
  • 物理结构:线性
顺序表和数组的区别:顺序表的底层结构是数组,对数组的封装,实现了常用的增删查改等结构 

 我们来举个例子对比一下数组和顺序表:(苍蝇馆子和米其林餐厅的对比)


二.顺序表的分类

2.1--静态顺序表

--使用定长数组存储元素

静态顺序表缺陷:空间给少了不够用,给少了造成空间浪费

//静态顺序表
typedef int SLDataType;
#define N6
typedef struct Seqlist {
    SLDataType a[N];//定长数组
    int size;//有效数据个数
}SL;

 

2.2--动态顺序表 

--使用动态开辟的数组存储

//动态顺序表--按需申请

typedef struct Seqlist {
    SLDataType a[N];//定长数组
    int size;//有效数据个数

    intcapacity;//空间容量
}SL;

三.动态顺序表的实现 --初始化

--我们这里就分三个文件来实现一下动态顺序表,静态顺序表就不在这里演示了,但是博主会把静态顺序表的部分实现代码放在最后,大家可以自己看看。

 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); 
重要提示:

 


这里分别对int类型和顺序表进行了重名命,给int重命名是为了方便后续的修改,比如我想把一些用了SLTDataType的变量从int类型修改成char,只用在重命名这个地方修改就可以了。

然后是顺序表的重命名,这里将顺序表重命名为SL,后续使用起来更加方便,看起来也会更加清晰。重名命这一块知识点之前在结构体的博客中博主有更详细的讲述过,大家感兴趣的话可以点击下面的链接去看一看,结构体相关的知识点对于我们后续数据结构的学习来说还是蛮重要的。

【自定义类型-结构体】--结构体类型,结构体变量的创建和初始化,结构体内存对齐,结构体传参,结构体实现位段

 seqlist.c:

#define _CRT_SECURE_NO_WARNINGS #include"seqlist.h" void SLInit(SL* ps) { ps->arr = NULL; ps->size = 0; ps->capacity = 0; } 
重点提示: 

在这里先看看初始化就好了,至于尾插,头插等接口的实现会在后续的文章中讲解。这里的初始化很简单,也没有啥需要特别注意的。大家应该都可以看懂,就不展开来详细讲述了,补充一下这里对arr初始化的话大家可以直接malloc申请一块空间,但是我个人还是更喜欢这样写的,这样写之后该如何使用在下篇博客中会讲到的。

 test.c:

#define _CRT_SECURE_NO_WARNINGS #include"seqlist.h" void test1() { SL s1; SLInit(&s1); } int main() { test1(); return 0; }
重点提示:

我们这里传参数,一定要采用传址调用的形式,否则会出现一些错误(在这里会报未初始化的局部变量s1这个错误),因为传值调用修改形参并不影响实参,它们的地址终究还是不同的,而传址调用,形参的修改会影响实参,这里也可以参考之前我们在--指针超详解2中举的swap函数的例子,在那篇博客中我们对传址调用和传值调用讲述的更加详细。

【C语言指针超详解(二)】--const修饰指针变量,野指针的辩析,assert断言,指针的使用和传址调用



注意:除了部分情况外(数组名),有取地址操作符才叫做变量传地址。

我们编写代码最好勤测试,避免写出大量代码后再测试而导致出现问题,无法定位问题。大家可以想想,如果不经常性进行测试的话,等到后续程序写完后发现有问题,很难入手去解决,就算找到了错误,修改起来的工作量也还是蛮大的哈。而我们写一个板块进测试一下的话,可以及时找出问题并进行修正,所有测试这个习惯是一定需要具备的。

静态顺序表部分代码实现演示:(只包含.c文件和.h文件,测试文件这里就不写了)

1.SeqList.h

#pragma once #include<stdio.h> #include<string.h> #include <stdlib.h> #include <assert.h> // 增强程序可维护性 #define MAX_SIZE 10000 typedef int SQDataType; // 静态顺序表 // 问题:给少了不够用,给多了用不完浪费,不能灵活控制 typedef struct SeqList { SQDataType a[MAX_SIZE]; int size; }SL; //typedef struct SeqList SL; // 增删查改等接口函数 void SeqListInit(SL* ps); // 头插 尾插 头删 尾删 void SeqListPushBack(SL* ps, SQDataType x); void SeqListPushFront(SL* ps, SQDataType x); void SeqListPopBack(SL* ps); void SeqListPopFront(SL* ps); 

2.SeqList.c

#include "SeqList.h" //// 增删查改等接口函数 void SeqListInit(SL* ps) { memset(ps->a, 0, sizeof(SQDataType)*MAX_SIZE); ps->size = 0; } // 头插 尾插 头删 尾删 void SeqListPushBack(SL* ps, SQDataType x) { if (ps->size >= MAX_SIZE) { printf("SeqList is Full\n"); return; } ps->a[ps->size] = x; ps->size++; } void SeqListPushFront(SL* ps, SQDataType x); void SeqListPopBack(SL* ps); void SeqListPopFront(SL* ps); 

这里大家还可以看看静态顺序表尾插的实现,可以自己先尝试去理解一下,这样后续动态顺序表的尾插实现也能更好的入手哈。

小预告:到这里就把初始化部分给大家讲完了,由于初始化部分比较简单,就不把每一步拆开来讲了,大家通过我画的图应该就可以很好的理解掉这个部分,那么在下篇文章中博主将继续进行尾插,头插,头删,尾删等接口的实现,会拆开来详细讲述,让大家能更好的理解这几个接口实现的过程和需要注意的一些点。


往期回顾:

【数据结构初阶】--算法复杂度的深度解析

【C语言指针超详解(六)】--sizeof和strlen的对比,数组和指针笔试题解析,指针运算笔试题解析 

【C语言动态内存管理】--动态内存分配的意义,malloc和free,calloc和realloc,常见的动态内存的错误,动态内存经典笔试题分析,柔性数组,总结C/C++中程序内存区域划分 【自定义类型-结构体】--结构体类型,结构体变量的创建和初始化,结构体内存对齐,结构体传参,结构体实现位段

结语: 本篇文章就到此结束了,本篇博客是数据结构与算法专栏的第二篇,在下篇博客中会接着为大家分享顺序表中的其它知识点。大家感兴趣的话可以先看一下往期回顾中的几篇文章,都是对于数据结构来说比较重要的一些C语言知识储备,以及上一篇的算法复杂度,如果文章对你有帮助的话,欢迎评论,点赞,收藏加关注,感谢大家的支持。

Read more

WebUI Forge:立绘总是“贴图感”?平涂角色秒融赛博夜景

WebUI Forge:立绘总是“贴图感”?平涂角色秒融赛博夜景

主美站在你的工位后,盯着屏幕上刚合成的 AVG 游戏画面。 “这角色怎么像是在‘飘’?” 他指着站在《赛博贫民窟》背景前的二次元少女立绘,“背景是霓虹灯和紫色的雾气,你这角色脸上的光却是白天的平光。完全不融合,像个廉价贴纸。下周上线前,把这 20 个角色在不同场景(夕阳、火场、深海、夜店)下的光影变体全做出来。” 你看着图层面板里那个几百兆的 PSD,想把数位笔折断。 全场景光影适配? 这意味着你要手动新建“正片叠底”压暗环境,再建“颜色减淡”画受光面,还要根据背景光源的位置一点点去蹭边缘光。画一张变体就要 2 小时,稍微手抖,原本的画风就崩了。 在那在那在那用 PS 的“神经滤镜”?那个“协调”功能只能调色温,根本给不出真实的侧逆光和体积感。 面对这种“单一立绘适配多环境光照”的量产需求,利用

By Ne0inhk
ssm366基于Web的在线投稿系统的设计与实现+vue(文档+源码)_kaic

ssm366基于Web的在线投稿系统的设计与实现+vue(文档+源码)_kaic

摘  要 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本在线投稿系统就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞大的数据信息,使用这种软件工具可以帮助管理人员提高事务处理效率,达到事半功倍的效果。此在线投稿系统利用当下成熟完善的SSM框架,使用跨平台的可开发大型商业网站的Java语言,以及最受欢迎的RDBMS应用软件之一的Mysql数据库进行程序开发.在线投稿系统的开发根据操作人员需要设计的界面简洁美观,在功能模块布局上跟同类型网站保持一致,程序在实现基本要求功能时,也为数据信息面临的安全问题提供了一些实用的解决方案。可以说该程序在帮助管理者高效率地处理工作事务的同时,也实现了数据信息的整体化,规范化与自动化。 关键词:在线投稿系统;SSM框架;Mysql;自动化 Abstract The fast-paced development of the modern economy and the continuous improvement and upgrading of in

By Ne0inhk

手把手教你配置:企业微信外部群 Webhook 主动发送指南

QiWe开放平台 · 个人名片                 API驱动企微自动化,让开发更高效         核心能力:为开发者提供标准化接口、快速集成工具,助力产品高效拓展功能场景         官方站点:https://www.qiweapi.com         团队定位:专注企微API生态的技术服务团队        对接通道:搜「QiWe 开放平台」联系客服         核心理念:合规赋能,让企微开发更简单、更高效   在企业微信的自动化体系中,群机器人(Webhook) 是实现系统消息自动同步到外部群最快捷、门槛最低的工具。 虽然 2026 年官方对外部群机器人的管理更加精细化,但只要掌握正确的配置流程和调用逻辑,它依然是效率提升的神器。以下是完整的实操步骤: 第一步:获取 Webhook 地址 1. 添加机器人: 打开企业微信电脑端,进入你需要配置的外部群,点击右上角“...”,选择“群机器人” -> “添加机器人”。 2.

By Ne0inhk

前端人拿不到offer,九成是不知道这个新风向

今年大部分互联网公司面试的题目已经开始小部分八股文,大部分场景题了,公司需要的不仅是知识扎实,而且招进来就能上手项目的面试者… 2026最新高频场景题 * 1. 请求失败会弹出一个toast,如何保证批量请求失败,只弹出一个toast * 2. 如何减少项目里面if-else * 3. babel-runtime 作用是啥 * 4. 如何实现预览PDF文件 * 5. 如何在划词选择的文本上添加右键菜单(划词:鼠标滑动选择一组字符,对组字符进行操作) * 6. 富文本里面,是如何做到划词的(鼠标滑动选择一组字符,对组字符进行操作)? * 7. 如何做好前端监控方案 * 8. 如何标准化处理线上用户反馈的问题 * 9. px如何转为rem * 10. 浏览器有同源策略,但是为何 cdn 请求资源的时候不会有 跨域限制 * 11. cookie可以实现不同域共享吗 * 12. axios是否可以取消请求 * 13. 前端如何实现折叠面板效果? * 14. dom里面,如何判定a元素是否是b元素的子元 * 15. 判断一个对象是否为空,包含了其原型链上是否有自

By Ne0inhk