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

                        ✨✨✨专栏:数据结构     

          🧑‍🎓个人主页:SWsunlight

 不怕别人看不起,就怕自己不争气。路是人走出来的,关键要靠自己闯。振作起来,生活的含义就是前进。

目录

 一、顺序表的概念:

二、运算:

三、实现:

1、创建顺序表:

2、初始化:

3、扩容:

 4、尾插:

5、尾删:

7、头删:

8、指定位置插:

9、指定位置删 :

10、查找:

11、打印:

12、销毁:

​编辑 四、代码

SeqList.h头文件

SeqList.c源文件

test.c测试文件


 一、顺序表的概念:

定义:  是一种线性表(某一类具有相同特性的数据的集合)的存储结构,它用一组地址连续的存储单元依次存储线性表中的数据元素,使得逻辑上相邻的两个元素在物理位置上也相邻;

特点:

  1. 顺序表具有动态分配空间、支持随机访问和顺序访问,逻辑顺序与物理顺序一致。
  2. 每个元素可以都有唯一的位置,可以通过索引直接访问元素。
  3. 元素可以是任意类型,包括基本数据类型、结构体等。

分类:

  1. 静态顺续表(空间有限)
  2. 动态顺序表(可以申请空间,空间是动态的,按需申请)

二、运算:

  1. 初始化和销毁
  2. 增添数据,删除数据,查找数据,修改数据
  3. 遍历

三、实现:

1、创建顺序表:

动态顺序表的成员包括:数组(动态的),有效数据个数以及空间容量

用指针来接受动态内存开辟的空间;

2、初始化:

初始情况下:

3、扩容:

在初始情况下:空间是没有申请的,在放入数据前要先申请空间:

 4、尾插:

进来判断是否需要扩容,若是需要,则先扩容在插入值

5、尾删:

将最后一个元素删掉,有效个数-1即可

6、头插:

步骤大差不差,但是要给数组里面的数据全部后移一位,才能插入

7、头删:

比起尾删,要麻烦点,要将头元素后面的元素全部前移一位,直接将头元素覆盖掉

8、指定位置插:

多传一个参数,将pos传过来,就是要删除第几个元素,需要将pos后面的全部元素后移一位,腾出一个位置个pos的元素

9、指定位置删 :

将pos之后的数据前挪一下

10、查找:

遍历,返回下标即可

11、打印:

又是遍历

12、销毁:

直接对指针销毁即可,因为在动数据时,我们没有改变指针的地址,所以可以直接free掉

 四、代码

SeqList.h头文件

#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>typedef int SLDataType;typedef struct SeqList {SLDataType* arr;//存储的数据int size;//有效数据个数;int capacity;//空间容量(字节)}SL;//初始化结构表
void SLInit(SL* ps);
// 数据表的销毁
void SLDestroy(SL* ps);
//扩容:
void SLCheckCapacity(SL* ps);
//顺序表的打印: 
void SLPrint(SL ps);
//数据表的插入与删除;
//尾插:
void SLPushBack(SL* ps, SLDataType x);
//尾删
void SLPopBack(SL* ps);
//头插:
void SLPushFront(SL* ps, SLDataType x);
//头删:
void SLPopFront(SL* ps);
//指定位置插:
void SLInsert(SL* ps, int pos, SLDataType x);
//指定位置删:
void SLErase(SL* ps, int pos);
//查找:
int SLFind(SL* ps, SLDataType x);

SeqList.c源文件

#define _CRT_SECURE_NO_WARNINGS 3
#include"SeqLIst.h"
//初始化结构表
void SLInit(SL* ps)
{//空指针ps->arr = NULL;//数据和内容都为0ps->size = ps->capacity = 0;}
//数据表的销毁:将申请的动态内存销毁掉;
void SLDestroy(SL* ps) 
{if (ps->arr){free(ps->arr);}ps->arr = NULL;
}
//查找
int SLFind(SL* ps, SLDataType x)
{assert(ps);int i;for (i = 0; i < ps->size; i++){if (ps->arr[i] == x){//返回找到的下标return i;}}return -1;
}
//打印:
void SLPrint(SL ps)
{int i;for (i = 0; i < ps.size; i++){printf("%d\n", ps.arr[i]);}printf("数据个数:%d\n", ps.size);}
//扩容:
void SLCheckCapacity(SL* ps)
{//断言,防止顺序表传空指针assert(ps);//若是没有则先给定义一个:没有则申请4个空间int newcapacity = (ps->capacity == 0 ? 4 : 2 * (ps->capacity));//查看空间够不够:当空间大小与有效数据个数相同时。说明空间不够if (ps->capacity == ps->size){//要先申请空间:申请的内存为 容量*空间大小 SLDataType* pa = (SLDataType*)realloc(ps->arr, newcapacity * sizeof(SLDataType));//判断申请是否成功:if (pa == NULL){perror("realloc");return 1;}//成功了://将空间给arrps->arr = pa;//将改好的空间容量赋值给capacity;ps->capacity = newcapacity;}}
//头插:
void SLPushFront(SL* ps, SLDataType x)
{//先确定是否需要扩容;SLCheckCapacity(ps);//先将数据整体后移int i;for (i = ps->size; i > 0; i--){//前一个往后放置:ps->arr[i] = ps->arr[i - 1];}//尾插:ps->arr[0] = x;ps->size++;
}
//头删
void SLPopFront(SL* ps)
{assert(ps);assert(ps->arr);int i;for (i = 1; i < ps->size; i++)//(i=0;i<ps->size-1;i++){ps->arr[i - 1] = ps->arr[i];//(ps->arr[i] = ps->arr[i+1]);}ps->size--;
}
//尾插:
void SLPushBack(SL* ps, SLDataType x)
{//先确定是否需要扩容;SLCheckCapacity(ps);//插入数据:ps->arr[ps->size++] = x;}
//尾删:
void SLPopBack(SL* ps)
{//断言!防止传空指针!assert(ps);//防止数据为空!assert(ps->arr);//数据个数减一即可;ps->size--;
}
//指定位置插:pos为下标
void SLInsert(SL* ps, int pos, SLDataType x)
{assert(ps);//下标必须在[0,size);assert(pos >= 0 && pos < ps->size);SLCheckCapacity(ps);int i;for (i = ps->size; i > pos; i--){ps->arr[i] = ps->arr[i - 1];}ps->arr[pos] = x;ps->size++;
}
//指定位置删:
void SLErase(SL* ps, int pos)
{assert(ps);assert(pos >= 0 && pos < ps->size);int i;for (i = pos; i < ps->size-1; i++){//后往前摞ps->arr[i] = ps->arr[i + 1];}ps->size--;
}

test.c测试文件

#define _CRT_SECURE_NO_WARNINGS 3
#include"SeqList.h"//测试;
void SLest01()
{SL arr;//初始化:SLInit(&arr);//尾插:SLPushBack(&arr, 5);SLPushBack(&arr, 6);//头插:SLPushFront(&arr, 7);SLPushFront(&arr, 8);//打印,值传递即可!SLPrint(arr); //指定插入:SLInsert(&arr, 0, 99);//指定位置删SLErase(&arr, 0);//尾删://SLPopBack(&arr);//头删://SLPopFront(&arr);SLPrint(arr);int FInd = SLFind(&arr, 99);if (FInd < 0){printf("没找到");}else{printf("找到了!");}SLDestroy(&arr);}int main()
{SLest01();return 0;
}

你的三连就是对博主最大的支持!

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

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

相关文章

SQLite性能测试(插入)

最近一直在思考一个问题&#xff0c;SQLite 做到这么轻量级&#xff0c;那它注定不会像 MySql 一样强性能&#xff0c;那么它的性能怎么样呢&#xff1f;并发量多高呢&#xff1f; 官方解释&#xff1a; About SQLite 最大数据库大小&#xff1a;281TB 最大行大小&#xff1…

音视频--AAC编码解析和示例

目录 1&#xff1a;AAC编码介绍 2&#xff1a;AAC格式介绍 3&#xff1a;AAC -ADTS帧组成 4&#xff1a;AAC-ADTS&#xff1a;&#xff08;adts_fixed_header&#xff09;格式介绍 5&#xff1a;AAC-ADTS&#xff1a;&#xff08;adts_variable_header&#xff09;格式介绍…

C语言收尾 预处理相关知识

一. 预处理详解 1.1 预定义符号 FILE //进行编译的源文件LINE //文件当前的行号DATE //文件被编译的日期TIME //文件被编译的时间FUNCTION //文件当前所在的函数STDC //如果编译器遵循ANSI C标准&#xff0c;其值为1&#xff0c;否则未定义 这些预定义符号都是语言内置的 我们…

类和对象中篇

类的六个默认成员函数 如果一个类中什么成员都没有&#xff0c;简称为空类。空类中什么都没有吗&#xff1f;并不是的&#xff0c;任何一个类在我们不写的情况下&#xff0c;都会自动生成下面6个默认成员函数 ①初始化和清理&#xff1a;构造函数和析构函数 ②拷贝复制&#x…

Linux——信号量

什么是信号量&#xff1f; 信号量是用来用于同步和互斥的。其实就是一个计数器&#xff0c;进行PV操作&#xff0c;其中P操作就是让计数器–&#xff0c;V操作就是让计数器。 从物理上说明信号量的P、V操作的含义。 P(S)表示申请一个资源&#xff0c;S.value>0表示有资源可…

OBS插件--复合模糊

复合模糊 复合是一款滤镜插件&#xff0c;支持多种模糊类型和多种蒙版效果。支持模糊源的部分显示区域&#xff0c;可以反选区域进行模糊&#xff0c;这个功能对于场景部分区域需要遮盖非常实用。 下面截图演示下操作步骤&#xff1a; 首先&#xff0c;打开 OBS直播助手 在…

【Unity 鼠标输入检测】

Unity 鼠标输入检测 Unity提供了多种方法来检测和处理鼠标输入&#xff0c;允许开发者在游戏中实现对鼠标移动、点击和滚轮滚动的响应。以下是一些基本的鼠标输入检测方法&#xff1a; 1. Input.mousePosition 这个属性返回当前鼠标指针的屏幕坐标。坐标是以像素为单位的&…

【吊打面试官系列】Java高并发篇 - 同步方法和同步块,哪个是更好的选择?

大家好&#xff0c;我是锋哥。今天分享关于 【同步方法和同步块&#xff0c;哪个是更好的选择&#xff1f;】面试题&#xff0c;希望对大家有帮助&#xff1b; 同步方法和同步块&#xff0c;哪个是更好的选择&#xff1f; 同步块是更好的选择&#xff0c;因为它不会锁住整个对象…

临近空间相关概念

临近空间概念 距地 20KM-100KM 的临近空间位于内外层空间之中&#xff0c;也称为 超高空、近空间、亚轨道等。 特点就是&#xff1a;纵跨 非电离层和电离层、空气稀薄&#xff0c;存在 臭氧、紫外、辐射等特殊环境 存在 重力波、行星波、大气放电等特殊现象。 临近空间高速飞…

##15 探索高级数据增强技术以提高模型泛化能力

文章目录 前言数据增强的重要性常见的数据增强技术高级数据增强技术在PyTorch中实现数据增强结论 前言 在深度学习领域&#xff0c;数据增强是一种有效的技术&#xff0c;它可以通过在原始数据上应用一系列变换来生成新的训练样本&#xff0c;从而增加数据的多样性&#xff0c…

前端 | 易混词卡片切换

文章目录 &#x1f4da;实现效果&#x1f4da;模块实现解析&#x1f407;html&#x1f407;css&#x1f407;javascript &#x1f4da;实现效果 绘制单词卡片效果&#xff0c;实现点击左半部分上翻&#xff0c;点击右半部分下翻。 &#x1f4da;模块实现解析 &#x1f407;…

品鉴中的个人风格:如何形成自己与众不同的红酒品鉴体验

品鉴云仓酒庄雷盛红酒不仅是一种感官体验&#xff0c;更是一种个人风格的展现。每个人都有自己与众不同的品味和偏好&#xff0c;通过品鉴红酒&#xff0c;我们可以形成自己与众不同的红酒品鉴体验。 要形成自己与众不同的红酒品鉴体验&#xff0c;首先需要勇于尝试不同类型的红…

C++语法之在谈const与模版参数

最近一直在复习C的语法&#xff0c;感觉遇到了不少问题&#xff0c;或许是之前没想的这么深。废话不说&#xff0c;开始说正事。 一、再谈const 有些朋友可能有些疑问&#xff0c;不就是const吗&#xff1f;我知道&#xff0c;const可以给非const赋值&#xff0c;反过来不行&…

通过mvn archetype 创建一个spring boot start 工程

mvn archetype https://maven.apache.org/archetype/index.html 遇到的问题 对于想自定义一个spring-boot-start的同学,比如 Springboot自定义Starter启动器 整个过程很繁琐。 定义属性开关增加 spring boot test start插件定义自动装载 spring.factories or org.springfra…

javax.net.ssl.SSLException: Received fatal alert: protocol_version已经解决

起因&#xff1a; 在帮别人讲解项目时&#xff0c;将项目的tomcat配置完&#xff0c;点击运行后&#xff0c;报错&#xff0c;信息如标题。 解决办法&#xff1a; 在csdn百度问题&#xff0c;得到的方法主要有几个&#xff1a; 1.jdk要配置在1.8以上&#xff1b; 2.数据库地…

Stable Diffusion是什么?

目录 一、Stable Diffusion是什么&#xff1f; 二、Stable Diffusion的基本原理 三、Stable Diffusion有哪些运用领域&#xff1f; 一、Stable Diffusion是什么&#xff1f; Stable Diffusion是一个先进的人工智能图像生成模型&#xff0c;它能够根据文本描述创造出高质量的图…

信息检索(36):ConTextual Masked Auto-Encoder for Dense Passage Retrieval

ConTextual Masked Auto-Encoder for Dense Passage Retrieval 标题摘要1 引言2 相关工作3 方法3.1 初步&#xff1a;屏蔽自动编码3.2 CoT-MAE&#xff1a;上下文屏蔽自动编码器3.3 密集通道检索的微调 4 实验4.1 预训练4.2 微调4.3 主要结果 5 分析5.1 与蒸馏检索器的比较5.2 …

网络运维故障排错思路!!!!!(稳了!!!)

1 网络排错的必备条件 为什么要先讲必备条件&#xff1f;因为这里所讲的网络排错并不仅仅是停留在某一个小小命令的使用上&#xff0c;而是一套系统的方法&#xff0c;如果没有这些条件&#xff0c;我真的不能保证下面讲的这些你可以听得懂&#xff0c;并且能运用到实际当中&a…

Unity值类型和引用类型

我们都知道C#编程语言中&#xff0c;数据类型被分为了两种&#xff1a; 值类型引用类型 那么什么是值类型&#xff1f;什么是引用类型呢&#xff1f;它们的区别又是什么&#xff1f; 为了搞清楚这些问题&#xff0c;我们先列举一下我们开发中会碰到的值类型和引用类型。 常…

【AI+老照片焕新】母亲节用AI把时间的印记变成暖心礼物

想念是一张泛黄的照片&#xff0c;藏在抽屉里的笑容&#xff0c;总是那么亲切。今天是母亲节&#xff0c;是不是想给妈妈来点不一样的惊喜&#xff1f;用AI技术&#xff0c;把那些老照片瞬间焕新&#xff0c;让妈妈的青春记忆重放光华&#xff01; 想象一下&#xff0c;妈妈年…