[C语言][数据结构][动态内存空间的开辟]顺序表的实现!

目录

零.必备知识

a.顺序表的底层是数组.

b.数组在内存中是连续存放的.

c.动态内存空间的开辟(malloc,calloc,realloc).

一.顺序表的定义与实现 

        1.1 顺序表的定义 

        1.2 顺序表的初始化 

        1.3 顺序表的销毁 

        1.4 顺序表容量的检查与调整(最关键的部分)

        1.5 顺序表的尾插

        1.6 顺序表的头插 

        1.7 顺序表的尾删

        1.8 顺序表的头删

         1.9 顺序表中在指定位置之前插入数据

        1.10 删除指定位置的数据 

        1.11 顺序表中查找指定数据

二.顺序表源码 

        SeqList.h

        SeqList.c

 


零.必备知识


a.顺序表的底层是数组.

b.数组在内存中是连续存放的.

c.动态内存空间的开辟(malloc,calloc,realloc).

一.顺序表的定义与实现 

注:具体解释都在注释中(在代码中具体分析!)

        1.1 顺序表的定义 

        1.2 顺序表的初始化 

        1.3 顺序表的销毁 

        1.4 顺序表容量的检查与调整(最关键的部分)

 

        1.5 顺序表的尾插

 

        1.6 顺序表的头插 

 

        1.7 顺序表的尾删

 

        1.8 顺序表的头删

 

         1.9 顺序表中在指定位置之前插入数据

 

        1.10 删除指定位置的数据 

 

        1.11 顺序表中查找指定数据

 

二.顺序表源码 

        SeqList.h

#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>静态顺序表
//struct SeqList
//{
//	int arr[100];
//	int size;
//};// 动态顺序表的定义
typedef int DateType; //数据类型
typedef struct SeqList
{DateType* arr;int size; //数组中的有效元素个数int capacity; //数组的总容量
}SL;// 顺序表的初始化
void SLInit(SL* psl);
// 顺序表的销毁
void SLDestroy(SL* psl);
// 打印检查
void SLprint(SL sl);
// 容量检查与调整
void CheckCapacity(SL* psl);
// 尾插-头插
void SLPushBack(SL* psl, DateType x);
void SLPushFront(SL* psl, DateType x);
// 尾删-头删
void SLPopBack(SL* psl);
void SLPopFront(SL* psl);
// 在指定位置之前插入数据
void SLInsert(SL* psl, int pos, DateType x); //pos:点
// 删除指定位置的数据
void SLErase(SL* psl, int pos);
// 顺序表的查找
void SLFind(SL psl, DateType x);

        SeqList.c

 

#define  _CRT_SECURE_NO_WARNINGS
#include "SeqList.h"
// 顺序表的初始化
void SLInit(SL* psl)
{psl->arr = NULL;psl->size = psl->capacity = 0;
}
// 顺序表的销毁
void SLDestroy(SL* psl)
{if (psl->arr){free(psl->arr); //释放动态开辟的内存空间}psl->arr = NULL;psl->size = psl->capacity = 0;
}
// 容量检查与调整
void CheckCapacity(SL* psl)
{if (psl->size == psl->capacity) //空间不够了,需要进行扩容{int newCapacity = psl->capacity == 0 ? 4 : psl->capacity * 2; //避免 psl->capacity初始容量为空DateType* temp = (DateType*)realloc(psl->arr, newCapacity * sizeof(DateType));if (temp == NULL) //避免因为realloc调整空间失败,而导致psl->arr中的数据被清除{perror("realloc fail!");exit(1);}psl->capacity = newCapacity;psl->arr = temp;}
}
// 尾插
void SLPushBack(SL* psl, DateType x)
{CheckCapacity(psl);// 插入psl->arr[psl->size] = x;psl->size++;
}
// 头插
void SLPushFront(SL* psl, DateType x)
{CheckCapacity(psl);for (int i = psl->size; i > 0; i--){psl->arr[i] = psl->arr[i - 1]; //psl->arr[1] = psl->arr[0]}psl->arr[0] = x;(psl->size)++;
}// 尾删
void SLPopBack(SL* psl)
{assert(psl);assert(psl->size); //判断是否为空(psl->size)--;
}
// 头删
void SLPopFront(SL* psl)
{assert(psl);assert(psl->size); //判断是否为空for (int i = 0; i < psl->size - 1; i++){psl->arr[i] = psl->arr[i + 1]; //psl->arr[psl->size - 1] = psl->arr[psl->size - 2]}(psl->size)--;
}// 在指定位置之前插入数据
void SLInsert(SL* psl, int pos, DateType x)
{assert(psl);assert(pos >= 0 && pos <= psl->size);CheckCapacity(psl);for (int i = psl->size; i > pos; i--){psl->arr[i] = psl->arr[i - 1]; //arr[pos + 1] = arr[pos]}psl->arr[pos] = x;psl->size++;
}
// 删除指定位置的数据
void SLErase(SL* psl, int pos)
{assert(psl);assert(psl->size != 0);assert(pos >= 0 && pos < psl->size);for (int i = pos; i < psl->size - 1; i++){psl->arr[i] = psl->arr[i + 1]; //arr[i - 2] = arr[i - 1]}psl->size--;
}
// 顺序表的查找
void SLFind(SL* psl, DateType x)
{assert(psl);assert(psl->size != 0);for (int i = 0; i < psl->size; i++){if (psl->arr[i] == x){printf("找到了! 下标是%d\n", i);return;}}printf("找不到!\n");
}// 打印
void SLprint(SL sl)
{for (int i = 0; i < sl.size; i++){printf("%d ", sl.arr[i]);}printf("\n");
}

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

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

相关文章

A First Course in the Finite Element Method【Daryl L.】|PDF电子书

专栏导读 作者简介&#xff1a;工学博士&#xff0c;高级工程师&#xff0c;专注于工业软件算法研究本文已收录于专栏&#xff1a;《有限元编程从入门到精通》本专栏旨在提供 1.以案例的形式讲解各类有限元问题的程序实现&#xff0c;并提供所有案例完整源码&#xff1b;2.单元…

idea的后端环境配置

首先&#xff0c;在你刚打开idea时红色箭头所指的是你进行配置的地方&#xff0c;接下来我把具体步骤说一下 1&#xff0c;直接点击箭头所指的地方就会出现如图界面&#xff0c;然后点击Tomcat server,使其展开点击第一个 第二步取消勾选&#xff0c;第三步选择bin的上一级然后…

用vscode仿制小米官网

html内容: <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title><link rel&quo…

牛客NC93 设计LRU缓存结构【hard 链表,Map Java】

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/5dfded165916435d9defb053c63f1e84 思路 双向链表map最新的数据放头结点&#xff0c;尾节点放最老的数据&#xff0c;没次移除尾巴节点本地考察链表的新增&#xff0c;删除&#xff0c;移动节点参考答案Java im…

UNITY实战进阶-BatchRendererGroup+Jobs+Burst+RVO2+GPUAnimation 实现万人团战(一)

研究思路&#xff1a;GPUAnimation把动画放入GPU中处理&#xff0c;BatchRendererGroup进行动态批量渲染处理&#xff0c;JobsBurst进行多线程处理逻辑&#xff08;移动、攻击等&#xff09;&#xff0c;RVO2采用Jobs的寻路导航。 准备工作&#xff1a; Editor > Project S…

PCI总线学习笔记:读写篇

前言 最近在写E1000网卡的驱动&#xff0c;这其中涉及到了PCI总线的相关内容。但是网上大部分关于PCI的文章都只局限在概念上的描述&#xff0c;并没有给出具体的例子来解释。这其实也是情理之中的&#xff0c;因为PCI总线规范就像是一个抽象的接口&#xff0c;其具体怎么实现…

正确使用@Autowired

目录 一、前言二、跟着官方文档&#xff0c;学习正确使用Autowired0、实验环境1、通过构造方法进行注入1.1 问题1&#xff1a;那万一没有这个CustomerPreferenceDao对象&#xff0c;会报错吗&#xff1f; 2、通过setter方法注入3、通过方法注入&#xff08;这个方法可以是任意名…

为什么苹果 Mac 电脑需要使用清理软件?

尽管 Apple Mac 电脑因其卓越的性能、简洁高效的 macOS 操作系统及独特的美学设计备受全球用户青睐&#xff0c;但任何电子设备在长期使用后都难以避免面临系统资源日渐累积的问题。其中一个重要维护需求在于&#xff0c;随着使用时间的增长&#xff0c;Mac电脑可能会由于系统垃…

go库x/text缺陷报告CVE-2022-32149的处理方案

#问题描述 go库 golang.org/x/text &#xff0c;注意这里不是go的源码&#xff0c; 在0.3.8版本之前存在一个缺陷(Vulnerability) 缺陷ID CVE-2022-32149 具体描述 攻击者可以通过制作一个Accept-Language报头来导致拒绝服务。 具体的原因是&#xff0c;在解析这个Accept-L…

数据结构__顺序表和单链表

顺序表的改进 问题&#xff1a; 1. 中间/头部的插入删除&#xff0c;时间复杂度为O(N) 2. 增容需要申请新空间&#xff0c;拷贝数据&#xff0c;释放旧空间。会有不小的消耗。 3. 增容一般是呈2倍的增长&#xff0c;势必会有一定的空间浪费。例如当前容量为100&#xff0c;满了…

C++——位图和布隆过滤器

在C中&#xff0c;哈希这种思想的应用场景有很多&#xff0c;位图就是其中的一种。 位图 位图&#xff1a;位图是一种哈希思想的产物&#xff0c;可以通过它来对数据进行快速的查找的方法&#xff0c;在位图中&#xff0c;有2种状态来表示在或者不在&#xff0c;即1/0。 位图…

大数据系列 | Kafka架构分析及应用

大数据系列 | Kafka架构分析及应用 1. Kafka原理分析2. Kafka架构分析3. Kafka的应用3.1. 安装Zookeeper集群3.2. 安装Kafka集群3.3. 生产者和消费者使用3.3.1. 生产者使用3.3.1. 消费者使用 4. Kafka Controller控制器 1. Kafka原理分析 Kafka是一个高吞吐量、 持久性的分布式…

宏的使用(C语言详解)

在写一个代码生成可执行文件的过程需要经过编译和链接&#xff0c;编译又要经过三部&#xff1a;预处理&#xff0c;编译&#xff0c;汇编。 #define定义的变量和宏就是在预处理阶段会处理的。 一个简单的宏定义&#xff1a; #include<stdio.h>; #define Max(a,b) a>…

CTF之GET和POST

学过php都知道就一个简单传参&#xff0c;构造payload:?whatflag得到 flag{3121064b1e9e27280f9f709144222429} 下面是POST那题 使用firefox浏览器的插件Hackbar勾选POST传入whatflag flag{828a91acc006990d74b0cb0c2f62b8d8}

Web APIs简介 Dom

JS的组成 API API 是一些预先定义的函数&#xff0c;目的是提供应用程序与开发人员基于软件或硬件得以访问一组例程的能力&#xff0c;而又无需访问源码&#xff0c;或理解内部工作机制的细节 简单理解&#xff1a;API是给程序员提供的一种工具&#xff0c;以便能更轻松的实现…

【白菜基础】初识蛋白质组学

这篇文章写得很详细&#xff0c;可以仔细阅读&#xff1a;干货&#xff01;5000字基于质谱的蛋白质组详细总结|蛋白质组 1. 蛋白质组学的概念 蛋白质组&#xff08;Proteome&#xff09;&#xff1a;一个细胞或组织由整个基因组表达的全部蛋白质。 蛋白质组学&#xff08;Pr…

Longan Pi 3H简约外壳分享

Longan Pi 3H简约外壳分享 因为购买了Longan Pi 3H&#xff0c;它用的是H618&#xff0c;我记得香橙派zero2w 也是这个芯片&#xff0c;不过我很喜欢sipeed的这个风格&#xff0c;特别好看&#xff0c;而且该有的都有&#xff0c;不说废话了&#xff0c;直接上图片和文件 链接…

redis群集有三种模式

目录 redis群集有三种模式 redis群集有三种模式 分别是主从同步/复制、哨兵模式、Cluster ●主从复制&#xff1a;主从复制是高可用Redis的基础&#xff0c;哨兵和集群都是在主从复制基础上实现高可用的。主从复制主要实现了数据的多机备份&#xff0c;以及对于读操作的负载均…

微信小程序使用icon图标

原因&#xff1a; 微信小程序使用fontawesome库使用icon图标&#xff0c;网上有很多教程&#xff0c;按照网上说法制作&#xff0c;引入到微信小程序中&#xff0c;但是验证成功&#xff0c;只能使用部分图标&#xff0c;结果不尽如人意。后面使用阿里巴巴开源iconfont来使用ic…

Git入门实战教程之创建版本库

一、Git简介 Git是一个分布式版本控制系&#xff0c;分层结构如下&#xff1a; Git分为四层&#xff1a; 1、工作目录 当前正在工作的项目的实际文件目录&#xff0c;我们执行命令git init时所在的地方&#xff0c;也就是我们执行一切文件操作的地方。 2、暂存区 暂存区是…