C语言之 顺序表(sequence chart)

news2024/11/15 13:53:53

 线性表

线性表是n个具有相同特性的数据元素的有限序列。

常见的有:顺序表、链表、栈、队列、字符串....

线性表在逻辑上是线性结构的,即一条连续的直线

但在物理结构上不一定是连续的,其在物理存储时,通常以数组和链式结构的形式存储


顺序表

使用一段地址连续的存储单元依次存储数据元素的线性结构

ps:顺序表就是数组,但在数组基础上,要求数据从头开始且连续存储,不能跳跃或间隔


顺序表存在的缺陷:

1.空间不够需要扩容,而扩容会付出一定代价

①原地扩容:
在这里插入图片描述
还是原地址,代价低,至少不需要拷贝原数据
②异地扩容:
在这里插入图片描述
已经改变

2.避免频繁扩容:平常空间满了扩2倍,可能会导致一定的空间浪费
如100->200,但实际我们只需要120个空间,浪费80个

3.要求数据从头开始连续存储,那么我们在头部或中间位置插入数据需要挪动数据,效率低

优点:

1.支持随机访问
2.对于有些算法,需要结构支持随机访问,如二分查找,优化后的快排等


下面直接创建顺序表

SeqList.h 头文件

  1、静态顺序表

#define N 1000
typedef int SLDataType;    // 以后需要存储不同类型的数据,可以直接修改

typedef struct SeqList
{
    SLDataType a[N];
    int size; // 表示数组中存储了多少个数据
}SL;

//    接口函数 - 函数名是根据STL风格
void SeqListInit(SL* ps);    //    初始化数组
//    静态:容量给小则不够用,给大则浪费空间
void SeqListPushBack(SL* ps, SLDataType x);    //尾插
void SeqListPopBack(SL* ps);                //尾删
void SeqListPushFront(SL* ps, SLDataType x);//头插
void SeqListPopFront(SL* ps);                //头删

2、动态顺序表

typedef int SLDataType;    

//    动态顺序表
typedef struct SeqList
{
    SLDataType* a;
    int size; 
    int capacity;    // 数组实际能存储的空间容量是多少个
}SL;


void SeqListInit(SL *ps);    // 形参 是实参的临时拷贝,不会影响实参 - 传值操作
    //           所以传地址
void SeqListPushBack(SL* ps, SLDataType x);    
void SeqListPopBack(SL* ps);                
void SeqListPushFront(SL* ps, SLDataType x);
void SeqListPopFront(SL* ps);               

SeqList.c源文件
```

#pragma once
#include "SeqList.h"

void SeqListInit(SL*ps)
{
    ps->a = NULL;
    ps->size = ps->capacity = 0;
}
void SeqListPushBack(SL* ps, SLDataType x)
{
    //  如果没有空间(0个)或空间不足(满了)
    if (ps->size == ps->capacity)
    {
        int newcapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;
        //  三目操作符 是否等于0,是给4,否则给2倍原空间
        SLDataType* tmp = (SLDataType * )realloc(ps->a, sizeof(SLDataType) * newcapacity);
        //    开辟空间
        if (tmp == NULL)
        {
            printf("realloc fail\n");
            exit(-1);
        }
        ps->a = tmp;    //    开辟的空间给结构体
        ps->capacity = newcapacity;// 开辟的大小给原大小
    }
    ps->a[ps->size] = x; // 要传的值给结构体
    ps->size++;
}

void SeqListPushBack(SL* ps, SLDataType x);
void SeqListPopBack(SL* ps);
void SeqListPushFront(SL* ps, SLDataType x);
void SeqListPopFront(SL* ps);

Source.c文件

#include"SeqList.h"

void TestSeqList1() 
{
    SL sl;
    SeqListInit(&sl);
}
int main()
{
    TestSeqList1();
    return 0;
}

注意:传结构体不能传值,必须传址,否则无法修改里面内容(形参是实参的临时拷贝,形参的改变不影响实参)


接下来逐个实现接口函数:

①尾删数据

在这里插入图片描述注意此处,未加判断条件,size–将可以为负值(-1,-2…)
在这里插入图片描述
而在–负数后,再增加数据,会造成越界访问
在这里插入图片描述
在这里插入图片描述
在销毁时会报错

纵上

在这里插入图片描述
法1:加上判断条件,空间大于0才可–
法2:断言,小于等于0直接报错


②头插数据

在这里插入图片描述
数据向挪动,空出前面的位置
在这里插入图片描述
同尾删数据,未判断大小,若添加数据过多大于有效空间大小,将造成越界访问,报错
在这里插入图片描述
在这里插入图片描述
多处用到扩容,这里直接封装成函数
在这里插入图片描述
在这里插入图片描述
若空间满了扩容


③头删数据

和尾插数据类似
第二个数据开始一个一个放上去
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

观察者模式解读

目录 问题引进 天气预报项目需求 天气预报设计方案 1-普通方案 传统方式代码实现 观察者模式原理 观察者模式解决天气预报需求 代码实现 观察者模式的好处 问题引进 天气预报项目需求 1) 气象站可以将每天测量到的温度,湿度,气压等等以公告的形式…

idm下载器是免费的吗?有哪些功能

对于PC用户来说,拥有一款好用和快速的下载工具,对我们来说至关重要,可以极大提高我们的工作效率和PC用户体验。IDM可以实现高速下载,其核心原理就是多线程下载,理论上可以达到带宽的峰值速度,深受用户的喜爱…

Python单向链表操作

目录 一、单向链表 单向链表示例图 二、单向链表的操作 1、判断链表是否为空 2,链表长度 3,遍历整个链表 4,在链表头部添加元素 5、链表尾部添加元素 6,在指定位置插入元素 7,修改指定位置的元素 8&#xff…

可视化Echarts中title、tooltip、legend、grid属性的常用设置

title中常用的设置 配置项--tooltip ​编辑 配置项--legend 配置项--grid title中常用的设置 title 标题组件,包含主标题和副标题。 以下是常用的对标题的设置 title:{//设置图表的标题text:"主标题",link:"baidu.com", //设置标题超链接…

详解C语言string.h中常见的14个库函数(三)

本篇博客继续讲解C语言string.h头文件中的库函数。本篇博客计划讲解3个函数,分别是:strstr, strtok, strerror。其中strstr函数我会用一种最简单的方式模拟实现。 strstr char * strstr ( const char * str1, const char * str2 );strstr可以在str1中查…

用yolov5+playwright过滑动验证码

目录 梳理思路 训练模型 编写代码 总结与提高 源码下载 在上一节,我们通过opencv-pythonplaywright成功过掉了QQ空间的滑动验证码。在本节,我们将使用yolov5playwright来实现相同效果。 注:因为yolov5的配置教程网上已经很多了&#xff…

C++初阶之函数重载

目录 前言 函数重载 1.函数重载的概念 2.C支持函数重载的原理--名字修饰(name Mangling) 前言 今天小编给大家带来的是C中关于函数重载的内容,和C语言不一样,函数重载是C语言特有的,那么该功能实现的底层原理是什么呢?请大家…

Idea配置maven,指定settings.xml文件不生效

一.简介 最近单位要求把项目的仓库配置从阿里云改为nexus私服,配置了一个settings-nexus.xml的配置文件,idea的maven配置指定了该settings-nexus.xml文件,发现走的还是阿里云的,新的settings-nexus.xml竟然不生效,依赖…

分支和循环语句(1)

文章目录 目录1. 什么是语句2. 分支语句(选择结构)2.1 if语句2.1.1 悬空else2.1.2 if书写形式的对比2.1.3 练习 2.2 switch语句2.2.1 在switch语句中的 break2.2.2 default子句2.2.3 练习 3. 循环语句3.1 while循环3.1.1 while语句中的break和continue 附…

记一次fastjson反序列化到内网靶标

声明:文中涉及到的技术和工具,仅供学习使用,禁止从事任何非法活动,如因此造成的直接或间接损失,均由使用者自行承担责任。 点点关注不迷路,每周不定时持续分享各种干货。 众亦信安,中意你啊&a…

多种方法解决This is usually caused by another repository pushing to the same ref的错误

文章目录 1. 复现错误2. 分析错误3. 解决错误4. 解决该错误的其他方法 1. 复现错误 今天使用git status查看文件状态,发现有一个文件未提交,如下代码所示: D:\project\test>git status On branch master Your branch is up to date with …

sftp常用命令介绍

sftp常用命令: 1. sftp 登录sftp服务器 sftp userip ​​​​​​ 如需要看全部命令:则使用help即可 2. pwd和lpwd 、 ls和lls 、cd和lcd 等 sftp登录之后默认操作是远程服务器,当需要操作本地时,就需要在前边加“l”&#…

【wpf踩坑日记】搞错了,眼睛问题(:))

背景 今天遇到一个草鸡奇葩的问题: ComboBox 选择时 没有触发绑定的属性的set。 其实看错了,Mode写出OneWay,应该是TowWay。 不然是会触发set的。兄弟们不用往下看了。。。。。 哎,有的时候就会碰到这种情况,我还…

Ubuntu上跑通PaddleOCR

书接上文。刚才说到我已经在NUC8里灌上了Windows Server 2019。接下来也顺利的启用了Hyper-V角色并装好了一台Ubuntu 22.04 LTS 的虚机。由于自从上回在树莓派上跑通了Paddle-Lite-Demo之后想再研究一下PaddleOCR但进展不顺,因此决定先不折腾了,还是从x6…

python常见问题总结

对于长期深耕在python爬虫的程序员来说,如何快速解决代码中的问题它是作为合格的程序员应该具备的基本素质。下面将我总结整理出有关python的一些常见问题记录下来方便后期查证。 Python python 没有多态,而是鸭子类型 多继承,没有接口&…

【操作系统】CPU 缓存一致性

【操作系统】CPU 缓存一致性、MESI 协议 参考资料: CPU缓存一致性协议(MESI) 【JUC】Java并发机制的底层实现原理 CPU 缓存一致性 文章目录 【操作系统】CPU 缓存一致性、MESI 协议CPU Cache 的数据写入写直达写回 缓存一致性问题总线嗅探MESI 协议总结 CPU Cache …

springboot:缓存不止redis,学会使用本地缓存ehcache

0. 引言 随着redis的普及,更多的同学对redis分布式缓存更加熟悉,但在一些实际场景中,其实并不需要用到redis,使用更加简单的本地缓存即可实现我们的缓存需求。 今天,我们一起来看看本地缓存组件ehcache 1. ehcache简…

python+vue 市政工程资源互助平台的设计与实现

该系统将由用户系统,管理员系统两部分组成。用户有个人和vip两种类型。 用户模块包括登录注册功能,登录字段包括用户名,密码,用户身份以及验证码。注册包括用户名,密码,邮箱,电话号码&#xff0…

vite+vue+element-plus完成一个admin管理后台

整体项目的 访问链接:https://bigmiss.top/demo/index.html 用到的技术整理 名称版本安装命令说明vite4.0.0npm init vitelatest构建Vue项目vue3.2.45npm install vuenext渐进式框架(在vite已安装)element-plus3.7.5npm install element-plu…

C#调用C++封装的SDK库(dll动态库)——下

C#调用C封装的SDK库(dll动态库)——下 一、说明 上一篇我们相当于封装的是C语言风格的动态dll库,供C#来调用的。 C#调用C封装的SDK库(dll动态库)——上 如果我们要封装的是下面的类呢?我们该怎么办?大家先思考下。 class Calculation { p…