数据结构(初阶2.顺序表)

文章目录

一、线性表

二、顺序表

 2.1 概念和结构

 2.2 分类

    2.2.1 静态顺序表

    2.2.2 动态顺序表

 2.3动态顺序表的实现

  1.SeqList.h

  2.SeqList.c

    打印顺序表

    初始化

    销毁

    增容

    尾插

    头插

    在指定位置之前插入数据

    尾删

    头删

    在指定位置删除数据

  3.test.c


一、线性表

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

二、顺序表

2.1 概念和结构

概念:顺序表是⽤⼀段物理地址连续的存储单元依次存储数据元素的线性结构,⼀般情况下采⽤数组存储。
那么数组和顺序表的区别是什么?
下面可以进行一个很形象的类比:
  • 顺序表是对数组进行封装:结构体
  • 定义已经知道数组的大小:    int arr【3】= {1,2,3};
  • 定义未知道数组的大小:        int*arr;

2.2 分类

2.2.1 静态顺序表

上图中可以发现我们重新定义了 typedef int SLDataType,为什么?

比如当我们在测试代码中有 100000行代码,1000+会定义整型变量 int,当要把这 1000+ 的代码部分改成 char 类型时,如果逐个将这些代码找出一句句修改会非常麻烦而且工作量巨大;             

而当 typedef int SLDataType之后 ,我们只需将其改成 typedef char SLDataType ,遍能一键替换为 char 或者想要修改的位置。

2.2.2 动态顺序表

2.3动态顺序表的实现

(注意:1.当我们每实现一个方法之后须测试一下,切记写完所有方法才测试,避免出现差错;

             2.在调用过程中分清传值和传址的区别;

                传值:形参是实参的值的拷贝,实参和形参指向的是两块不同的地址,但保存的数据是一样的

                传址:形参指向的是实参指向的地址) 

1.SeqList.h

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>//定义动态顺序表结构
typedef int SLDatatype;typedef struct SeqList {SLDatatype* arr;int capacity; //空间大小int size;     //有效数据个数
}SL;//typedef struct SeqList SL;//初始化
void SLInit(SL* ps);
//销毁
void SLDestroy(SL* ps);//打印顺序表
void SLPrint(SL* ps);//插入数据
void SLPushBack(SL* ps, SLDatatype x);
void SLPushFront(SL* ps, SLDatatype x);//删除
void SLPopBack(SL* ps);
void SLPopFront(SL* ps);//在指定位置之前插入数据
void SLInsert(SL* ps, SLDatatype x, int pos);
//删除指定位置的数据
void SLErase(SL* ps, int pos);

2.SeqList.c 

  • 打印顺序表
void SLPrint(SL* ps)
{for (int i = 0; i < ps->size; i++){printf("%d ", ps->arr[i]);}printf("\n");
}
  • 初始化  
void SLInit(SL* ps)
{ps->arr = NULL;ps->size = ps->capacity = 0;
}
  • 销毁
void SLDestory(SL* ps)
{if (ps->arr != NULL){free(ps->arr);}ps->arr = NULL;ps->size = ps->capacity = 0;
}
  •  增容

当size == capacity 时,说明顺序表满了,空间不足,先增容,再插入;

增容一般是成倍数的增加(增容的操作本身就有一定的程序性能的消耗,若频繁的增容会导致程序效率底下),所以 ”一次增容一个就没有空间浪费“ 这种说法是错误的。 

增容分两种情况: 1.连续空间足够,直接扩容 

                              2.连续空间不够,1)重新找一块地址,分配足够的内存 

                                                          2)拷贝数据到新的地址 

                                                          3)销毁旧地址 

void SLCheckCapacity(SL* ps)
{//判断空间是否充足if (ps->size = ps->capacity){//增容//0*2 = 0//若capacity为0,给个默认值,否则×2倍int newCapacity = ps->arr == 0 ? 4 : 2 * ps->capacity;SLDatatype* tmp = (SLDatatype*)realloc(ps->arr, newCapacity * sizeof(SLDatatype));if (tmp = NULL){perror("realloc fail!");exit(1);}ps->arr = tmp;ps->capacity = newCapacity;}
}
  • 尾插 

空间充足:将数据插入 size 指向的位置,size++;

void SLPushBack(SL* ps, SLDatatype x)
{assert(ps);//等价于assert(ps != NULL)SLCheckCapacity(ps);ps->arr[ps->size] = x;ps->size++;
}
  • 头插
void SLPushFront(SL* ps, SLDatatype x)
{assert(ps);//判断空间是否足够SLCheckCapacity(ps);//整体数据往后移一位,从后往前移for (int i = ps->size;i >0; i--){ps->arr[i] = ps->arr[i - 1];}//将数据插入下标为0的位置ps->arr[0] = x;
}
  • 在指定位置之前插入数据
void SLInsert(SL* ps, SLDatatype x, int pos)
{assert(ps);assert(pos >= 0 && pos <= ps->size);//       头插          尾插 //pos及以后的数据整体向后移动一位,从后往前移,与头插的方法类似for (int i =ps->size ; i>pos; i--){ps->arr[i] = ps->arr[i - 1];}//将数据插入下标为pos的位置ps->arr[pos] = x;ps->size++; //不要忘记这一步
}
  • 尾删
void SLPopBack(SL* ps)
{assert(ps);assert(ps->size);//顺序表为空,不可删除ps->size--;
}
  • 头删
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 SLDelete(SL* ps, int pos)
{assert(ps);assert(ps->size);//顺序表为空,不可删除assert(pos >= 0 && pos < ps->size);//       头删          尾删 //pos及以后的数据整体向前移动一位,从前往后移,与SLInsert的方法类似for (int i = pos; i < ps->size-1; i++){ps->arr[i] = ps->arr[i + 1];}ps->size--;
}

 3.test.c

#include "SeqList.h"void SLtest01()
{SL s;SLInit(&s);SLPushBack(&s, 1);SLPushBack(&s, 2);SLPushBack(&s, 3);SLPushBack(&s, 10);SLPushBack(&s, 11);SLPushBack(&s, 12);printf("尾插后的数据:");SLPrint(&s);printf("头插后的数据:");SLPushFront(&s, 4);SLPrint(&s);printf("在下标为2的位置插入9后的数据:");SLInsert(&s, 9, 2);SLPrint(&s);printf("尾删后的数据:");SLPopBack(&s);SLPrint(&s);printf("头插后的数据:");SLPopFront(&s);SLPrint(&s);printf("删除下标为3的数据:");SLDelete(&s, 3);SLPrint(&s);SLDestroy(&s);
}int main()
{SLtest01();	return 0;
}

未完待续~~

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

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

相关文章

git安装使用gitlab

第一步&#xff1a;下载git 第二步&#xff1a;安装 第三步&#xff1a;配置sshkey 第四步&#xff1a;处理两台电脑的sshkey问题 第一步下载git 网址&#xff1a;Git点Downloads根据你的操作系统选择对应的版本&#xff0c;我的是Windows&#xff0c;所以我选择了Windows …

Java的高级特性

类的继承 继承是从已有的类中派生出新的类&#xff0c;新的类能拥有已有类的属性和行为&#xff0c;并且可以拓展新的属性和行为 public class 子类 extends 父类{子类类体 } 优点 代码的复用 提高编码效率 易于维护 使类与类产生关联&#xff0c;是多态的前提 缺点 类缺乏独…

计算机图形学入门28:相机、透镜和光场

1.前言 相机(Cameras)、透镜(Lenses)和光场(Light Fields)都是图形学中重要的组成部分。在之前的学习中&#xff0c;都是默认它们的存在&#xff0c;所以现在也需要单独拿出来学习下。 2.成像方法 计算机图形学有两种成像方法&#xff0c;即合成(Synthesis)和捕捉(Capture)。前…

JVM:类加载器

文章目录 一、什么是类加载器二、类加载器的应用场景三、类加载器的分类1、分类2、启动类加载器3、Java中的默认类加载器&#xff08;1&#xff09;扩展类加载器&#xff08;2&#xff09;应用程序类加载器&#xff08;3&#xff09;arthas中类加载器相关的功能 四、双亲委派机…

78. UE5 RPG 创建技能数据并初始化技能ui

在上一篇文章里&#xff0c;我们创建了技能的UI&#xff0c;接下来&#xff0c;我们要考虑如何实现对技能UI的填充&#xff0c;肯定不能直接写死&#xff0c;需要有一些方法去实现技能的更新。我们期望能够创建一个技能数据&#xff0c;然后根据数据通过回调的方式实现数据的更…

【经典面试题】是否形成有环链表

1.环形链表oj 2. oj解法 利用快慢指针&#xff1a; /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/typedef struct ListNode ListNode; bool hasCycle(struct ListNode *head) {ListNode* slow head, *fast…

UNIAPP_ReferenceError: TextEncoder is not defined 解决

错误信息 1、安装text-decoding npm install text-decoding2、main.js import { TextEncoder, TextDecoder } from text-decoding global.TextEncoder TextEncoder global.TextDecoder TextDecoder

【网络安全】Oracle:SSRF获取元数据

未经许可&#xff0c;不得转载。 文章目录 前言正文漏洞利用 前言 Acme 是一家广受欢迎的播客托管公司&#xff0c;拥有庞大的客户群体。与许多大型运营公司一样&#xff0c;Acme 采用了Apiary的服务&#xff0c;使用户能够安全高效地管理他们的播客。 Apiary 于2017年初被Or…

Java SpringBoot 若依 后端实现评论“盖楼“,“楼中楼“功能 递归查询递归组装评论结构

效果图 数据库设计 还可以使用路径模块 一级评论id,二级评论id, 用like最左匹配原则查询子评论 因为接手遗留代码&#xff0c;需要添加字段&#xff0c;改动数据库&#xff0c;我就不改动了&#xff0c;导致我下面递归查询子评论不是很好。 业务代码 Overridepublic List<S…

OpenCV漫水填充函数floodFill函数的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 功能描述 ffloodFill函数是OpenCV库中用于图像处理的一个功能&#xff0c;它用于填充与种子点颜色相近的连通区域。这个函数在很多场景下都非常有用&#x…

电子电气架构 --- 关于DoIP的一些闲思 上

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明自己,无利益不试图说服别人,是精神上的节…

上传图片,base64改为文件流,并转给后端

需求&#xff1a; html代码&#xff1a; <el-dialog v-model"dialogPicVisible" title"新增图片" width"500"><el-form :model"picForm"><el-form-item label"图片名称&#xff1a;" :label-width"10…

【数组、特殊矩阵的压缩存储】

目录 一、数组1.1、一维数组1.1.1 、一维数组的定义方式1.1.2、一维数组的数组名 1.2、二维数组1.2.1、二维数组的定义方式1.2.2、二维数组的数组名 二、对称矩阵的压缩存储三、三角矩阵的压缩存储四、三对角矩阵的压缩存储五、稀疏矩阵的压缩存储 一、数组 概述&#xff1a;数…

基于Vue和UCharts的前端组件化开发:实现高效、可维护的词云图与进度条组件

基于Vue和UCharts的前端组件化开发&#xff1a;实现高效、可维护的词云图与进度条组件 摘要 随着前端技术的迅速发展和业务场景的日益复杂&#xff0c;传统的整块应用开发方式已无法满足现代开发的需求。组件化开发作为一种有效的解决方案&#xff0c;能够将系统拆分为独立、…

SpringCoud组件

一、使用SpringCloudAlibaba <dependencyManagement><dependencies><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>2023.0.1.0</version><…

纯净IP的重要性解析与测评分析

作为连接互联网世界的桥梁&#xff0c;IP地址的纯净度不仅关乎网络访问的速度与稳定性&#xff0c;更是影响着数据安全与隐私保护。今天&#xff0c;我们将带您深入探索纯净IP的重要性&#xff0c;并分享我们对芝麻HTTP与巨量IP这两家提供纯净SOCKS5代理服务的深度测评分析。 一…

ESP32的I2S引脚及支持的音频标准使用说明

ESP32 I2S 接口 ESP32 有 2 个标准 I2S 接口。这 2 个接口可以以主机或从机模式&#xff0c;在全双工或半双工模式下工作&#xff0c;并且可被配置为 8/16/32/48/64-bit 的输入输出通道&#xff0c;支持频率从 10 kHz 到 40 MHz 的 BCK 时钟。当 1 个或 2 个 被配置为主机模式…

AWS-WAF-Log S3存放,通过Athena查看

1.创建好waf-cdn 并且设置好规则和log存储方式为s3 2. Amazon Athena 服务 使用 &#xff08;注意s3桶位置相同得区域&#xff09; https://docs.aws.amazon.com/zh_cn/athena/latest/ug/waf-logs.html#waf-example-count-matched-ip-addresses 官方文档参考,建一个分区查询表…

自定义波形图View,LayoutInflater动态加载控件保存为本地图片

效果图&#xff1a; 页面布局&#xff1a; <?xml version"1.0" encoding"utf-8"?><LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"xmlns:tools"http://schemas.android.com/tools"android:la…

硬盘模式vmd怎么改ahci_电脑vmd改ahci模式详细步骤

最近有很多网友问&#xff0c;我新买的电脑安装原版win10或win11找不到驱动器呀&#xff0c;进入第三方pe又找不到硬盘&#xff0c;找到硬盘安装后又出现安装蓝屏的情况&#xff0c;新机器怎么回事呀&#xff1f;这位网友内心有点崩溃&#xff0c;不知道啥原因。其实这些都是由…