[C/C++]数据结构----顺序表的实现(增删查改)

news/2023/11/30 11:59:18

概念

        顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储,在数组上完成数据的增删改查.

一般顺序表可以分为两种结构: 

1.静态顺序表:采用定长数组存储元素

#define N 7
typedef int SLDataType;
typedef struct SeqList
{SLDataType arr[N];  //定长数组int size;           //有效数据的个数
}SeqList;

 2.动态顺序表:使用动态开辟的数组存储

typedef int SLDataType;
typedef struct SeqList
{SLDataType* arr;  //指向动态开辟的数组int size;		  //有效数据个数int capacity;	  //容量空间大小
}SeqList;

     由于静态顺序表只适用于确定知道需要多少数据的场景,如果静态顺序表的定长数组N定大了,就会造成空间浪费,如果N定小了, 空间又不够用.所以现实中通常都是使用动态顺序表,按需开辟空间.

接口及实现

typedef int SLDateType;
typedef struct SeqList
{SLDateType* a;int size;int capacity;
}SeqList;// 对数据的管理:增删查改 
void SeqListInit(SeqList* ps);
void SeqListDestroy(SeqList* ps);void SeqListPrint(SeqList* ps);
void SeqListPushBack(SeqList* ps, SLDateType x);
void SeqListPushFront(SeqList* ps, SLDateType x);
void SeqListPopFront(SeqList* ps);
void SeqListPopBack(SeqList* ps);// 顺序表查找
int SeqListFind(SeqList* ps, SLDateType x);
// 顺序表在pos位置插入x
void SeqListInsert(SeqList* ps, int pos, SLDateType x);
// 顺序表删除pos位置的值
void SeqListErase(SeqList* ps, int pos);

1. 顺序表初始化

        在进行操作前,先断言一下传过来的指针是否为空,若为空则会在终端提示错误信息,要注意使用asssert(),需要包含头文件assert.h

void SeqListInit(SeqList* ps)
{assert(ps);ps->a = NULL;ps->size = 0;ps->capacity = 0;
}

   2.打印顺序表

        同样先检查指针是否为空,在遍历顺序表进行打印

void SeqListPrint(SeqList* ps)
{assert(ps);for (int i = 0; i < ps->size; i++){printf("%d ", ps->a[i]);}printf("\n");
}

3.顺序表的摧毁

        如果传过来的顺序表本身就是空指针,说明顺序表就不存在,不需要进行其他操作.若指针不为空,就把其定长数组指向空,把有效数据个数和容量赋值为0

void SeqListDestroy(SeqList* ps)
{assert(ps);if (ps->a != NULL){free(ps->a);ps->a = NULL;ps->size = 0;ps->capacity = 0;}
}

4.顺序表尾插

        在进行插入操纵前,需要判断一下顺序表的有效数据个数是否大于等于已开辟的容量,如果小于的话,直接尾插即可,如果大于等于容量的话,就需要先进行扩容操作,再尾插,为了使代码更加简洁明了,可以把扩容操作单独封装成一个函数

void SeqListPushBack(SeqList* ps, SLDataType x)
{assert(ps);CheckCapacity(ps);ps->a[ps->size] = x;ps->size++;
}

扩容函数:

        如果size==capacity的话就要进行扩容,我们规定每次扩容二倍.由于我们在初始化顺序表时将容量定为0,如果是第一次扩容的话,我们需要先给其扩容一个固定的大小,以后的扩容直接在这个容量上扩大二倍即可.

void CheckCapacity(SeqList* ps)
{assert(ps);if (ps->size == ps->capacity){int newcapacity = ps->capacity == 0 ? 4 : ps->capacity*2;SLDataType* ret = (SLDataType*)realloc(ps->a, newcapacity* sizeof(SLDataType));if (ret == NULL)   //检查是否开辟成功{perror("realloc");    //如果不成功就打印开辟错误信息并返回return;}else{ps->a = ret;ps->capacity = newcapacity;   //更新容量大小}}}

5.顺序表头插

因为要在数组头部插入数据,所以需要把头部腾出一个位置,这就需要将所有数据向后移动一个单位

void SeqListPushFront(SeqList* ps, SLDataType x)
{assert(ps);CheckCapacity(ps);int end = ps->size - 1;while (end >= 0){ps->a[end + 1] = ps->a[end];end--;}ps->a[0] = x;ps->size++;
}

6.顺序表头删

void SeqListPopFront(SeqList* ps) //头删
{assert(ps);for (int i = 1; i < ps->size; i++){ps->a[i - 1] = ps->a[i];}ps->size--;
}

7.顺序表尾删

void SeqListPopBack(SeqList* ps)
{assert(ps);if (ps->size > 0){ps->size--;}
}

8.顺序表查找

int SeqListFind(SeqList* ps, SLDataType x)
{assert(ps);for (int i = 0; i < ps->size; i++){if (ps->a[i] == x){return i;}}printf("未找到\n");return - 1;
}

9.顺序表在pos位置插入x

void SeqListInsert(SeqList* ps, int pos, SLDataType x)
{assert(ps);assert(pos >= 0 && pos <= ps->size);for (int i = ps->size; i > pos; i--){ps->a[i] = ps->a[i - 1];}ps->a[pos] = x;ps->size++;
}

10.顺序表删除pos位置元素

void SeqListDelete(SeqList* ps, int pos)
{assert(ps);assert(pos >= 0 && pos < ps->size);int begin = pos + 1;while (begin < ps->size){ps->a[begin - 1] = ps->a[begin];begin++;}ps->size--;
}


http://www.ppmy.cn/news/1222296.html

相关文章

【Python基础篇】运算符

博主&#xff1a;&#x1f44d;不许代码码上红 欢迎&#xff1a;&#x1f40b;点赞、收藏、关注、评论。 格言&#xff1a; 大鹏一日同风起&#xff0c;扶摇直上九万里。 文章目录 一 Python中的运算符二 算术运算符1 Python所有算术运算符的说明2 Python算术运算符的所有操作…

2023年09月 Python(六级)真题解析#中国电子学会#全国青少年软件编程等级考试

Python等级考试(1~6级)全部真题・点这里 一、单选题(共25题,每题2分,共50分) 第1题 以下选项中,不是tkinter变量类型的是?( ) A: IntVar() B: StringVar() C: DoubleVar() D: FloatVar() 答案:D tkinter 无 FloatVar()变量类型。 第2题 关于tkinter,以下说…

优秀智慧园区案例 - 北京当代MOMA低碳智慧园区,先进智慧园区建设方案经验

一、项目背景 北京当代MOMA低碳智慧园区位于东直门迎宾道北侧&#xff0c;建于2005年&#xff0c;总建面22万平方米&#xff0c;包含住宅、商业、教育、餐饮等多种业态&#xff0c;是著名建筑师Steven Holl的作品&#xff0c;是一个包含居住、工作、休闲娱乐、交通等复合功能的…

微服务实战系列之Sentinel

前言 微服务架构&#xff08;Microservice Architecture&#xff09;是一种架构概念&#xff0c;旨在通过将功能分解到各个离散的服务中以实现对解决方案的解耦。 近年来&#xff0c;微服务已赫然崛起于IT界&#xff0c;越来越多的程序员不得不向之靠拢。也正因为各行各业都愿为…

代码随想录算法训练营第二十四天| 77 组合

目录 77 组合 暴力 减枝优化 77 组合 暴力 class Solution {List<List<Integer>>res new ArrayList<>();LinkedList<Integer>newList new LinkedList<>();public List<List<Integer>> combine(int n, int k) {dfs(n,k,1);r…

spark性能调优 | 内存优化

目录 我们先了解一下有哪些内存温馨提示RDD示范(spark版本2.1.1)RDD进行优化Df和Ds进行示范 我们先了解一下有哪些内存 1.storage内存 存储数据&#xff0c;缓存 可预估2.shuffle内存 计算join groupby 不可预估spark1.6之前 静态管理的&#xff0c;spark1.6之…

Maven 之 settings.xml文件详解

目录 一. 前言 二. settings.xml 文件详解 2.1. 配置节点详解 2.2. 实例详解 三. mirrorOf 详解 一. 前言 Maven是一个流行的Java项目构建工具&#xff0c;它使用pom.xml文件来定义项目的配置和依赖关系。然而&#xff0c;Maven还提供了另一个重要的文件——setting.xml文…

【计算机网络笔记】网络地址转换(NAT)

系列文章目录 什么是计算机网络&#xff1f; 什么是网络协议&#xff1f; 计算机网络的结构 数据交换之电路交换 数据交换之报文交换和分组交换 分组交换 vs 电路交换 计算机网络性能&#xff08;1&#xff09;——速率、带宽、延迟 计算机网络性能&#xff08;2&#xff09;…

React组件在什么情况下会重新渲染

当我们使用React编写组件时&#xff0c;组件的重新渲染是一个重要的概念。重新渲染是指React组件在特定情况下会重新执行其渲染函数&#xff0c;更新用户界面以反映最新的数据。很多情况下&#xff0c;组件不必要的重新渲染会严重影响性能&#xff0c;所以要充分了解触发组件重…

在市场发展中寻变革,马上消费金融树行业发展“风向标”

11月11日&#xff0c;2023金融街论坛年会第三届全球金融科技大会“金融科技创新与合规安全”平行论坛在北京召开。会上&#xff0c;马上消费金融副总经理孙磊就数据对金融的赋能作用、数据安全治理等方面展开了深度讨论。 公开信息显示&#xff0c;马上消费金融是一家经中国银保…

决策树,sql考题,30个经典sql题目

大数据&#xff1a; 2022找工作是学历、能力和运气的超强结合体&#xff0c;遇到寒冬&#xff0c;大厂不招人&#xff0c;可能很多算法学生都得去找开发&#xff0c;测开 测开的话&#xff0c;你就得学数据库&#xff0c;sql&#xff0c;oracle&#xff0c;尤其sql要学&#x…

GO语言的由来与发展历程

Go语言&#xff0c;也称为Golang&#xff0c;是由Google公司的Robert Griesemer、Ken Thompson和Rob Pike三个大牛于2007年开始设计发明&#xff0c;并于2009年正式对外发布的开源编程语言。 三名初始人的目标是设计一种适应网络和多核时代的C语言&#xff0c;Go语言从C继承了…

JavaWeb-JavaWeb中的I/O(输入/输出)

JavaWeb-JavaWeb中的I/O(输入/输出) 一、JavaWeb中的I/O(输入/输出)1.1 什么是I/O1.2 JAVA中关于I/O的类库二、磁盘的I/O2.1 磁盘I/O的工作机制2.2 磁盘的物理结构2.3 磁盘的IO过程三、Java实现访问磁盘文件四、JAVA的序列化与反序列化五、网络编程5.1 Java Socket的工作机…

Mysql 索引优化——Explain

文章目录 Explain 简介Explain 概念Explain 示例 Explain 中列的含义idselect_typetabletypepossible_keyskeykey_lenrefrowExtra 索引最佳实践1.全值匹配2.最左前缀原则3.避免计算、函数、类型转换导致索引失效4.范围条件右边的索引列失效5.尽量使用覆盖索引 Explain 简介 Ex…

分布式教程从0到1【1】分布式基础

1 分布式基础概念 1.1 微服务 微服务架构风格&#xff0c;就像是把一个单独的应用程序开发为一套小服务&#xff0c;每个小服务运行在自己的进程中&#xff0c;并使用轻量级机制通信&#xff0c;通常是 HTTP API。这些服务围绕业务能力来构建&#xff0c;并通过完全自动化部署…

Flutter应用-使用sqflite升级数据库

文章目录 问题描述具体做法代码示例更多条件限制升级 数据库迁移和备份简介数据库迁移数据库备份 问题描述 使用fluttter开发的应用程序发布后&#xff0c;发现数据库有些设计不合理。如何来更新数据库呢&#xff1f; 使用sqflite来处理数据库&#xff0c;但是第一版软件发布后…

【C/PTA】数组进阶练习(一)

本文结合PTA专项练习带领读者掌握数组&#xff0c;刷题为主注释为辅&#xff0c;在代码中理解思路&#xff0c;其它不做过多叙述。 7-1 矩阵运算 给定一个nn的方阵&#xff0c;本题要求计算该矩阵除副对角线、最后一列和最后一行以外的所有元素之和。副对角线为从矩阵的右上角…

热点检测/降级框架Akali的部分原理解析

发现个“轻量级本地化热点检测/降级框架 这个框架名为Akali,项目地址&#xff1a;https://gitee.com/bryan31/Akali主要有两个作用 1&#xff1a;热点检测及处理 2&#xff1a;降级检测及处理 从官网文档来看使用是比较简单的&#xff0c;一个注解就能搞定 怀着好奇的心情c…

千梦网创:实现自动化“挂机躺盈”的三种方法

在互联网众多行业中&#xff0c;有很多人一直在寻找所谓的“挂机躺盈”的项目&#xff0c;在理财领域这种收入被称为“被动收入”。 天上不会掉馅饼这是一句讲烂掉的话了&#xff0c;躺在家里吃白食等着钱进账是一件不可能的事情。 然而如果你看到身边有“被动收入”的例子&a…

11.Oracle的视图

Oracle11g的视图 一、什么是视图&#xff08;View&#xff09;1、视图的概念2、视图的作用 二、视图的基本操作1、 创建普通视图&#xff1a;2、 创建只读视图&#xff1a;3、创建检查约束视图4、使用场景 一、什么是视图&#xff08;View&#xff09; 1、视图的概念 视图&…
最新文章