C语言:顺序表专题

目录

  • 一、数据结构之顺序表/链表
    • 1.数据结构相关概念
      • 1.1什么是数据结构
      • 1.2为什么需要数据结构
  • 二、顺序表
    • 1.顺序表的概念及结构
    • 2.顺序表分类
    • 3.动态顺序表的实现

一、数据结构之顺序表/链表

1.数据结构相关概念

1.1什么是数据结构

数据结构是由“数据”和“结构”两词组合而来。
什么是数据?常见的数值1、2、3、4…、教务系统里保存的用户信息(姓名、性别、年龄、学历等等)、网页里肉眼可以看到的信息(文字、图片、视频等等),这些都是数据。
什么是结构?
当我们想要使用大量同一类型的数据时,通过手动定义大量的独立的变量对于程序来说,可读性非常差,我们可以借助数组这样的数据结构将大量的数据组织在一起,结构也可以理解为组织数据的方式。
概念:数据结构是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。数据结构反映数据的内部构成。
总结:

  • 能够存储数据(如顺序表、链表等结构)
  • 存储的数据能够方便查找

1.2为什么需要数据结构

通过数据结构,能够有效将数据组织和管理在一起。按照我们的方式任意对数据进行增删改查等操作。
最基础的数据结构:数组。
在这里插入图片描述
有了数组,为什么还要学习其他的数据结构?
假定数组有10个空间,已经使用了5个,向数组中插入数据步骤:
求数组的长度,求数组的有效数据个数,向下标为数据有效个数的位置插入数据(注意:这里是否要判断数组是否满了,满了还能继续插入吗)…
假设数据量非常庞大,频繁的获取数组有效数据个数会影响程序执行效率。
结论:最基础的数据结构能够提供的操作已经不能完全满足复杂算法实现,于是就有了我们的顺序表。

二、顺序表

1.顺序表的概念及结构

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

2.顺序表分类

  1. 顺序表和数组的区别
    顺序表的底层结构是数组,对数组的封装,实现了常用的增删改查等接口
  2. 顺序表分类

静态顺序表
概念:使用定长数组存储元素
在这里插入图片描述
静态顺序表缺陷:空间给少了不够用,给多了造成空间浪费
动态顺序表
在这里插入图片描述

3.动态顺序表的实现

Seqlist.h//函数的声明以及定义
#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
typedef int SLDataType;
// 动态顺序表 -- 按需申请
typedef struct SeqList
{SLDataType* a;int size;     // 有效数据个数int capacity; // 空间容量
}SL;//顺序表初始化
void SLInit(SL* ps);//扩容
void SLCheckCapacity(SL* ps);
//顺序表的尾插
void SLPushBack(SL* ps, SLDataType x);//顺序表的头插
void SLPushFront(SL* ps, SLDataType x);//顺序表打印
void SLPrint(SL* ps);//指定位置之前插入数据
void SLInsert(SL* ps, int pos, SLDataType x);//指定位置删除数据
void SLErase(SL* ps, int pos);//查找数据
int SLFind(SL* ps, SLDataType x);//顺序表的销毁
void SLDestroy(SL* ps);
Seqlist.c//函数具体实现方法
#include "Seqlist.h"
//初始化顺序表
void SLInit(SL* ps)
{ps->a = NULL;ps->size = ps->capacity = 0;
}
//扩容
void SLCheckCapacity(SL* ps)
{assert(ps);//判断是否有内存空间int newcapacity = ps->capacity == 0 ? 4 : 2 * ps->capacity;//判断内存空间是否已满if (ps->size == ps->capacity){int* tmp = (int*)realloc(ps->a, newcapacity * sizeof(SLDataType));if (tmp == NULL){perror(realloc);exit(1);}//创建成功ps->a = tmp;//把申请好的空间继续交给arr来维护ps->capacity = newcapacity;}
}
//顺序表的尾插
void SLPushBack(SL* ps, SLDataType x)
{SLCheckCapacity(ps);//插入到当前下标为size的位置,然后size++ps->a[ps->size++] = x;
}
//顺序表的头插
void SLPushFront(SL* ps, SLDataType x)
{SLCheckCapacity(ps);//已有的数据往后挪动一位for (int i = ps->size; i >0 ; i--){ps->a[i] = ps->a[i - 1];}ps->a[0] = x;++ps->size;
}
//打印顺序表数据
void SLPrint(SL* ps)
{for (int i = 0; i < ps->size; i++){printf("%d ", ps->a[i]);}printf("\n");
}
//指定位置之前插入数据
void SLInsert(SL* ps, int pos, SLDataType x)//pos是指定的下标位置
{assert(pos >= 0 && pos <= ps->size);SLCheckCapacity(ps);for (int i = ps->size; i >pos; i--){ps->a[i] = ps->a[i - 1];}ps->a[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->a[i] = ps->a[i + 1];}ps->size--;
}
//查找数据
int SLFind(SL* ps, SLDataType pos)
{for (int i = 0; i < ps->size; i++){if (pos == ps->a[i])return i;}return -1;
}
//顺序表的销毁
void SLDestroy(SL* ps)
{if (ps->a){free(ps->a);}ps->a = NULL;ps->size = ps->capacity = 0;
}
text.c//测试用例
#include "Seqlist.h"
void Test01()
{SL p;//创建顺序表SLInit(&p);//尾插测试SLPushBack(&p, 3);SLPushBack(&p, 4);//头插测试SLPushFront(&p, 2);SLPushFront(&p, 1);//打印顺序表数据SLPrint(&p);//指定位置之前插入数据SLInsert(&p, 0, 99);SLInsert(&p, 4, 99);SLPrint(&p);//指定位置删除数据SLErase(&p, 0);SLErase(&p, 2);SLErase(&p, 3);SLPrint(&p);//查找数据int ret = SLFind(&p, 3);if (ret < 0)printf("没找到\n");elseprintf("找到了,下标为%d\n", ret);//顺序表的销毁SLDestroy(&p);
}
int main()
{Test01();return 0;
}

下一篇文章会讲到顺序表在通讯录项目中的应用,欲知后事如何,请听下回分解,看到这里,别忘了给博主一键三连哟~❤️谢谢宝子们!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/797366.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

解锁ETLCloud中Kettle的用法

随着大数据时代的到来&#xff0c;数据的处理和管理成为各行各业不可或缺的一环。ETL&#xff08;Extract-Transform-Load&#xff09;工具作为数据处理的重要环节&#xff0c;扮演着将数据从源端抽取出来、经过转换处理&#xff0c;最终加载至目标端的关键角色。在众多ETL工具…

【Python】数据挖掘与机器学习(一)

【Python】数据挖掘与机器学习(一) 大家好 我是寸铁&#x1f44a; 总结了一篇【Python】数据挖掘与机器学习(一)sparkles: 喜欢的小伙伴可以点点关注 &#x1f49d; 【实验1】预测鲍鱼年龄 问题描述 请从一份数据中预测鲍鱼的年龄&#xff0c;数据集在abalone.cvs中&#xff…

【Qt】:常用控件(二:QWidget核心属性)

常用控件&#xff08;二&#xff09; 一.cursor&#xff08;光标形状&#xff09;二.font&#xff08;字体信息&#xff09;三.toolTip&#xff08;提示显示&#xff09;四.focusPolicy&#xff08;焦点&#xff09;五.styleSheet&#xff08;文本样式&#xff09; 一.cursor&a…

Java BigDecimal类

原因 为什么要有BigDecimal类因为二进制的缘故&#xff0c;直接对浮点数进行运算&#xff0c;会导致精度丢失的问题下例&#xff1a;出现了0.1 0.2 <> 0.3 常见的API 这些API中&#xff0c;并不推荐由double类型转换的BigDecimal,因为底层还是double推荐使用由string 类…

QT5-qmediaplayer播放视频及进度条控制实例

qmediaplayer是QT5的播放视频的一个模块。它在很多时候还是要基于第三方的解码器。这里以Ubuntu系统为例&#xff0c;记录其用法及进度条qslider的控制。 首先&#xff0c;制作一个简单的界面文件mainwindow.ui&#xff1a; 然后&#xff0c;下载一个mp4或其他格式视频&#x…

【算法集训】基础算法:二分查找 | 概念篇

二分枚举&#xff0c;也叫二分查找&#xff0c;指的就是给定一个区间&#xff0c;每次选择区间的中点&#xff0c;并且判断区间中点是否满足某个条件&#xff0c;从而选择左区间继续求解还是右区间继续求解&#xff0c;直到区间长度不能再切分为止。 由于每次都是把区间折半&am…

小程序实现订阅功能和测试发送订阅信息

现在一次性订阅是只能用户点一次才能发送一次&#xff0c;而针对长期模板只有规定的几种类目政务、民生、交通等等的才可以&#xff0c;所以说感觉这功能其实已经不是很适合使用了&#xff0c;只适合一些特别的场景才可以使用。 地址&#xff1a;https://developers.weixin.qq…

where 函数

Pandas 中的 where 函数 在 Pandas 中&#xff0c;where 函数用于替换不满足条件的值。具体来说&#xff0c;它返回一个与原始 DataFrame 或 Series 形状相同的新对象&#xff0c;但所有不满足条件的值都被替换为指定的值&#xff08;默认为 NaN&#xff09;。 对于 DataFram…

【Web应用技术基础】JavaScript(7)——案例:点击文字则放大字体

视频已发。截图如下&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</titl…

Java基础知识总结(43)

&#xff08;1&#xff09;初始化块 和构造方法具有相同功能的是初始化块。当创建Java对象时&#xff0c;系统总是先调用类中定义的初始化块 &#xff08;2&#xff09;静态初始化块 如果定义初始化块使用了static修饰&#xff0c;则这个初始化块就变成了静态初始化块&#xf…

html基础介绍

概念 HTML 文件 扩展名是 .html 的文件称为网页文件或者HTML文件HTML 文件使用代码编辑进行编辑&#xff0c;使用浏览器查看效果 声明方式 <!Doctype html>&#xff01;DOCTYPE 是一个文档类型标记&#xff0c;是一种标准通用标记语言的文档类型声明&#xff0c;在 w…

2024.4.6-day11-CSS 背景和精灵图

个人主页&#xff1a;学习前端的小z 个人专栏&#xff1a;HTML5和CSS3悦读 本专栏旨在分享记录每日学习的前端知识和学习笔记的归纳总结&#xff0c;欢迎大家在评论区交流讨论&#xff01; 文章目录 作业2024.4.6学习笔记1 背景2 背景图片3 CSS 精灵图 作业 <!DOCTYPE html&…

项目中 使用 spring cache redis 出现大量keys* 慢查询排查以及修复

前言 业务反馈 redis里有大量的慢查询 而且全是keys 的命令 排查 首先登录 阿里云查看redis的慢查询日志 如下 主要使用到redis cache的注解功能 分别是 CacheEvict 和 Cacheable 注意 CacheEvict 这个比较特殊 会进行驱逐缓存 说白就会删除缓存或者让缓存失效 第一时间想…

第十四届蓝桥杯省赛大学C组(C/C++)填充

原题链接&#xff1a;填充 有一个长度为 n 的 01 串&#xff0c;其中有一些位置标记为 ?&#xff0c;这些位置上可以任意填充 0 或者 1&#xff0c;请问如何填充这些位置使得这个 01 串中出现互不重叠的 0 和 1 子串最多&#xff0c;输出子串个数。 输入格式 输入一行包含一…

golang 数组和切片

区别 1.数组长度固定&#xff0c;切片长度可变 2.数组是深拷贝&#xff0c;切片是浅拷贝&#xff0c;切片是引用类型 扩容规则 不同版本不一样 https://www.jb51.net/article/280481.htm#_lab2_2_1 go1.18 1.如果期望容量大于当前容量的两倍就会使用期望容量&#xff1b; 2.如…

【保姆级教程】如何在 Windows 上实现和 Linux 子系统的端口映射

写在前面 上次分享【保姆级教程】Windows上安装Linux子系统&#xff0c;搞台虚拟机玩玩&#xff0c;向大家介绍了什么是虚拟机以及如何在Windows上安装Linux虚拟机。对于开发同学而言&#xff0c;经常遇到的一个问题是&#xff1a;很多情况下代码开发需要依赖 Linux 系统&…

基于单片机的风向风速传感器防冻装置设计

摘 要:高海拔地区冬季由于冻雨常会造成风向风速传感器被冻结,导致探测数据的缺测。基 于单片机的强大功能,文章设计制作了一种可对风向风速进行自动加热的防冻装置,整个装置 以单片机为核心控制器,主要包括单片机控制电路、继电器驱动电路、温度采集电路,电热丝控 制电路…

多线程代码设计模式之单例模式

目录 设计模式引入 饿汉模式 懒汉模式 单例模式总结 设计模式引入 1.1.什么是设计模式 &#xff08;1&#xff09;设计模式就是一种代码的套用模板。例如&#xff1a;一类题型的步骤分别有哪些&#xff0c;是可以直接套用的。 &#xff08;2&#xff09;像棋谱&#xff…

代码随想录算法训练营DAY17|C++二叉树Part.4|110.平衡二叉树、257.二叉树的所有路径、404.左叶子之和

文章目录 110.平衡二叉树思路伪代码CPP代码 257.二叉树的所有路径思路伪代码实现CPP代码 404.左叶子之和思路伪代码CPP代码 110.平衡二叉树 力扣题目链接 文章讲解&#xff1a;110.平衡二叉树 视频讲解&#xff1a;后序遍历求高度&#xff0c;高度判断是否平衡 | LeetCode&…

后端返回二进制,前段导出excel

axios({method: post,url: URL,responseType: blob,}).then(async res > {let blob new Blob([res.data], { type: application/vnd.ms-excel;charsetutf-8 });let href window.URL.createObjectURL(blob); //创建下载的链接const link document.createElement(a);link.h…