当前位置: 首页 > news >正文

基于C语言的数据结构--顺序表讲解及代码函数实现展示

        本篇文章是数据结构的开篇,所以我们先来了解一下什么是数据结构。

什么是数据结构

        数据结构是由“数据”和“结构”两个词组合而来,自然要以两个词分别去阐述。

        首先,什么是数据?数据(data)是事实或观察的结果,是对客观事物的逻辑归纳,是用于表示客观事物的未经加工的原始素材。 数据可以是连续的值,比如声音、图像,称为模拟数据;也可以是离散的,如符号、文字,称为数字数据。 在计算机系统中,数据以二进制信息单元0、1的形式表示。

        什么是结构?当我们想要使用大量同一类型数据的时候,通过手动定义大量的独立的变量对程序来说可读性非常差,我们可以借助数组这样的数据结构将大量的数据组织在一起,结构也可以理解为组织数据的方式。这样的结构可以大大提高我们寻找数据的效率。

        由此我们引出数据结构的概念:数据结构是计算机储存、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。数据结构反应的是数据的内部构成,即数据由哪一部分构成,以什么方式构成,以及数据元素之间呈现的结构。

总结:
1)能够存储数据(如顺序表、链表等结构)
2)存储的数据能够⽅便查找

为什么需要数据结构

        在如今时代化的商业餐饮总是人山人海,不借助排队的方式来管理客户,会导致客户的就餐感受差、等餐时间长、餐厅营业混乱等情况。同理,程序中如果不对数据进行管理,可能导致数据丢失、操作数据困难、野指针等情况。通过数据结构,我们能够有效地将数据组织和管理在一起。按照我们的方式任意地对数据进行增删查改等操作。

        我们之前在C语言中讲到的数组就是最基础的数据结构,尽管有了数组,但是最基础的数据结构已经不能完全满足复杂算法的实现,因此慢慢发展出了数据结构。

        示例:假定数组有10个空间,已经使⽤了5个,向数组中插⼊数据步骤:求数组的⻓度,求数组的有效数据个数,向下标为数据有效个数的位置插⼊数据(注意:这⾥是否要判断数组是否满了,满了还能继续插⼊吗).....假设数据量⾮常庞⼤,频繁的获取数组有效数据个数会影响程序执⾏效率。

线性表的概念及结构

        线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表是⼀种在实际中⼴泛使⽤的数据结构,常⻅的线性表:顺序表、链表、栈、队列、字符串...线性表在逻辑上是线性结构,也就说是连续的⼀条直线。但是在物理结构上并不⼀定是连续的,线性表在物理上存储时,通常以数组和链式结构的形式存储。

注意:本章只讲顺序表,后续会继续讲解其他线性结构。

顺序表

        顺序表的底层结构其实就是数组,是通过对数组的封装,实现了常⽤的增删改查等接⼝。

        顺序表分为静态顺序表和动态顺序表,两者的区别在于它们的空间容量是否固定。静态顺序表使用的是定长数组储存元素,动态顺序表则是通过动态内存管理的方式对空间容量进行按需申请,因为静态顺序表存在致命缺陷(空间给少了不够用,给多了又造成空间浪费),因此我们通常使用动态顺序表。

下面我将附上函数声明和函数实现代码,测试代码请各位按自己喜好自主补充:

        注意:typedef int sqDataType的意义是方便后期更换类型时快速便捷,并且不会影响到其他无关的相同类型。

sqlist.h#pragma once
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>typedef int sqDataType;
//定义结构体
typedef struct SQlist 
{sqDataType* arr;int size;int capacity;
}SQL;//初始化声明
void InitSQL(SQL* s);
//动态开辟内存声明
void Dyopen(SQL* s);
//动态扩容
void check_Dyexpand(SQL* s);
//打印函数
void SQLprint(SQL* s);
//头插函数声明
void HeadInsert(SQL* s, sqDataType num);
//尾插函数声明
void TailInsert(SQL* s, sqDataType num);
//任意位置插入的函数声明
void SQLinsert(SQL* s, int pos, sqDataType num);//头删函数声明
void HeadDelete(SQL* s);
//尾删函数声明
void TailDelete(SQL* s);
//任意位置删除的函数声明
void SQLdelete(SQL* s, int pos, sqDataType num);//查找函数声明
int SQLsearch(SQL* s, sqDataType num);
//修改函数声明
void SQLedit(SQL* s,int pos,sqDataType num);//顺序表销毁函数
void SQLdestroy(SQL* s);
sqlist.c#include "sqlist.h"//初始化
void InitSQL(SQL* s)
{s->arr = NULL;s->capacity = s->size = 0;printf("初始化完成\n");
}//动态开辟内存
void Dyopen(SQL* s)
{assert(s);sqDataType* ps = (sqDataType*)malloc(sizeof(sqDataType) * 1);if (ps == NULL){perror("malloc");return 1;}s->arr = ps;s->capacity = 1;printf("开辟成功\n");
}//动态扩容判断函数
void check_Dyexpand(SQL* s)
{assert(s);if (s->size == s->capacity){int newcapacity = (s->capacity == 0) ? 1 : (2 * s->capacity);sqDataType* ps = (sqDataType*)realloc(s->arr, sizeof(sqDataType) * newcapacity);s->capacity = newcapacity;printf("扩容成功\n");}else{printf("本次无需扩容\n");}
}//顺序表打印函数
void SQLprint(SQL* s)
{assert(s);for (int i = 0; i < s->size; i++){printf("%d ", s->arr[i]);}
}//头插函数
void HeadInsert(SQL *s,sqDataType num)
{assert(s);check_Dyexpand(&s);for (int i = s->size; i > 0; i--){s->arr[s->size] = s->arr[s->size - 1];}s->arr[0] = num;++(s->size);
}//尾插函数
void TailInsert(SQL* s,sqDataType num)
{assert(s);check_Dyexpand(&s);s->arr[s->size++] = num;
}//任意位置插入的函数
void SQLinsert(SQL* s, int pos, sqDataType num)
{assert(s);assert(pos >= 0 && pos <= s->size);check_Dyexpand(&s);for (int i = s->size - 1; i >= pos; i--){s->arr[i + 1] = s->arr[i];}s->arr[pos] = num;s->size++;printf("插入成功\n");
}//头删函数
void HeadDelete(SQL* s)
{assert(s);assert(s->size);if (s->size > 0){int i = 0;for (i = 1; i < s->size; i++){s->arr[i - 1] = s->arr[i];}--(s->size);printf("删除成功\n");}else{printf("顺序表为空,删除失败");return 1;}}//尾删函数
void TailDelete(SQL* s)
{assert(s);assert(s->size);if (s->size > 0){s->size--;printf("删除成功\n");}else{printf("顺序表为空,删除失败");return 1;}
}//任意位置删除的函数
void SQLdelete(SQL* s, int pos, sqDataType num)
{assert(s);assert(pos >= 0 && pos < s->size);//访问s->size位置是越界的check_Dyexpand(&s);for (int i = pos-1; i < s->size - 1; i++){s->arr[i] = s->arr[i + 1];}s->size--;printf("删除成功\n");
}//查找函数
int SQLsearch(SQL* s, sqDataType num)
{assert(s);for (int i = 0; i < s->size; i++){if (s->arr[i] == num){return i;}else{return -1;}}
}//修改函数
void SQLedit(SQL* s, int pos, sqDataType num)
{assert(s);assert(pos >= 0 && pos < s->size);s->arr[pos - 1] = num;printf("修改成功\n");
}//顺序表销毁函数
void SQLdestroy(SQL* s)
{if (s->arr != NULL){free(s->arr);s->arr = NULL;}s->capacity = s->size = 0;printf("销毁成功\n");
}

相关文章:

基于C语言的数据结构--顺序表讲解及代码函数实现展示

本篇文章是数据结构的开篇&#xff0c;所以我们先来了解一下什么是数据结构。 什么是数据结构 数据结构是由“数据”和“结构”两个词组合而来&#xff0c;自然要以两个词分别去阐述。 首先&#xff0c;什么是数据&#xff1f;数据(data)是事实或观察的结果&#xff0c;是对客…...

(学习日记)2024.03.31:UCOSIII第二十八节:消息队列常用函数

写在前面&#xff1a; 由于时间的不足与学习的碎片化&#xff0c;写博客变得有些奢侈。 但是对于记录学习&#xff08;忘了以后能快速复习&#xff09;的渴望一天天变得强烈。 既然如此 不如以天为单位&#xff0c;以时间为顺序&#xff0c;仅仅将博客当做一个知识学习的目录&a…...

DLC原理解析及其优化思考

1. 引言 Discreet Log Contract (DLC) 是由麻省理工学院的Tadge Dryja在2018年提出的一套基于预言机的合约执行方案。DLC 允许两方根据预定义的条件进行有条件付款。各方确定可能的结果并进行预签名&#xff0c;并在预言机签署结果时使用这些预签名来执行支付。 因此&#xff…...

tigramite教程(七)使用TIGRAMITE 进行条件独立性测试

文章目录 概述1 连续数值变量1.1 ParCorr 偏相关&#xff08;ParCorr类&#xff09;1.2 鲁棒偏相关&#xff08;RobustParCorr&#xff09;非线性检验1.3 GPDC1.4 CMIknn 2a. 分类/符号时间序列2b. 混合分类/连续时间序列多变量X和Y的测试 概述 这个表格概述了 X ⊥ Y ∣ Z X\…...

【DevOps工具篇】使用Ansible部署Keycloak oauth2proxy 和 单点登录(SSO)设置

【DevOps工具篇】使用Ansible部署Keycloak oauth2proxy 和 单点登录(SSO)设置 目录 【DevOps工具篇】使用Ansible部署Keycloak oauth2proxy 和 单点登录(SSO)设置Ansible 基础知识部署 Keycloak创建 OIDC-客户端创建 oauth2proxy 部署顶级 Ansible PlaybookHost.iniplayboo…...

鸿蒙OS开发实例:【应用状态变量共享】

平时在开发的过程中&#xff0c;我们会在应用中共享数据&#xff0c;在不同的页面间共享信息。虽然常用的共享信息&#xff0c;也可以通过不同页面中组件间信息共享的方式&#xff0c;但有时使用应用级别的状态管理会让开发工作变得简单。 根据不同的使用场景&#xff0c;ArkT…...

C#清空窗体的背景图片

目录 一、涉及到的知识点 1.设置窗体的背景图 2.加载窗体背景图 3.清空窗体的背景图 二、 示例 一、涉及到的知识点 1.设置窗体的背景图 详见本文作者的其他文章&#xff1a;C#手动改变自制窗体的大小-CSDN博客 https://wenchm.blog.csdn.net/article/details/137027140…...

Qt 实现的万能采集库( 屏幕/相机/扬声器/麦克风采集)

【写在前面】 之前应公司需要&#xff0c;给公司写过一整套直播的库( 推拉流&#xff0c;编解码)&#xff0c;类似于 libobs。 结果后来因为没有相关项目&#xff0c;便停止开发&维护了。 不过里面很多有用的组件&#xff0c;然后也挺好用的&#xff0c;遂开源出来一部分。…...

将写好的打印机代码打包成jar包然后直接注册成windows服务,然后通过调用插件的接口地址将流传到接口实现解析并无需预览直接通过打印机直接打印PDF文件

实现文件流PDF不需要预览直接调用打印机打印实现方案就是&#xff0c;将写好的打印机代码打包成jar包然后直接注册成windows服务&#xff0c;然后通过调用插件的接口地址将流传到接口实现解析并无需预览直接通过打印机直接打印PDF文件。源码地址...

加密软件VMProtect教程:使用脚本-功能

VMProtect是新一代软件保护实用程序。VMProtect支持德尔菲、Borland C Builder、Visual C/C、Visual Basic&#xff08;本机&#xff09;、Virtual Pascal和XCode编译器。 同时&#xff0c;VMProtect有一个内置的反汇编程序&#xff0c;可以与Windows和Mac OS X可执行文件一起…...

51单片机入门_江协科技_21.1_开发板USB口连接建议

1. 目前我自己用的普中A2版本的开发板&#xff0c;操作失误导致在开发板连接电脑并通电的情况下误将跳线帽触碰到开发板的3.3V与GND&#xff0c;导致USB口浪涌&#xff0c;2个电脑上面的USB口烧毁&#xff0c;开发板暂时没有任何问题&#xff0c;电脑USB口现在只是接通后有电&a…...

基于Spring Boot 3 + Spring Security6 + JWT + Redis实现登录、token身份认证

基于Spring Boot3实现Spring Security6 JWT Redis实现登录、token身份认证。 用户从数据库中获取。使用RESTFul风格的APi进行登录。使用JWT生成token。使用Redis进行登录过期判断。所有的工具类和数据结构在源码中都有。 系列文章指路&#x1f449; 系列文章-基于SpringBoot3…...

Kubernetes(k8s):精通 Pod 操作的关键命令

Kubernetes&#xff08;k8s&#xff09;&#xff1a;精通 Pod 操作的关键命令 1、查看 Pod 列表2、 查看 Pod 的详细信息3、创建 Pod4、删除 Pod5、获取 Pod 日志6、进入 Pod 执行命令7、暂停和启动 Pod8、改变 Pod 副本数量9、查看当前部署中使用的镜像版本10、滚动更新 Pod11…...

【随笔】Git 高级篇 -- 相对引用2(十三)

&#x1f48c; 所属专栏&#xff1a;【Git】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &#x1f496; 欢迎大…...

xilinx AXI CAN驱动开发

CAN收发方案有很多&#xff0c;常见的解决方案通过是采用CAN收发芯片&#xff0c;例如最常用的SJA1000,xilinx直接将CAN协议栈用纯逻辑实现&#xff0c;AXI CAN是其中一种&#xff1b; 通过这种方式硬件上只需外接一个PHY芯片即可 上图加了一个电平转换芯片 软件设计方面&…...

Python:百度AI开放平台——OCR图像文字识别应用

一、注册百度AI开放平台 使用百度AI服务的步骤为&#xff1a; 注册&#xff1a;注册成为百度AI开放平台开发者&#xff1b;创建AI应用&#xff1a;在百度API开放平台上创建相关类型的的AI应用&#xff0c;获得AppID、API Key和Secret Key&#xff1b;调用API&#xff1a;调用…...

OpenEuler/Centos制作离线软件源

需求背景&#xff1a; 一般线上服务器都是不能连接外网&#xff0c;服务器安装好系统之后就需要部署相关软件&#xff0c;此时因为无法联网导致无法下载软件&#xff0c;所以都会做一个本地的离线软件源&#xff0c;本文简单介绍如何快速利用已经下载好的rpm包&#xff0c;制作…...

论文笔记:基于多粒度信息融合的社交媒体多模态假新闻检测

整理了ICMR2023 Multi-modal Fake News Detection on Social Media via Multi-grained Information Fusion&#xff09;论文的阅读笔记 背景模型实验 背景 在假新闻检测领域&#xff0c;目前的方法主要集中在文本和视觉特征的集成上&#xff0c;但不能有效地利用细粒度和粗粒度…...

攻防世界 xff_referer 题目解析

xff_referer 一&#xff1a;了解xxf和Referer X-Forwarded-For:简称XFF头&#xff0c;它代表客户端&#xff0c;也就是HTTP的请求端真实的IP&#xff0c;只有在通过了HTTP 代理或者负载均衡服务器时才会添加该项。 一般的客户端发送HTTP请求没有X-Forwarded-For头的&#xff0…...

open-cd框架调试记录

源于论文Changer: Feature Interaction Is What You Need forChange Detection 源码位置&#xff1a;open-cd/README.md at main likyoo/open-cd (github.com) 同样是基于MMSegmentation框架的代码&#xff0c;不符合本人编程习惯所以一直也没有研究这东西&#xff0c;近期打…...

云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地

借阿里云中企出海大会的东风&#xff0c;以**「云启出海&#xff0c;智联未来&#xff5c;打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办&#xff0c;现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...

LLM基础1_语言模型如何处理文本

基于GitHub项目&#xff1a;https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken&#xff1a;OpenAI开发的专业"分词器" torch&#xff1a;Facebook开发的强力计算引擎&#xff0c;相当于超级计算器 理解词嵌入&#xff1a;给词语画"…...

实现弹窗随键盘上移居中

实现弹窗随键盘上移的核心思路 在Android中&#xff0c;可以通过监听键盘的显示和隐藏事件&#xff0c;动态调整弹窗的位置。关键点在于获取键盘高度&#xff0c;并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...

Swagger和OpenApi的前世今生

Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章&#xff0c;二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑&#xff1a; &#x1f504; 一、起源与初创期&#xff1a;Swagger的诞生&#xff08;2010-2014&#xff09; 核心…...

OPENCV形态学基础之二腐蚀

一.腐蚀的原理 (图1) 数学表达式&#xff1a;dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一&#xff0c;腐蚀跟膨胀属于反向操作&#xff0c;膨胀是把图像图像变大&#xff0c;而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...

(一)单例模式

一、前言 单例模式属于六大创建型模式,即在软件设计过程中,主要关注创建对象的结果,并不关心创建对象的过程及细节。创建型设计模式将类对象的实例化过程进行抽象化接口设计,从而隐藏了类对象的实例是如何被创建的,封装了软件系统使用的具体对象类型。 六大创建型模式包括…...

【LeetCode】算法详解#6 ---除自身以外数组的乘积

1.题目介绍 给定一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&#xff0c;且在 O…...

LCTF液晶可调谐滤波器在多光谱相机捕捉无人机目标检测中的作用

中达瑞和自2005年成立以来&#xff0c;一直在光谱成像领域深度钻研和发展&#xff0c;始终致力于研发高性能、高可靠性的光谱成像相机&#xff0c;为科研院校提供更优的产品和服务。在《低空背景下无人机目标的光谱特征研究及目标检测应用》这篇论文中提到中达瑞和 LCTF 作为多…...

【Veristand】Veristand环境安装教程-Linux RT / Windows

首先声明&#xff0c;此教程是针对Simulink编译模型并导入Veristand中编写的&#xff0c;同时需要注意的是老用户编译可能用的是Veristand Model Framework&#xff0c;那个是历史版本&#xff0c;且NI不会再维护&#xff0c;新版本编译支持为VeriStand Model Generation Suppo…...

0x-3-Oracle 23 ai-sqlcl 25.1 集成安装-配置和优化

是不是受够了安装了oracle database之后sqlplus的简陋&#xff0c;无法删除无法上下翻页的苦恼。 可以安装readline和rlwrap插件的话&#xff0c;配置.bahs_profile后也能解决上下翻页这些&#xff0c;但是很多生产环境无法安装rpm包。 oracle提供了sqlcl免费许可&#xff0c…...