数据结构与算法之《顺序表》

news2024/10/3 8:19:48

目录

1.什么是顺序表

 顺序表的优势和缺点

顺序表预备知识

顺序表的代码实现

顺序表头部插入

顺序表的销毁

顺序表的头删

顺序表的尾删

顺序表的尾插

顺序表的任意位置插入

顺序表的查找

顺序表的打印


1.什么是顺序表

这篇文章我们来讲一下基础数据结构的顺序表,相信大家在学习C语言的时候接触过数组这种数据结构,但是它又跟顺序表又有什么关系呢?

 我们知道数组的内存是连续的,一个下标对应着一片内存,而且支持随机访问。这就叫做顺序结构,而数组就是这种结构。果不其然我们的顺序表也是这种结构,但是顺序表就是数组吗?答案是是的,只是其描述角度不同。

  • 线性表是数据结构中的逻辑结构。
  • 线性表采用顺序存储的方式存储就称之为顺序表。
  • 数组是顺序表在实际编程中的具体实现方式之一。

 顺序表的优势和缺点

前面介绍完了顺序表的定义,我们说说它的优势和不足的地方:

我们知道顺序表的优势如下 :

     支持随机访问,查找速度O(1)

     空间利用率高

    那缺点就显而易见了:

增加和删除的速度较慢,如果要在中间插入一个元素则需要挪动后面的所有的元素,造成多余的时间开销,删除同理。 时间复杂度是O(n), 如果不经常删除和改动元素则不推荐使用顺序表这种顺序结构,而用链表则效率更高。

顺序表的长度需要提前指定,长度受到限制。 有同学说我可以进行动态内存分配啊,这样不就行了?其实动态内存分配是解决了长度受限的问题,但存在一个潜在的问题,顺序表扩容我们一般一次就扩充两倍,但是用的可能没有这么多,那多出来的内存空间不就浪费了吗?这是我们说的多余的内存开销问题。

顺序表预备知识

动态内存分配(malloc) 

结构体(struct)

顺序表的代码实现

以下为所有的代码实现:

函数接口:

void Sequential_table_deletion(SL*ps,int pos);
void Sequential_table_lookup(SL*ps,int pos,int x); //顺序表中插入数据
int  Seqlistwo(SL*ps,int n);//顺序表中查找元素
void SeqlistPopBack(SL*ps,int n);//尾插函数
void Array_expansion(SL*ps); //扩容
void Seqlistfis(SL*ps);//(3)  //头删 
void Seqlistpuch(SL*ps,int n);  // 头插法
void Array_expansion(SL*ps) //扩容

结构体定义:

typedef struct Seqlist
{
   int *a;
   int size; //表示数组中存储了多少个数据
    int ciap;// 数组能实际存储的容量大小
}SL;

顺序表头部插入

顺序表的头部插入就是先把顺序表的第一个元素空出来,然后把所有的数据往后挪动达到头插的目的

void Seqlistpuch(SL*ps,int n)  // 头插法
{
  Array_expansion(ps);  //检查增容
    int end = ps->size-1;
  while(end>=0)
  {
    ps->a[end+1]=ps->a[end];
    end--;
  }   
  ps->a[0] = n;
  ps->size++;
}

顺序表的销毁

顺序表的销毁就简单了,只要当前表不为空指针,一直释放就可以了

void SeqListDestroy(SeqList* ps)
{
	//断言
	assert(ps);
	//释放空间
	if (ps->a != NULL)
	{
		free(ps->a);
		ps->a = NULL;
		ps->capacity = 0;
		ps->size = 0;
	}

}

顺序表的头插

在使用头插函数前,我们需要检查当前顺序表的空间是否足够我们使用;然后再对顺序表进行操作,当然我们传进来的参数不能为空指针,我们把长度定义为end,让它后一个数等于前一个数,同时长度-1.我们的头插就完成了。

void SeqListPushFront(SeqList*ps,SLDateType x)
{
	断言
	//assert(ps);
	检查扩容
	//SeqListCheck(ps);
	//int end = ps->size-1;
	挪动数据
	//while (end >= 0)
	//{
	//	ps->a[end + 1] = ps->a[end];
	//	end--;
	//}
	在头部插入数据
	//ps->a[0] = x;
	//ps->size++;
	SeqListInsert(ps, 0, x);
}

顺序表的尾删

当前下标大于0 ,长度-1

void SeqListPopBack(SeqList* ps)
{
	//断言
	assert(ps->size>0);
	ps->size--;
}

顺序表的尾插

所有元素向前挪动一个位置,长度+1

void SeqListPushBack(SeqList* ps, SLDateType x)
{
	//断言
	assert(ps);
	//检查扩容
	SeqListCheck(ps);
	//插入数据
	ps->a[ps->size] = x;
	ps->size++;
}

顺序表的任意位置插入

 顺序表的任意插入,这个比头部或尾部插入有点麻烦,不过实现起来也不难。我们先要断言一下要插入的下标的有效性。

void removeElem(STL*ps,substitute pos,substitute elem)//在指定位置插入元素
{   
   assert(pos<0&&pos>ps->size);
   
   int i = 0;
   for(i = 0;i<ps->size;i++)
   {
       ps->a[i]=ps->a[i-1];
   }
 ps->a[pos]=elem;
 ps->size++;
}

顺序表的查找

顺序表的查找和数组是一样的,如果当前顺序表的元素等于要查找的值,则立即返回该数据的下标。否则返回空。

int SeqListFind(SeqList* ps, SLDateType x,int begain)
{
	assert(ps);
	int i = 0;
	//遍历数组进行查找
	for (i = begain; i < ps->size; i++)
	{
		if (ps->a[i] == x)
		{
			return i;
		}
	}
	//查找不到,返回-1
	return -1;
}

顺序表的打印

 

void Sequential_table_printing(STL*ps) 
{   
    int i = 0;
    for(i = 0;i<ps->size;++i)//打印顺序表的元素
    {
         printf("%d ",ps->a[i]);
    }
}

顺序表的打印和数组是一样的,通过访问其下标。

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

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

相关文章

Input子系统(一)启动篇

代码路径 基于AndroidS&#xff08;12.0&#xff09;代码 system/core/libutils/Threads.cppframeworks/base/services- java/com/android/server/SystemServer.java- core- java/com/android/server/input/InputManagerService.java- jni/com_android_server_input_InputMan…

三步 让你的 vscode 自动编译ts文件

三步让你的 vscode 自动编译ts文件 TypeScript环境安装与如何在vscode实现自动编译ts文件? 文章目录三步让你的 vscode 自动编译ts文件前提条件环境安装自动编译运行监视任务时报错&#xff1f;前提条件 安装 node 环境 环境安装 tsc 作用&#xff1a;负责将ts 代码 转为 浏…

感知器算法

感知器算法原理说明 感知器是一种二分类的线性分类算法&#xff0c;其原理基于神经元的工作原理。感知器将输入数据通过加权求和的方式映射到一个输出&#xff0c;然后根据输出的结果进行分类。 具体来说&#xff0c;给定一个训练集 D(x1,y1),(x2,y2),...,(xn,yn)D{(x_1,y_1)…

研报精选230308

目录 【行业230308东吴证券】电力设备行业深度报告&#xff1a;氢能深度&#xff1a;绿氢&#xff0c;第四次能源革命的载体【个股230308安信证券_沪光股份】优秀的民营汽车线束供应商&#xff0c;行业国产化替代空间广阔【行业230308中原证券】食品饮料行业2月月报&#xff1a…

银行数字化转型导师坚鹏:数字化转型为什么需要致良知与知行合一

在银行数字化转型过程中&#xff0c;特别需要致良知与知行合一哲学思想的指导。 知中有行&#xff0c;行中有知&#xff1b;行极而知&#xff0c;知极而行&#xff1b;知行无端&#xff0c;知行无始。知与行是一件事&#xff0c;做事与培养本体&#xff08;修心&#xff09;也是…

手动集成Tencent SDK遇到的坑!!!

手动集成的原因 由于腾讯未把Tencent SDK上传到Github中&#xff0c;所以我们不能通过Cocoapods的方式集成&#xff0c;只能通过官方下载其SDK手动集成。 Tencent SDK手动集成步骤 1.访问腾讯开放平台SDK下载界面&#xff0c;找到并下载iOS_SDK_V3.5.1。&#xff08;目前最新…

数组(四)-- LC[167] 两数之和-有序数组

1 两数之和 1.1 题目描述 题目链接&#xff1a;https://leetcode.cn/problems/two-sum/description/ 1.2 求解思路 1. 暴力枚举 最容易想到的方法是枚举数组中的每一个数 x&#xff0c;寻找数组中是否存在 target - x 参考代码 class Solution(object):def twoSum(self, n…

Nginx学习(3)—— 反向代理、负载均衡、动静分离、URLRewrite、防盗链

文章目录网关、代理与反向代理Nginx的反向代理配置基于反向代理的负载均衡的配置负载均衡策略负载均衡权重相关配置&#xff08;weight&#xff09;动静分离Nginx配置动静分离URL-rewrite伪静态配置负载均衡URL-rewrite防盗链网关、代理与反向代理 什么是反向代理&#xff1a;…

在linux上部署Java项目

在Linux部署Java环境 要是想要部署java web程序,首先要配置环境 jdk tomcat mysql 安装jdk 推荐的方法是使用yum直接安装openjdk(开源的,与官方的jdk功能差不多),目前使用的最多的就是jdk8系列 yum list | grep jdk 在源上搜索所有关于jdk的文件 devel表示development的意思…

3.8多线程

案例一-线程安全的单例模式(面试)是一种设计模式,设计模式针对写代码时的一些常见场景给出一些经典解决方案单例模式的两种典型实现饿汉模式懒汉模式饿汉的单例模式:比较着急去进行创建实例懒汉的单例模式,是不太着急创建实例,,只是在用的时候,才真正创建这个是类对象,也就是.c…

【C++修炼之路】26.C++11(语法糖)

每一个不曾起舞的日子都是对生命的辜负 C11C11(语法糖)本节目标一.C11简介二.统一的列表初始化2.1 {}初始化2.2 std::initializer_list三.声明3.1 auto3.2 decltype3.3 nullptr四.总结C11(语法糖) 本节目标 C11简介 列表初始化 变量类型推导 一.C11简介 在2003年C标准委员…

信息收集-

url&#xff1a; https://en.wikipedia.org:443/wiki/hypertext_Transfer_Protocol?id123#HTTP/1.1_response_messages https&#xff1a;协议 en.wikipedia.org&#xff1a;域名 443&#xff1a;端口 wiki/hypertext_Transfer_Protocol&#xff1a;文件路径 id123&…

Unity 混合操作(Blending)

渲染图形时&#xff0c;在执行所有着色器并应用所有纹理后&#xff0c;像素将写入到屏幕。这些像素与已有像素的组合方式由 Blend 命令控制。用于生成透明对象。《Unity Shader入门精要》大致解释&#xff1a;片元通过了模板测试和深度测试之后&#xff0c;会进行混合步骤。如果…

三、SpringMVC的拦截器

1. SpringMVC的拦截器 针对请求和响应进行的额外的处理.在请求和响应的过程中添加预处理,后处理和最终处理. 2. 拦截器的应用场景 1、日志记录&#xff1a;记录请求信息的日志 2、权限检查&#xff0c;如登录检查 3、性能检测&#xff1a;检测方法的执行时间 3. 拦截器执行的…

调用一个函数时发生了什么?

欢迎来到 Claffic 的博客 &#x1f49e;&#x1f49e;&#x1f49e; 前言&#xff1a; 用C语言写代码&#xff0c;如果一个工程相对复杂时&#xff0c;我们往往会采取封装函数的方式。在主函数中调用函数 这一看似简单的过程&#xff0c;实际上有很多不宜观察的细节&#xff0…

计算机组成原理|第三章(笔记)

目录第三章 系统总线3.1 总线的基本概念3.2 总线的分类3.2.1 片内总线3.2.2 系统总线3.2.3 通信总线3.3 总线特性及性能指标3.3.1 总线的特性3.3.2 总线性能指标3.4 总线结构3.4.1 单总线结构3.4.2 多总线结构3.4.3 总线结构举例3.5 总线控制3.5.1 总线判优控制3.5.2 总线通信控…

ALG和STUN

目录 ALG 应用层网关讲解 Client1使用FTP主动模式建立FTP Client1使用FTP被动模式建立FTP STUN讲解 ALG 应用层网关讲解 用来替换应用层信息 Client1使用FTP主动模式建立FTP 主动模式&#xff1a;服务器收到客户端发来的请求FTP的地址和端口 服务器使用20端口直接向客户端建…

webpack dll 提升构建速度

DLL&#xff0c;动态链接库&#xff08;Dynamic Link Library 或者 Dynamic-link Library&#xff09;&#xff0c;由微软公司提出。目的是为了节约应用程序所需的磁盘和内存空间。 在一个传统的非共享库中&#xff0c;如果两个程序调用同一个子程序&#xff0c;就会出现两份那…

Redis-6集群

文章目录前言Redis集群原理搭建Redis集群集群拓展后记前言 前两期介绍和搭建了Redis的主从复制架构和哨兵模式&#xff0c;虽然哨兵模式能够实现自动故障转移主备切换&#xff0c;一定程度上提高了系统的容错性 但这两种架构模式都不能解决单节点的并发压力和物理上线的问题&…

行测-判断推理-图形推理-样式规律-空间重构-立体拼合

有凸必有凹&#xff0c;排除A CD显然不对选BA和4能组成长方体B和3能组成长方体C和1能组成长方体选D这两个东西应该在同一侧&#xff0c;排除A C中间应该要由凸起&#xff0c;排除D选B图1向左旋转90图2逆时针旋转90选A