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

C语言——顺序表

文章目录

  • 一、线性表
  • 二、顺序表
    • 顺序表和数组的区别
    • 顺序表的分类
    • 1.静态顺序表
    • 2.动态顺序表
  • 三、动态顺序表的实现
    • 1.动态顺序表头文件
    • 2.动态顺序表源文件
    • 3.测试源文件

一、线性表


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

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

二、顺序表

顺序表和数组的区别

顺序表的底层结构是数组,对数组的封装,实现了常⽤的增删改查等接口

顺序表的分类

1.静态顺序表

概念:使⽤ 定⻓数组 存储元素

在这里插入图片描述

在这里插入图片描述

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

2.动态顺序表

动态顺序表就是动态分配内存,可以根据需求调节数组大小

在这里插入图片描述
在这里插入图片描述

三、动态顺序表的实现

实现的主要思想:
1.初始化顺序表:先初始化arr为NULL,size为0,capacity为0
2.销毁顺序表:顺序表使用完成之后,把arr动态分配的内存释放掉
3.扩容顺序表:在每次插入数据之前必须先检查是否空间充足,不足则开辟更大的空间
4.增删查改顺序表:围绕数组去做即可,比较简单。增:头插,尾插,指定位置插入;删:包括头删,尾删,指定位置删除;查找数据。

1.动态顺序表头文件

#pragma once
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
// 动态顺序表
//  按需申请
typedef int SLDateType;typedef struct SeqList
{SLDateType* arr;int size;//有效数据个数int capacity;//空间大小
}SL;void SLInit(SL* ps);//顺序表的初始化
void SLDestroy(SL* ps);//顺序表的销毁
void SLPrint(SL* ps);//顺序表的打印void SLCheckCapacity(SL* ps);//扩容//头部插入删除 / 尾部插入删除
void SLPushFront(SL* ps, SLDateType x);
void SLPushBack(SL* ps, SLDateType x);void SLPopFront(SL* ps);
void SLPopBack(SL* ps);//指定位置之前插入/删除数据
void SLInsert(SL* ps, int pos, SLDateType x);
void SLErase(SL* ps, int pos);//查找数据
int SLFind(SL* ps, SLDateType x);

2.动态顺序表源文件

#include "Seqlist.h"
//初始化
void SLInit(SL* ps)
{ps->arr = NULL;ps-> size = 0;ps->capacity = 0;
}
//销毁
void SLDestroy(SL* ps)
{if (ps->arr){free(ps->arr);}ps->arr = NULL;ps->size = 0;ps->capacity = 0;
}//打印
void SLPrint(SL* ps)
{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 : 2 * ps->capacity;SLDateType* tmp = (SLDateType*)realloc(ps->arr, NewCapacity * sizeof(SLDateType));if (tmp == NULL){perror("realloc fail!");exit(1);//直接退出程序}ps->arr = tmp;ps->capacity = NewCapacity;}
}//头部插入
void SLPushFront(SL* ps, SLDateType x)
{assert(ps);SLCheckCapacity(ps);for (int i = ps->size-1;i >= 0;i--){ps->arr[i + 1] = ps->arr[i];}ps->arr[0] = x;ps->size++;
}//尾部插入
void SLPushBack(SL* ps, SLDateType x)
{assert(ps);SLCheckCapacity(ps);ps->arr[ps->size++] = x;
}//头部删除
void SLPopFront(SL* ps)
{assert(ps);assert(ps->size);for (int i = 0;i < ps->size-1;i++){ps->arr[i] = ps->arr[i + 1];}ps->size--;
}//尾部删除
void SLPopBack(SL* ps)
{assert(ps);assert(ps->size);ps->size--;
}//在指定位置之前插入数据
void SLInsert(SL* ps, int pos, SLDateType x)
{assert(ps);assert(pos >= 0 && pos <= ps->size);SLCheckCapacity(ps);for (int i = ps->size-1;i >= pos;i--){ps->arr[i+1] = ps->arr[i];}ps->arr[pos] = x;ps->size++;
}//指定位置之前删除数据
void SLErase(SL* ps, int pos)
{assert(ps);assert(pos >= 0 && pos < ps->size);for (int i = pos;i < ps->size-1;i++){ps->arr[i] = ps->arr[i + 1];}ps->size--;
}//查找数据
int SLFind(SL* ps, SLDateType x)
{assert(ps);for (int i = 0; i < ps->size; i++){if (ps->arr[i] == x){return i;}}return -1;
}

3.测试源文件

最后可以在创建一个测试源文件去测试顺序表的正确性

#include "Seqlist.h"void test()
{SL s1;//测试初始化SLInit(&s1);//测试尾部插入SLPushBack(&s1, 1);SLPushBack(&s1, 2);SLPushBack(&s1, 3);SLPushBack(&s1, 4);SLPushBack(&s1, 5);//测试打印SLPrint(&s1);//测试头部插入/*SLPushFront(&s1, 9);SLPushFront(&s1, 8);SLPushFront(&s1, 7);SLPushFront(&s1, 6);SLPushFront(&s1, 66);*///测试头删/*SLPopFront(&s1);SLPrint(&s1);SLPopFront(&s1);SLPrint(&s1);SLPopFront(&s1);SLPrint(&s1);SLPopFront(&s1);SLPrint(&s1);SLPopFront(&s1);SLPrint(&s1);SLPopFront(&s1);SLPrint(&s1);*///测试尾删/*SLPopBack(&s1);SLPrint(&s1);SLPopBack(&s1);SLPrint(&s1);SLPopBack(&s1);SLPrint(&s1);SLPopBack(&s1);SLPrint(&s1);SLPopBack(&s1);SLPrint(&s1);SLPopBack(&s1);SLPrint(&s1);*///测试在指定位置之前插入数据/*SLInsert(&s1, 3, 8);SLPrint(&s1);*///测试在指定位置之前删除数据/*SLErase(&s1, 1);SLPrint(&s1);*///测试查找int find = SLFind(&s1, 3);if (find != -1){printf("找到了!下标为%d\n", find);}else{printf("没有找到\n");}//测试销毁SLDestroy(&s1);
}int main()
{test();return 0;
}

相关文章:

C语言——顺序表

文章目录 一、线性表二、顺序表顺序表和数组的区别顺序表的分类1.静态顺序表2.动态顺序表 三、动态顺序表的实现1.动态顺序表头文件2.动态顺序表源文件3.测试源文件 一、线性表 线性表&#xff08;linear list&#xff09;是n个具有相同特性的数据元素的有限序列。线性表是⼀种…...

CentOS7安装Docker及禅道

https://blog.csdn.net/weixin_46453070/article/details/136183615?ops_request_misc%257B%2522request%255Fid%2522%253A%2522171246925816800222886233%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id171246925816800222886233&biz_i…...

如何在社交媒体中使用增强现实来提高客户参与度?

目录 1. 增强现实在社交媒体中的应用是如何发展的 2. 社交媒体营销和广告中的增强现实 3. 社交媒体上的增强现实滤镜和镜头 4. 社交媒体平台上的增强现实购物 5. 利用社交媒体的增强现实事件和品牌激活 6. 增强现实在社交媒体中的未来是什么 7. 社交媒体中的增强现实常见…...

Autodesk AutoCAD 2025 (macOS, Windows) - 自动计算机辅助设计软件

Autodesk AutoCAD 2025 (macOS, Windows) - 自动计算机辅助设计软件 AutoCAD 2024 开始原生支持 Apple Silicon&#xff0c;性能提升至 2 倍 请访问原文链接&#xff1a;https://sysin.org/blog/autodesk-autocad/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处…...

买卖股票的最佳时机III

题目链接 买卖股票的最佳时机III 题目描述 注意点 1 < prices.length < 1000000 < prices[i] < 100000不能同时参与多笔交易&#xff08;必须在再次购买前出售掉之前的股票&#xff09;最多可以完成 两笔 交易 解答思路 本题最多可以完成两笔交易&#xff0c;…...

fastlio2 保存每帧的点云和每帧的里程计为单独的文件做后端回环优化和手动回环优化

为了 提供数据做后端回环优化和手动回环优化,需要保存每帧的点云和每帧的里程计为单独的文件,并且需要保存的名字为ros时间戳。 效果很好,比我自己写的手动回环模块好用 // This is an advanced implementation of the algorithm described in the // following paper: /…...

【线段树】【前缀和】:1687从仓库到码头运输箱子

本题简单解法 C前缀和算法的应用&#xff1a;1687从仓库到码头运输箱子 本文涉及的基础知识点 C算法&#xff1a;前缀和、前缀乘积、前缀异或的原理、源码及测试用例 包括课程视频 线段树 LeetCode1687从仓库到码头运输箱子 你有一辆货运卡车&#xff0c;你需要用这一辆车…...

[AIGC] 实现博客平台的推荐排行榜

推荐排行榜是许多网站和平台的重要特性&#xff0c;它可以把最受欢迎或最具价值的内容展示给用户。本文将详细介绍如何为博客网站实现一个推荐排行榜。 文章目录 一、选择推荐指标二、收集数据三、设计排行榜算法四、显示推荐排行榜五、demo总结 一、选择推荐指标 实现推荐排行…...

C++利用键值对计算某一个数对应的最值及其索引位置

目录 一、算法概述二、代码实现1、计算最值2、计算最值及其索引 三、结果展示 本文由CSDN点云侠原创&#xff0c;原文链接。如果你不是在点云侠的博客中看到该文章&#xff0c;那么此处便是不要脸的爬虫与GPT。 一、算法概述 类似下图所示&#xff0c;计算第一列中1或2对应的最…...

conda修改默认安装python版本为指定版本

1.查看conda中当前的python版本号: 打开Anaconda Powershell Prompt 输入python -V 回车会输出版本号 2.查看conda所支持的python版本,并选择指定版本安装 选择一个3.9.13版本的进行安装 安装命令: conda install python3.9.13 如果一直卡在这个画面,请使用管理员权限运行…...

显示学习番外篇(基于树莓派Pico) -- 游戏(TODO)

来自&#xff1a;11.4. 飞行小鸟 — mPython掌控 2.2.0 documentation &#xff08;TODO&#xff09;...

顺序表实战——基于顺序表的通讯录

前言&#xff1a;本篇文章主要是利用顺序表作为底层&#xff0c; 实现一个通讯录。偏向于应用&#xff0c; 对于已经学习过c的友友们可能没有难度了已经。没有学习过c的友友&#xff0c; 如果顺序表不会写&#xff0c; 或者说没有自己实现过&#xff0c; 请移步学习顺序表相关内…...

创建型模式--1.单例模式【巴基速递】

1. 巴基的订单 在海贼世界中&#xff0c;巴基速递是巴基依靠手下强大的越狱犯兵力&#xff0c;组建的集团海贼派遣公司&#xff0c;它的主要业务是向世界有需要的地方输送雇佣兵&#xff08;其实是不干好事儿&#xff09;。 自从从特拉法尔加罗和路飞同盟击败了堂吉诃德家族 &…...

用 Wireshark 解码 H.264

H264&#xff0c;你不知道的小技巧-腾讯云开发者社区-腾讯云 这篇文章写的非常好 这里仅做几点补充 init.lua内容&#xff1a; -- Set enable_lua to false to disable Lua support. enable_lua trueif not enable_lua thenreturn end-- If false and Wireshark was start…...

鸿蒙TypeScript学习第10天:【String(字符串)】

1、TypeScript String&#xff08;字符串&#xff09; String 对象用于处理文本&#xff08;字符串&#xff09;。 语法 var txt new String("string"); 或者更简单方式&#xff1a; var txt "string"; 2、String 对象属性 下表列出了 String 对象支…...

【201】Java8读取JSON树形结构并插入到MySQL数据库表中

我写了一个 maven 项目的 Demo&#xff0c;用来演示 JAVA8 如何读取 JSON 文件树形结构&#xff0c;并将这种树形结构保存到 MySQL 中。 json文件 city.json {"name": "山东省","sub": [{"name": "青岛市","sub"…...

AI“复活”:慰藉心灵还是触碰禁忌?一文看懂技术与伦理的较量|TodayAI

随着人工智能&#xff08;AI&#xff09;技术的迅猛发展&#xff0c;其应用领域也越来越广泛&#xff0c;不仅仅局限于数据分析、机器人自动化等传统领域&#xff0c;更是延伸到了一些人们曾经认为只存在于科幻小说中的领域。近年来&#xff0c;使用AI技术“复活”逝者的概念&a…...

Jackson @JsonUnwrapped注解扁平化 序列化反序列化数据

参考资料 Jackson 2.x 系列【7】注解大全篇三JsonUnwrapped 以扁平的数据结构序列化/反序列化属性Jackson扁平化处理对象 目录 一. 前期准备1.1 前端1.2 实体类1.3 Controller层 二. 扁平化序列反序列化数据2.1 序列化数据2.2 反序列化数据 三. 前缀后缀处理属性同名四. Map数…...

日期时间相关的类

分界线jdk8 jdk8之前和之后分别提供了一些日期和时间的类&#xff0c;推荐使用jdk8之后的日期和时间类 Date类型 这是一个jdk8之前的类型&#xff0c;其中有很多方法已经过时了&#xff0c;选取了一些没有过时的API //jdk1.8之前的日期 Date Date date new Date(); // 从1970年…...

微信小程序脚本的执行顺序

在小程序中的脚本执行顺序和浏览器中有所不同。 小程序的执行的入口文件是 app.js 。 并且会根据其中 require 的模块顺序决定文件的运行顺序&#xff0c;代码是一个 app.js 示例。 app.js /* a.js console.log(a.js) */ var a require(./a.js) console.log(app.js)/* b.js co…...

Cesium性能优化:你可能不知道的onTick事件监听器内存泄漏问题

Cesium性能优化&#xff1a;你可能不知道的onTick事件监听器内存泄漏问题 在构建长时间运行的WebGIS应用时&#xff0c;Cesium的流畅渲染往往被视为首要目标。但许多开发者忽略了一个隐形杀手——未被正确清理的onTick事件监听器。这些看似无害的代码片段&#xff0c;会在用户毫…...

手把手教你用PassFab for Office 8.5.1找回遗忘的Word/Excel密码(保姆级图文教程)

办公文档密码遗忘急救指南&#xff1a;PassFab for Office全流程实战解析 你是否经历过这样的场景&#xff1a;周一早晨准备修改季度报表时&#xff0c;突然发现去年设置的Excel密码怎么试都不对&#xff1b;或是毕业论文答辩前夜&#xff0c;重要参考文献的Word文档因密码错误…...

零基础学linux:借助快马ai生成你的第一份命令手册与实战练习脚本

作为一个从图形界面转战Linux命令行的过来人&#xff0c;我完全理解新手面对黑底白字终端时的茫然感。最近在InsCode(快马)平台尝试用AI辅助学习时&#xff0c;发现它特别适合解决这个痛点——不仅能生成清晰易懂的命令手册&#xff0c;还能创建可交互的练习脚本&#xff0c;就…...

Anthropic员工失误导致Claude Code源代码泄露

事件概述&#xff1a;npm源映射文件暴露专有代码Anthropic公司一名员工在npm公开注册账户发布的AI编程工具Claude Code版本中意外包含源映射&#xff08;source map&#xff09;文件&#xff0c;导致该工具的完整专有源代码暴露。AI专家指出&#xff0c;这种失误存在重大安全风…...

颠覆式数据处理解决方案:CyberChef实现复杂数据转换的全流程优化

颠覆式数据处理解决方案&#xff1a;CyberChef实现复杂数据转换的全流程优化 【免费下载链接】CyberChef The Cyber Swiss Army Knife - a web app for encryption, encoding, compression and data analysis 项目地址: https://gitcode.com/GitHub_Trending/cy/CyberChef …...

Graphormer惊艳案例:从SMILES到三维构象倾向性预测的延伸应用探索

Graphormer惊艳案例&#xff1a;从SMILES到三维构象倾向性预测的延伸应用探索 1. 模型概述 Graphormer是微软研究院开发的一款基于纯Transformer架构的图神经网络模型&#xff0c;专门为分子图&#xff08;原子-键结构&#xff09;的全局结构建模与属性预测而设计。与传统图神…...

低成本自动化方案:OpenClaw+自部署千问3.5-27B替代ChatGPT API调用

低成本自动化方案&#xff1a;OpenClaw自部署千问3.5-27B替代ChatGPT API调用 1. 为什么选择本地模型OpenClaw组合 去年我用ChatGPT API开发自动化脚本时&#xff0c;发现一个致命问题&#xff1a;当任务需要连续调用多个API时&#xff08;比如先搜索资料再整理成报告&#x…...

MySQL中LOCATE()函数的5个实用场景解析

1. 初识LOCATE()函数&#xff1a;MySQL中的字符串定位利器 第一次接触LOCATE()函数是在处理用户评论系统的时候。当时需要快速找到特定关键词在长文本中的位置&#xff0c;手动遍历字符串简直让人抓狂。LOCATE()就像字符串世界里的GPS&#xff0c;能精准告诉你目标子串的坐标。…...

Pixel Language Portal 软件测试实战:根据需求自动生成测试用例与脚本

Pixel Language Portal 软件测试实战&#xff1a;根据需求自动生成测试用例与脚本 1. 引言&#xff1a;测试自动化的新范式 在敏捷开发大行其道的今天&#xff0c;测试工程师们常常面临这样的困境&#xff1a;需求变更频繁&#xff0c;测试用例维护成本高&#xff1b;手工编写…...

MacOS自动操作神器:3个隐藏功能一键搞定桌面整理(附脚本)

MacOS自动操作神器&#xff1a;3个隐藏功能一键搞定桌面整理&#xff08;附脚本&#xff09; 每次打开Mac电脑&#xff0c;看到满屏的文件和图标&#xff0c;是不是感觉工作效率瞬间降了一半&#xff1f;特别是视频创作者和设计师&#xff0c;桌面上经常堆满素材和半成品&#…...