C语言手撕顺序表

news2024/9/22 1:16:29

目录

一、概念

1、静态顺序表:使用定长数组存储元素。

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

二、接口实现

1、对顺序表的初始化

 2、对数据的销毁

3、对数据的打印

4、检查是否需要扩容

5、尾插

6、头插

7、尾删

8、头删

9、在pos位置插入x

10、在pos位置处删除x

心得:


一、概念

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

顺序表一般分为

1、静态顺序表:使用定长数组存储元素。

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

 我们一般使用动态顺序表,因为静态顺序表的数组大小固定的,而动态可以根据我们需求的不同去在线扩容,所以接下来的文章围绕如何实现动态顺序表来讲解。

二、接口实现

对数据结构我们一般采用增删查改去实现。

#pragma once

#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
#include<string.h>

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);//尾删
void SeqListCheckCapacity(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);
//修改特定位置的值
void SeqListModify(SeqList* ps, int pos,int value);

1、对顺序表的初始化

void SeqListInit(SeqList* ps)
{
	ps->a = (SLDateType*)malloc(sizeof(SLDateType) * 4);
	if (ps->a == NULL)//需要检查动态开辟内存是否开辟成功
	{
		perror(malloc);
		exit(-1);//直接程序退出,因为空间都开辟失败,后面没法写
	}
	ps->size = 0;
	ps->capacity = 4;
}

 2、对数据的销毁

因为我们是动态开辟的内存,最后肯定是需要free释放。

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

3、对数据的打印

因为我们时刻要检查每一部分代码的正确性,需要数据检验,所以需要专门一个打印函数

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

4、检查是否需要扩容

因为动态内存,每当我们插入新的数据时,总需要将存储有效数据的大小增加,当我们开辟的空间不够时,就需要扩容,利用realloc函数的性质。

void SeqListCheckCapacity(SeqList* ps)
{
	if (ps->size == ps->capacity)
	{
		SLDateType* tmp = (SLDateType*)realloc(ps->a, ps->capacity * 2 * sizeof(SLDateType));
		//注意动态内存开辟的单位都是字节
		if (tmp == NULL)
		{
			perror(realloc);
			exit(-1);
		}
		ps->a = tmp;
		ps->capacity *= 2;
	}
}

5、尾插

void SeqListPushBack(SeqList* ps, SLDateType x)
{
	//先考虑空间大小够不够,需不需要扩容
	SeqListCheckCapacity(ps);
	ps->a[ps->size] = x;
	ps->size++;
}

6、头插

头插还需要用memmove函数去挪动数据

void SeqListPushFront(SeqList* ps, SLDateType x)
{
	//也需要考虑扩容的问题
	SeqListCheckCapacity(ps);
	memmove(ps->a + 1, ps->a, ps->size*sizeof(SLDateType));
	ps->size++;
	ps->a[0] = x;
}

7、尾删

我们需要检查size是否已经小于0,防止数组的越界,一般用assert去暴力的检查

void SeqListPopBack(SeqList* ps)
{
	assert(ps->size > 0);//暴力的检查
	/*if (ps->size == 0)
		return;*/
	//温柔的检查
	ps->size--;
}

8、头删

void SeqListPopFront(SeqList* ps)
{
	assert(ps->size > 0);
	memmove(ps->a, ps->a + 1, ps->size* sizeof(SLDateType));
	ps->size--;
}

9、在pos位置插入x

void SeqListInsert(SeqList* ps, int pos, SLDateType x)
{
	SeqListCheckCapacity(ps);
	assert(pos >= 0 && pos < ps->size);
	memmove(ps->a+pos + 1, ps->a+pos, sizeof(SLDateType)*(ps->size-pos));
	ps->a[pos] = x;
	ps->size++;
}

10、在pos位置处删除x

void SeqListErase(SeqList* ps, int pos)
{
	assert(ps->size > 0);
	memmove(ps->a + pos, ps->a + pos + 1,sizeof(SLDateType)*(ps->size-pos-1));
	ps->size--;
}   

心得:

顺序表开启了数据结构的的序章,顺序表算是很简单的数据结构了,从此我们需要敲一部分代码,编译一次,不能一股脑的输出,结果编译发现好多个bug,需要写一部分,编译一部分,这样才更加的有持续性。

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

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

相关文章

数据集【NO.7】无人机航拍数据集——VisDrone2019数据集

写在前面&#xff1a;数据集对应应用场景&#xff0c;不同的应用场景有不同的检测难点以及对应改进方法&#xff0c;本系列整理汇总领域内的数据集&#xff0c;方便大家下载数据集&#xff0c;若无法下载可关注后私信领取。关注免费领取整理好的数据集资料&#xff01;本文数据…

【前端知识】React 基础巩固(四十)——Navigate导航

React 基础巩固(四十)——Navigate导航 一、Navigate的基本使用 新建Login页面&#xff0c;在Login中引入Navigate&#xff0c;实现点击登陆按钮跳转至/home路径下&#xff1a; import React, { PureComponent } from "react"; import { Navigate } from "reac…

MySQL数据库之JDBC编程(从认识到操作)

目录 前言 一.JDBC的认识 1.1JDBC的来源 1.2JDBC的概念 二.JDBC的导包 三.JDBC的四步操作 三.JDBC常用的类和方法 3.1常用类 3.2常见方法 &#x1f381;个人主页&#xff1a;tq02的博客_CSDN博客-C语言,Java,Java数据结构领域博主 &#x1f3a5; 本文由 tq02 原创&…

芯片制造详解.光刻技术与基本流程.学习笔记(四)

本篇文章是看了以下视频后的笔记提炼&#xff0c;欢迎各位观看原视频&#xff0c;这里附上地址 芯片制造详解04&#xff1a;光刻技术与基本流程&#xff5c;国产之路不容易 芯片制造详解.光刻技术与基本流程.学习笔记 四 一、引子二、光刻(1).光掩膜(2).光刻机(3).光刻胶(4).挖…

matplotlib实现动态显示图片

plt.ion()打开交互开关 plt.ioff()关闭交互开关 plt.pause(0.1)暂停0.1秒 plt.clf()#清除当前的Figure图像 plt.cla()#清除当前的Axex图像 import matplotlib.pyplot as plt import numpy as np import time from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg…

计算机二级Python基本操作题-序号43

1. # 键盘输入一句话&#xff0c;用jieba分词后&#xff0c;将切分的词组按照在原话中逆序输出到屏幕上&#xff0c;词组中间没有空格。 示例如下&#xff1a; 输入&#xff1a; 我爱老师 输出&#xff1a; 老师爱我 import jieba txt input (请输入一段中文文本&#xff1a;)…

零拷贝原来这么简单!

我们总会在各种地方看到零拷贝&#xff0c;那零拷贝到底是个什么东西。 接下来&#xff0c;让我们来理一理啊。 拷贝说的是计算机里的 I/O 操作&#xff0c;也就是数据的读写操作。计算机可是一个复杂的家伙&#xff0c;包括软件和硬件两大部分&#xff0c;软件主要指操作系统…

【自动化测试】Jest体验之旅

目录 简介 快速体验 配置文件 Jest CLI 选项 --watchAll --watch 使用 ES6 模块 简介 Jest 是 Facebook 出品的一个 JavaScript 开源测试框架。相对其他测试框架&#xff0c;其一大特点就是就是内置了常用的测试工具&#xff0c;比如零配置、自带断言、测试覆盖率工具等…

从二叉搜索树到红黑树

二叉搜索树&#xff08;Binary Search Tree&#xff09; 特性 任意一个节点的所有左子树都比它小&#xff0c;所有右子树都比它大&#xff1b; 复杂度 当我们查找某个节点的时候&#xff0c;先从根节点开始比较&#xff0c;如果比根节点大走右子树&#xff0c;如果比根节点…

码农该如何延长周末体验感

码农该如何延长周末体验感 码农该如何延长周末体验感 码农该如何延长周末体验感1.制定合理的工作计划&#xff1a;2.实践工作与生活的平衡&#xff1a;3.学习新技术或扩展知识领域4.参与开源项目或个人项目&#xff1a;5.与同事或朋友组织活动&#xff1a;6.自己写博客或者总结…

jeecgboot新建moudle,但是访问404,需要在open moudle setting 里面设置

jeecgboot新建moudle&#xff0c;但是访问404&#xff0c;需要在open moudle setting 里面设置 首先需要确定以下3个pom.xml 最最外层的pom.xml 最最外层的pom.xml <modules><module>jeecg-boot-base-core</module><module>jeecg-module-demo</m…

string类(使用+实现)(C++)

string string类“登场”string类 - 了解string类的常用接口常见构造容量操作访问及遍历操作迭代器分类作用 增删查改操作非成员函数 string类的实现string类重要的方法实现分析介绍构造函数拷贝构造函数赋值运算符重载总结 string类整体实现代码 写时拷贝&#xff08;了解&…

金三银四好像消失了,IT行业何时复苏!

疫情时候不敢离职&#xff0c;以为熬过来疫情了&#xff0c;行情会好一些&#xff0c;可是疫情结束了&#xff0c;反而行情更差了&#xff0c; 这是要哪样 我心中不由一万个 草泥&#x1f434; 路过 我心中不惊有了很多疑惑和感叹&#xff01; 自我10连问 我的心情 自去年下…

什么是合者生情?

有人说&#xff0c;自己的命运自己掌握&#xff0c;但必须以预知自己命运如何为前提。 若不知道自己的命运如何&#xff0c;却要掌握自己的命运&#xff0c;那只是一句空话&#xff0c;是自欺欺人。 而易学在我国历史上&#xff0c;直至现在&#xff0c;都起到了重大而深远的作…

Python入门【LEGB规则、面向对象简介、面向过程和面向对象思想、面向对象是什么? 对象的进化 、类的定义、对象完整内存结构 】(十三)

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱敲代码的小王&#xff0c;CSDN博客博主,Python小白 &#x1f4d5;系列专栏&#xff1a;python入门到实战、Python爬虫开发、Python办公自动化、Python数据分析、Python前后端开发 &#x1f4e7;如果文章知识点有错误…

ARM裸机-5

1、可编程器件的编程原理 1.1、电子器件的发展方向 模拟器件-->数字器件 ASIC-->可编程器件 1.2、可编程器件的特点 CPU在固定频率的时钟控制下节奏运行。 CPU可以通过总线读取外部存储设备中的二进制指令集&#xff0c;然后解码执行。 这些可以被CPU解码执行的二进制指…

SpringBoot临时属性设置

在Spring Boot中&#xff0c;可以通过设置临时属性来覆盖应用程序中定义的属性。这在某些情况下很有用&#xff0c;例如在命令行中指定配置参数或在测试环境中覆盖默认值。 你可以使用--&#xff08;双破折号&#xff09;语法来设置临时属性。以下是一些示例&#xff1a; 1. …

【点云处理教程】04 Python 中的点云过滤

一、说明 这是我的“点云处理”教程的第 4 篇文章。“点云处理”教程对初学者友好&#xff0c;我们将在其中简单地介绍从数据准备到数据分割和分类的点云处理管道。 在本教程中&#xff0c;我们将学习如何使用 Open3D 在 python 中过滤点云以进行下采样和异常值去除。使用 Open…

【GitOps系列】在 GitOps 工作流中实现蓝绿发布

文章目录 前言蓝绿发布概述手动实现蓝绿发布创建蓝色环境创建蓝色环境 Ingressroute部署绿色环境切换到绿色环境 蓝绿发布自动化安装 Argo Rollout创建 Rollout 对象创建 Service 和 Ingress访问蓝色环境发布自动化 访问 Argo Rollout Dashboard自动化原理结语 前言 在前几篇【…

Netty学习(四)

文章目录 四. 优化与源码1. 优化1.1 扩展序列化算法jdk序列化与反序列化Serializer & AlgorithmConfigapplication.properties MessageCodecSharableMessage&#xff08;抽象类&#xff09; 测试序列化测试反序列化测试 1.2 参数调优1&#xff09;CONNECT_TIMEOUT_MILLIS2&…