【数据结构】顺序表—纯C实现顺序表

news2025/8/4 4:20:17

顺序表文章目录

  • 定义
    • 特点
    • 缺陷
    • 静态顺序表
    • 动态顺序表
  • 接口实现
    • 顺序表初始化
    • 顺序表销毁
    • 顺序表增容
    • 头部的插入删除
      • 头插
      • 头删
    • 尾部的插入删除
      • 尾插
      • 尾删
    • 中间的插入删除
      • 中间插入
      • 中间删除
    • 顺序表查找
    • 顺序表打印

在这里插入图片描述

在这里插入图片描述

定义

顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。在数组上完成数据的增删查改。
顺序表一般可以分为:
1. 静态顺序表:使用定长数组存储元素
2. 动态顺序表:使用动态开辟的数组存储。

特点

顺序表的特点:
①随机访问,即可以在 O(1) 时间内找到第 i 个元素。
②存储密度高,每个节点只存储数据元素
③拓展容量不方便(即便采用动态分配的方式实现,拓展长度的时间复杂度也比较高)
④插入、删除操作不方便,需要移动大量元素

缺陷

  1. 空间不够,需要扩容。扩容是有代价的,并且会存在空间浪费。
  2. 头部或者中部的插入删除,需要挪动数据,效率低。

静态顺序表

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

在这里插入图片描述

动态顺序表

在这里插入图片描述

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

接口实现

typedef int SLDataType;
// 顺序表的动态存储
typedef struct SeqList
{
  SLDataType* array;  // 指向动态开辟的数组
  size_t size ;       // 有效数据个数
  size_t capicity ;   // 容量空间的大小
}SeqList;

以下接口都以该类型实现。

顺序表初始化

void SeqListInit(SeqList* psl)
{
	assert(psl);//断言防止其为空指针
	psl->array=NULL;//讲该指针置空
	psl->size = 0;//设置有效数据个数为0
	psl->capacity = 0;//设置空间容量为0
}

介绍一下assert这个函数。
在这里插入图片描述


assert的作用就是:求表达式的值,当结果为假时,打印诊断消息并中止程序。

顺序表销毁

void SeqListDestory(SeqList* psl)
{
	assert(psl);
	//释放动态开辟的空间
	if (psl->array)
	{
		free(psl->array);
		psl->array = NULL;
		psl->capacity = 0;
		psl->size = 0;
	}
}

顺序表增容

想给一个表增容,最先做的就是先检查顺序表内元素个数是否已达顺序表容量上限
若已达上限,那么我们就需要先对顺序表进行扩容,然后才能增加数据。

void SeqListCheckCapacity(SeqList* psl)
{
	assert(psl);

	if (psl->size == psl->capacity)
	{
		int newCapacity = psl->capacity == 0 ? 4 : psl->capacity * 2;
		SeqListDataType* tmp = (SeqListDataType*)realloc(psl->array, newCapacity * sizeof(SeqListDataType));
		if (tmp == NULL)
		{
			perror("realloc fail");
			exit(-1);
		}

		psl->array = tmp;
		psl->capacity = newCapacity;
	}
}

头部的插入删除

头插

void SeqListPushFront(SeqList* psl, SeqListDataType x)
{
	assert(psl);
	SeqListCheckCapacity(psl);
	int end = psl->size - 1;
	while (end >= 0)
	{
		psl->array[end + 1] = psl->array[end];
		end--;
	}
    //或者用for循环
    //	for (int i = psl->size - 1; i >= 0; i--)  
    //顺序表中[0,size-1]的元素依次向后挪动一位
	//{
	//	psl->array[i + 1] = psl->array[i];
	//}
	psl->array[0] = x;
	psl->size++;
}
void SeqListPushFront(SeqList* psl, SeqListDataType x)
{
   SeqListInsert(psl, 0, x);
}

头删

void SeqListPopFront(SeqList* psl)
{
	assert(psl);  //断言
    assert(psl->size>0);//防止数据为0时还删数据
	assert(psl->size > 0);  //顺序表不能为空
	int begin = 1;
    while(begin<ps->size)
    {
        psl->array[begin-1]=psl->array[begin];
        begin++;
    }
//	int i = 0;
//	for (i = 1; i < psl->size; i++)  //顺序表中[1,size-1]的元素依次向前挪动一位
//	{
//		psl->array[i - 1] = psl->array[i];
//	}
	psl->size--;  //有效数据个数-1
}
void SeqListPopFront(SeqList* psl)
{
    SeqListErase(psl, 0);
}

尾部的插入删除

尾插

void SeqListPushBack(SeqList* psl, SeqListDataType x)
{
	assert(psl);
	SLCheckCapacity(psl);
	psl->array[psl->size] = x;
	psl->size++;
}
void SeqListPushBack(SeqList*psl,SeqListDataType X)
{
    SLInsert(psl, ps->size, x);
}

尾删

void SeqListPopBack(SeqList* psl)
{
	assert(ps);
	assert(ps->size > 0);
	psl->array[ps->size - 1] = 0;
	psl->size--;
}
void SeqListPopBack(SeqList*psl)
{
    SeqListErase(psl, psl->size-1);
}

中间的插入删除

中间插入

void SeqListInsert(SeqList* psl, int pos, SeqListDataType x)
{
	assert(psl);
	assert(pos >= 0);
	assert(pos <= psl ->size);

	SeqListCheckCapacity(psl);
	int end = psl->size - 1;
	while (end >= pos)
	{
		psl->array[end + 1] = psl->array[end];
		end--;
	}

	psl->array[pos] = x;
	psl ->size++;
}

中间删除

void SeqListErase(SeqList* psl, int pos)
{ss
	assert(psl);
	assert(pos >= 0);
	assert(pos < psl->size);
	int begin = pos + 1;
	while (begin < psl->size)
	{
		psl->array[begin - 1] = psl->array[begin];
		begin++;
	}
	psl->size--;
}

顺序表查找

int SeqListFind(SeqList* psl, SeqListDataType x, int begin)
{
	assert(psl);
	for (int i = begin; i < psl->size; i++)
	{
		if (ps->array[i] == x)
		{
			return i;
		}
	}
	return -1;
}

顺序表打印

void SeqListPrint(SeqList* psl)
{
	assert(psl);
	if (psl->size == 0)
	{
		printf("空表");
		return;
	}
	for (int i = 0; i < psl->size; i++)
	{
		printf("%d ", psl->array[i]);
	}
	printf("\n");
}

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

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

相关文章

sklearn.metrics模块重要API总结(持续更新)

目录前言各类指标分类指标&#xff08;Classification metrics&#xff09;sklearn.metrics.accuracy_scoresklearn.metrics.aucaverage_precision_score (AP)回归指标&#xff08;Regression metrics&#xff09;多标签排序指标&#xff08;Multilabel ranking metrics&#x…

JUC05-AQS、ReentrantLock原理

一、AQS 全称是 AbstractQueuedSynchronizer,是同步器的相关框架&#xff0c;juc中很多锁的实现类依赖同步器(AQS的子类)完成核心操作 要点 内部维护state变量资源状态&#xff0c;state0表示当前无线程占用&#xff0c;state!0代表该锁正在被线程占用提供FIFO的等待队列&…

Mongodb实验二——分片集群搭建

目录 前言 题目一 1.创建副本集实例&#xff08;Mongod&#xff09; cfg0_0配置 cfg0_1配置 cfg0_2配置 ch0_0配置 ch0_1配置 ch0_2配置 ch1_0配置 ch1_1配置 ch1_2配置 2.初始化副本集 ch0conf.js配置 ch1conf.js配置 3.创建路由节点&#xff08;分片管理服务器…

Live800:避开客服雷区,提升客服转化

小刘在某在线商城开了个小店铺&#xff0c;店铺做得不错&#xff0c;宝贝销量稳定&#xff0c;小日子过得有滋有味。 最近一段时间&#xff0c;流量持续下滑&#xff0c;销量跟着走低&#xff0c;可愁死了。 "流量有波动很正常&#xff0c;但是一直降一直降&#xff0c;肯…

《恋上数据结构与算法》第1季:算法概述

数据结构与算法的学习笔记目录&#xff1a;《恋上数据结构与算法》的学习笔记 目录索引算法概述1. 算法和数据结构1.1 什么是算法1.2 什么是数据结构2. 时间复杂度2.1 如何判断一个算法的好坏呢&#xff1f;2.2 基本操作执行次数2.3 大O表示法3. 空间复杂度3.1 概念定义4. 算法…

MCE | BCL6 小分子也能发挥类 PROTAC 的功能

图示摘要&#xff1a;来自作者 Jonas Koeppel (Ph. D., Department of Medical Oncology, Dana-Farber Cancer Institute) 的 Twitter杂合双功能降解技术 (PROTAC&#xff0c;靶蛋白配体-Linker-E3 连接酶配体组成的“三体”聚合物) 已被用于多种疾病相关靶点的降解剂开发&…

老年患者植入LVAD的挑战:胃肠道出血

EF值降低的心力衰竭随着年龄的增长越来越常见。据研究报道&#xff0c;75岁以上人群的患病率是普通人群的4倍&#xff0c;目前是老年人死亡和住院的最常见原因之一。治疗方案主要包括心脏移植(HT)和长期左心室辅助装置(LVAD)植入&#xff0c;这两种方法已被临床研究证明可降低患…

Flutter高仿微信-第34篇-单聊-小视频

Flutter高仿微信系列共59篇&#xff0c;从Flutter客户端、Kotlin客户端、Web服务器、数据库表结构、Xmpp即时通讯服务器、视频通话服务器、腾讯云服务器全面讲解。 详情请查看 效果图&#xff1a; 详情请参考 Flutter高仿微信-第29篇-单聊 &#xff0c; 这里只是提取小视频的部…

Android App开发即时通信中通过SocketIO在客户端与服务端间传输文本和图片的讲解及实战(超详细 附源码)

需要源码和服务端代码请点赞关注收藏后评论区留下QQ~~~ 一、通过SocketIO传输文本消息 虽然HTTP协议能够满足多数常见的接口交互&#xff0c;但是他属于短连接&#xff0c;每次调用完就自动断开连接&#xff0c;并且HTTP协议区分了服务端和客户端&#xff0c;双方的通信过程是…

机器学习知识经验分享之三:基于卷积神经网络的经典目标检测算法

文章目录前言一、一阶段目标检测算法1.YOLO系列算法2.SSD检测算法3. RetinaNet检测算法二、两阶段目标检测算法1.Faster R-CNN检测算法2.Mask R-CNN检测算法3.Cascade R-CNN检测算法总结前言 本系列文章将对机器学习知识进行分享总结。便于大家从理论层面了解人工智能基础原理…

软件被人后台篡改了收款码属于入侵吗?

最近很多做平台的小伙伴&#xff0c;碰到了同样的问题&#xff0c;就是软件程序后台被恶意篡改收款二维码 这个问题出现在平台主身上无疑是雪上加霜&#xff0c;第一时间找到了小蚁君&#xff0c;分析了一下当时的情况&#xff0c;先安装了小蚁的入侵检测系统&#xff0c;显示…

计算机毕业设计之java+ssm协同办公系统

项目介绍 本公司文档协同办公管理系统采用SSM&#xff08;SpringSpringMVCMyBatis&#xff09;框架开发,主要包括系统用户管理模块、用户信息模块、文件信息管理、个人事务管理、资料信息管理、登录模块、和退出模块等多个模块. 本系统主要包含了等系统用户管理、用户信息管理…

webpack5 PWA解决Web App 项目网络离线情况没法访问情况

为什么 开发 Web App 项目&#xff0c;项目一旦处于网络离线情况&#xff0c;就没法访问了。 我们希望给项目提供离线体验。 是什么 渐进式网络应用程序(progressive web application - PWA)&#xff1a;是一种可以提供类似于 native app(原生应用程序) 体验的 Web App 的技术。…

Go语言中操作Redis

Redis介绍 Redis是一个开源的内存数据库&#xff0c;Redis提供了多种不同类型的数据结构&#xff0c;很多业务场景下的问题都可以很自然地映射到这些数据结构上。 除此之外&#xff0c;通过复制、持久化和客户端分片等特性&#xff0c;我们可以很方便地将Redis扩展成一个能够包…

Word控件Spire.Doc 【图像形状】教程(5) 如何在 C# 中将文本环绕在图像周围

Spire.Doc for .NET是一款专门对 Word 文档进行操作的 .NET 类库。在于帮助开发人员无需安装 Microsoft Word情况下&#xff0c;轻松快捷高效地创建、编辑、转换和打印 Microsoft Word 文档。拥有近10年专业开发经验Spire系列办公文档开发工具&#xff0c;专注于创建、编辑、转…

frp篇---frp-notify + Gotify 实现 FRP 用户上线通知

frp-notify Gotify 实现 FRP 用户上线通知1. 安装frp_notify2. Gotify 配置3. frp-notify 配置启动 frp_notify开机自启动1. 安装frp_notify 一个专注于消息通知的 frp server manager plugin 实现&#xff0c;让你对进入 frps 的连接了如指掌&#xff0c;不再裸奔。 项目链…

SSM之Spring注解式缓存Redis

目录 Sprig整合Redis 导入相关pom依赖 添加对应的的配置文件 IEDA安装lombok插件 引入外部多文件 applicationContext.xml的整合配置文件 redis注解式缓存 Cacheable 测试类注解 Cacheable 的测试代码 CachePut CachePut测试代码 CacheEvict CacheEvict测试代码 Spr…

如何考察候选人 Vue 技术水平?

答对这些问题&#xff0c;检测你是否真正掌握了Vue 请说一下响应式数据的原理 默认 Vue 在初始化数据时&#xff0c;会给 data 中的属性使用 Object.defineProperty 重新定义所有属性&#xff0c;当页面到对应属性时&#xff0c;会进行依赖收集(收集当前组件中的 watcher)如果…

论文阅读【8】Conditional Random Fields: An Introduction

1.概述 1.1 论文相关 这篇论文是介绍一个经典模型&#xff0c;条件随机场&#xff08;CRF&#xff09;。在很多领域中都存在序列标注任务&#xff0c;例如生物信息识别&#xff0c;计算机语言学和语音识别任务&#xff0c;其中自然语言处理中的词性标注任何和命名实体识别任务…

JS 数据结构:链表

单链表 每个节点中只包含一个指针域的链表称为单链表。 头结点—其指针域指向表中第一个结点的指针&#xff08;头结点不是必须的&#xff0c;只是习惯上加上头结点&#xff0c;而头结点的数据域一般记录的是该链表的相关数据&#xff0c;如&#xff1a;链表长度&#xff09;…