数据结构之顺序表及其实现!

目录

​编辑

1. 顺序表的概念及结构

2. 接口的实现

2.1 顺序表的初始化

2.2 检查顺序表容量是否已满

2.3 顺序表的尾插

​编辑

2.4 顺序表的尾删

2.5 顺序表的头插

2.6  顺序表的头删

2.7 顺序表在pos位置插入

2.8  顺序表在pos位置删除

2.9 顺序表的查找

2.10 顺序表的销毁

2.11 顺序表的打印

 3. 我在实现顺序表时的测试代码

4. 完结散花


                                            悟已往之不谏,知来者犹可追  

创作不易,宝子们!如果这篇文章对你们有帮助的话,别忘了给个免费的赞哟~

1. 顺序表的概念及结构

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

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

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

2. 接口的实现

静态顺序表只适用于确定知道需要存多少数据的场景。静态顺序表的定长数组导致N定大了,空 间开多了浪费,开少了不够用。所以现实中基本都是使用动态顺序表,根据需要动态的分配空间 大小,所以下面我们实现动态顺序表。

我们创建一个Test.h里面包含了所有的接口函数声明和各种头文件的声明~

这样我们一个一个实现,正所谓天下难事必做于细~

#define _CRT_SECURE_NO_WARNINGS
#pragma once//避免头文件的多次包含
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
typedef int SLDataType;//便于类型的改动//定义一个动态顺序表的结构体变量
typedef struct SeqList
{SLDataType* arr;size_t num;//记录有效数据的个数size_t capacity;//该顺序表的容量大小
}SL;//将该结构体类型重命名为SL//加入增删查改接口//1. 顺序表初始化
void SeqListInit(SL* p);//2. 检查顺序表容量是否已满
void CheckSeqList(SL* p);//3. 顺序表的尾插
void SeqListPushBack(SL* p, SLDataType x);//4. 顺序表的尾删
void SeqListPopBack(SL* p);//5. 顺序表的头插
void SeqListPushFront(SL* p, SLDataType x);//6. 顺序表的头删
void SeqListPopFront(SL* p);//7. 顺序表在pos位置插入
void SeqListInsert(SL* p, size_t pos,SLDataType x);//8. 顺序表在pos位置删除
void SeqListErase(SL* p, size_t pos);//9. 顺序表的查找
int SeqListFind(SL* p,SLDataType x);//如果该数字存在则返回该数字的下标,否则返回-1//10 顺序表的销毁
void SeqListDestory(SL* p);//11. 顺序表的打印
void SeqListPrint(SL* p);

我们将所有函数的实现放在SeqList.c文件中~

2.1 顺序表的初始化

//1. 顺序表初始化
void SeqListInit(SL* p)
{assert(p);//判断指针的有效性p->arr = NULL;p->capacity = 0;p->num = 0;
}

 注意我们这里一定要传址调用~

2.2 检查顺序表容量是否已满

 注释写的很详细了,这里就不做过多的解释~

//2. 检查顺序表容量是否已满
void CheckSeqList(SL* p)
{assert(p);//判断指针的有效性if (p->num == p->capacity){size_t newcapacity=p->capacity == 0 ? p->capacity = 4 : p->capacity * 2;//如果原来没有空间,就给上4,有的话就扩大为原来的两倍SLDataType* ptr = (SLDataType*)realloc(p->arr, newcapacity * sizeof(SLDataType));//动态扩容if (ptr == NULL){perror("realloc fail;");return;}//也可以用assert断言一下p->arr = ptr;//开辟成功将地址传给arrp->capacity = newcapacity;//更新容量}
}

2.3 顺序表的尾插

//3. 顺序表的尾插
void SeqListPushBack(SL* p, SLDataType x)
{assert(p);//判断指针的有效性CheckSeqList(p);//尾插前先判断有没有容量或容量够不够p->arr[p->num] = x;//尾部插入数据p->num++;//有效数加一
}

2.4 顺序表的尾删

//4. 顺序表的尾删
void SeqListPopBack(SL* p)
{assert(p);//判断指针的有效性assert(p->num > 0);//断言存在有效数据p->num--;//尾删一个数据
}

 

2.5 顺序表的头插

//5. 顺序表的头插
void SeqListPushFront(SL* p, SLDataType x)
{assert(p);//判断指针的有效性CheckSeqList(p);//先判断容量是否满了size_t end = p->num;while (end){p->arr[end] = p->arr[end - 1];//整体向后移动end--;}p->arr[0] = x;//头插p->num++;//有效数据加一
}

 

2.6  顺序表的头删

//6. 顺序表的头删
void SeqListPopFront(SL* p)
{assert(p);//判断指针的有效性assert(p->num > 0);//有数据才删除size_t begin = 1;while (begin<p->num){p->arr[begin - 1] = p->arr[begin];//整体向前移动begin++;}p->num--;// 有效数据减一}

 整体往前挪,把头覆盖~

2.7 顺序表在pos位置插入

//7. 顺序表在pos位置插入
void SeqListInsert(SL* p, size_t pos, SLDataType x)
{assert(p);//判断指针的有效性assert(p->num > pos);//pos必须小于num并且大于0CheckSeqList(p);//判断容量是否满了for (int i = p->num; i >pos-1 ; i--){p->arr[i] = p->arr[i - 1];//将pos后面的元素往后挪}p->arr[pos - 1] = x;//在pos位置加入数据p->num++;//有效个数加一
}

 

2.8  顺序表在pos位置删除

//8. 顺序表在pos位置删除
void SeqListErase(SL* p, size_t pos)
{assert(p);//判断指针的有效性assert(p->num > pos);//pos必须小于num并且大于0assert(p->num > 0);//有数据才能删除for (int i = pos; i <p->num; i++){p->arr[i-1] = p->arr[i];//将pos后面的元素往后挪}p->num--;//有效个数减一
}

2.9 顺序表的查找

遍历数组查找~

//9. 顺序表的查找
int SeqListFind(SL* p, SLDataType x)//如果该数字存在则返回该数字的下标,否则返回-1
{assert(p);//断言for (int i = 0; i < p->num; i++){if (p->arr[i] == x){return i;//查到返回下标}}return -1;//没有查到
}

2.10 顺序表的销毁

//10 顺序表的销毁
void SeqListDestory(SL* p)
{assert(p);//判断指针的有效性free(p->arr );//释放动态内存开辟的空间p->arr = NULL;p->capacity = 0;//容量置为0p->num = 0;//有效个数置为0
}

2.11 顺序表的打印

//11. 顺序表的打印
void SeqListPrint(SL* p)
{assert(p);//判断指针的有效性if (p->num == 0){printf("顺序表为空!\n");return;}for (int i = 0; i < p->num; i++){printf("%d ", p->arr[i]);//打印数据}printf("\n");
}

 3. 我在实现顺序表时的测试代码

我创建了一个Test.c来测试各个部分的功能~

#define _CRT_SECURE_NO_WARNINGS
#include"Test.h"void TestSeqList()
{SL s1;SeqListInit(&s1);//初始化SeqListPushBack(&s1, 1);//尾插一个1;SeqListPushBack(&s1, 2);//尾插一个2;SeqListPushBack(&s1, 3);//尾插一个3;SeqListPushBack(&s1, 4);//尾插一个4;SeqListPushBack(&s1, 5);//尾插一个5;SeqListInsert(&s1, 3, 9);//在第三个位置插入9SeqListErase(&s1, 3);//删除第三个位置int ret=SeqListFind(&s1, 3);if (ret != -1)printf("你要查找的数据的下标为:%d\n", ret);elseprintf("抱歉,你要查找的数据没有找到!\n");//SeqListPopBack(&s1);//尾删一个数据//SeqListPushFront(&s1,30);//头插一个数据//SeqListPopFront(&s1);//头删一个数据SeqListPrint(&s1);//打印数据
}int main()
{//测试顺序表TestSeqList();return 0;
}

4. 完结散花

好了,这期的分享到这里就结束了~

如果这篇博客对你有帮助的话,可以用你们的小手指点一个免费的赞并收藏起来哟~

如果期待博主下期内容的话,可以点点关注,避免找不到我了呢~

我们下期不见不散~~

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

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

相关文章

考研数学——高数:多元函数微分法及其应用

因为复习阶段全篇很细节的写下来一来比较费时间&#xff0c;二容易导致为了记笔记而记。 接下来的内容只会保留上课中比较有意义的地方&#xff0c;以及有自己助于理解的想法 全微分 助记&#xff1a; 证明是否可微&#xff0c;首先判断两个偏导数是否存在&#xff0c;不存在则…

中文版国产Figma简单好上手

在过去的两年里&#xff0c;国内外协同办公室发展迅速。一方面&#xff0c;它是由突如其来的疫情推动的&#xff0c;另一方面&#xff0c;它是科学技术不断进步的必然结果。在市场的推动下&#xff0c;市场上出现了越来越多的协同办公软件&#xff0c;使工作场所的工作更加高效…

插入排序和归并排序

插入排序&#xff0c;Insertion Sort. 给出伪代码 for i 1,2,...,n-1Insert A[i] into Sorted array A[0:i-1]by swaping down to the correct position. 冒泡排序 冒泡排序就是一种插入排序算法。 i ← 1 while i < length(A)j ← iwhile j > 0 and A[j-1] > A…

CorelDRAW2024专业级图形设计矢量图形设计软件

CorelDRAW2024是一款功能强大的矢量图形设计软件&#xff0c;适用于专业级图形设计作品的设计师和创作者。它提供了智能对象、布局、插图和模板等功能&#xff0c;可以帮助用户快速创建高质量的设计作品。 这款软件的用户界面直观且易于使用&#xff0c;允许用户快速访问和管理…

184基于matlab的相关向量机(RVM)回归和分类算法

基于matlab的相关向量机&#xff08;RVM&#xff09;回归和分类算法。该算法基于贝叶斯稀疏核⽅法&#xff0c;避免了支持向量机&#xff08;SVM&#xff09;的主要局限性。RVM关键是为每个权参数 都引入一个单独的超参数 &#xff0c;而不是一个共享超参数。程序已调通&#x…

力扣hot100:42.接雨水(双指针/动态规划/贪心)

什么时候能用双指针&#xff1f; &#xff08;1&#xff09;对撞指针&#xff1a; ①两数和问题中可以使用双指针&#xff0c;先将两数和升序排序&#xff0c;可以发现规律&#xff0c;如果当前两数和大于target&#xff0c;则右指针向左走。 ②接雨水问题中&#xff0c;左边最…

【Web】浅聊JDBC的SPI机制是怎么实现的——DriverManager

目录 前言 分析 前言 【Web】浅浅地聊JDBC java.sql.Driver的SPI后门-CSDN博客 上篇文章我们做到了知其然&#xff0c;知道了JDBC有SPI机制&#xff0c;并且可以利用其Driver后门 这篇文章希望可以做到知其所以然&#xff0c;对JDBC的SPI机制的来源做到心里有数 分析 先是…

Python 弱引用全解析:深入探讨对象引用机制!

目录 前言 弱引用的概述 弱引用的原理 使用 WeakRef 类创建弱引用 使用 WeakValueDictionary 类创建弱引用字典 实际应用场景 1. 解决循环引用问题 2. 对象缓存 总结 前言 在Python编程中&#xff0c;弱引用&#xff08;Weak Reference&#xff09;是一种特殊的引用方式…

(文末送书)《低代码平台开发实践:基于React》

最近&#xff0c;我发现了一个超级强大的人工智能学习网站。它以通俗易懂的方式呈现复杂的概念&#xff0c;而且内容风趣幽默。我觉得它对大家可能会有所帮助&#xff0c;所以我在此分享。点击这里跳转到网站。 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&am…

PCM会重塑汽车OTA格局吗(2)

目录 1.概述 2. PCM技术视角下的OTA 3.小结 1.概述 上一篇文章&#xff0c;我们着重讲解了OTA的概述内容&#xff0c;和意法半导体推出的跨域融合MCU的四大特征&#xff0c;其中就包含了OTA技术。 他们针对OTA做了比较创新的设计&#xff0c;在总的可用memory容量不变情况…

2024最新Android开发面试解答,学海无涯

一个程序员&#xff0c;如果不想35 岁被淘汰&#xff0c;请把它当成一种信仰&#xff01; 25岁&#xff0c;一个北漂程序员&#xff0c;入职三年&#xff0c;Android中级工程师&#xff0c;月薪15k&#xff0c;965的工作经常干成996&#xff0c;比起老家的同龄人&#xff0c;我…

15-Linux部署HBase集群

Linux部署HBase集群 简介 HBase 是一种分布式、可扩展、支持海量数据存储的 NoSQL 数据库。 和Redis一样&#xff0c;HBase是一款KeyValue型存储的数据库。 不过和Redis设计方向不同 Redis设计为少量数据&#xff0c;超快检索HBase设计为海量数据&#xff0c;快速检索 HB…

数据结构:排序算法+查找算法

一、概念 程序数据结构算法 1.算法的特性和要求 特性&#xff1a; 确定性&#xff08;每次运行相同的输入都是同样的结果&#xff09;、有穷性、输入、输出、可行性 设计要求&#xff1a; 正确性、高效率、低存储、健壮性、可读性 2.时间复杂度 3.常见排序算法的时间复杂…

LeNet训练集详细实现

一、下载训练集 导包 import torch import torchvision import torch.nn as nn from model import LeNet import torch.optim as optim import torchvision.transforms as transforms import matplotlib.pyplot as plt import numpy as npToTensor()函数&#xff1a; 把图像…

视频二维码加密怎么设置?验证密码看内容的二维码做法

现在为了保障内容的私密性&#xff0c;很多人会采用生成二维码的方式来展现或者传递自己的内容&#xff0c;比如文件、视频、音频等等。如果我们想要制作一个视频二维码&#xff0c;并且给二维码加密后需要输入正确密码才能查看视频内容&#xff0c;这种类型的二维码的制作方式…

就业班 2401--3.5 Linux Day11--DNS解析

DNS域名解析服务 少壮不努力&#xff0c;老大徒伤悲。一、 1.DNS介绍 DNS 是域名系统 (Domain Name System) 的缩写&#xff0c;是因特网的一项核心服务&#xff0c;它作为可以将域名和IP地址相互映射的一个分布式数据库&#xff0c;能够使人更方便的访问互联网&#xff0c;…

numpy——基础知识(创建/类型/形状/运算)(python)

简介 NumPy 是一个 Python 包。它代表 Numeric Python。 它是一个由多维数组对象和用于处理数组的例程集合组成的库。 Numeric&#xff0c;即 NumPy 的前身&#xff0c;是由 Jim Hugunin 开发的。 也开发了另一个包 Numarray &#xff0c;它拥有一些额外的功能。 2005年&#…

VueCli的安装与卸载

文章目录 一.Node安装包的报读网盘提取码二、Vue脚手架Cli三、Vue-CLI使用步骤(自定义安装)1.转换路径并创建项目2.创建步骤的解释(保姆级)3.等待vue项目自己创建好(保姆级) 四、通过npm对vue的安装与卸载 一.Node安装包的报读网盘提取码 下面的链接为地址: Node的百度网盘提取…

Redis(5.0)

1、什么是Redis Redis是一种开源的、基于内存、支持持久化的高性能Key-Value的NoSQL数据库&#xff0c;它同时也提供了多种数据结构来满足不同场景下的数据存储需求。 2、安装Redis&#xff08;Linux&#xff09; 2.1、去官网&#xff08;http://www.redis.cn/&#xff09;下…

linux安装ngnix

一、将nginx-1.20.1.tar.gz上传至linux服务器目录下 二、将nginx安装包解压到/usr/local目录下 tar -zxvf /home/local/nginx-1.20.1.tar.gz -C /usr/local/三、预先安装依赖 yum -y install pcre-devel yum -y install openssl openssl-devel yum -y install gcc gcc-c auto…