问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

C语言动态顺序表的实现

创作时间:
作者:
@小白创作中心

C语言动态顺序表的实现

引用
CSDN
1.
https://m.blog.csdn.net/Wangshijie1015/article/details/145669108

一、顺序表的概念

顺序表是线性表的一种。而线性表(linear list)是n个具有相同特性的数据元素的有限序列。线性表是一种在实际中广泛应用的数据结构,常见的线性表有顺序表、链表、栈、队列、字符串等。

线性表在逻辑上是线性结构,也就是说是连续的一条直线。但是在物理结构上不一定连续,线性表在物理上存储时,通常以数组和链式结构的形式存储。

二、顺序表分类

顺序表的底层结构是数组,对数组的封装,实现了常用的增删改查等接口。

1.静态顺序表

概念:使用定长数组存储元素。

静态顺序表缺陷:空间给少了不够用,给多了造成空间浪费。

2.动态顺序表

动态顺序表克服了静态顺序表的缺点,可以根据需要动态分配空间。

三、动态顺序表的实现

1.所要创建的三个文件

我们需要创建三个文件,一个头文件和两个源文件。

  • SeqList.h:用于声明后续所出现的函数和所需要的头文件,以及动态顺序表的创建。
  • SeqList.c:用于写实现这些函数的具体代码。
  • test.c:用于测试这些函数是否能够实现相应功能。

2.头文件中的内容

以下就是动态顺序表的创建和实现动态顺序表中功能所设计的函数和相关头文件。

3.功能的具体实现

1.顺序表的初始化

我们首先将顺序表的地址置为空(NULL),将有效元素个数(size)和空间大小(capacity)初始化为0。

2.顺序表的销毁

我们先提前写这个销毁功能以免后续我们忘记。

首先我们需要判断地址的有效性,确认有效后我们再把顺序表存放数据时申请的动态内存释放,并把指针置空,有效数据个数和空间大小赋值为0。

3.从顺序表的头部插入数据

插入元素之前我们需要做两件事:

  1. 判断传过来的地址是不是NULL。
  2. 判断顺序表的空间够不够用了,避免空间不足导致元素没地方放导致越界访问。

当然,因为后续的多个功能也需要判断顺序表的功能够不够,因此我们需要单独为其写一个函数,方便后续使用和简短整体代码。

下面有for循环和使用memmove函数两种方法均可实现

判断空间的函数如下:

判断空间不够的时候我们也会同时使用realloc为其动态分配空间

(每次空间不够用再为其分配空间时,分配的空间是整体的2倍,这边涉及的是概率论,不仔细展开讲解)

需要注意的是:我们动态分配的空间需要先使用另一个指针变量先进行接受,确认成功申请到空间后我们再把申请到的空间给顺序表,不然如果申请失败的话会导致原本在顺序表的数据丢失。

功能实际效果展示:

SLPrint也是为了后续打印顺序表的方便所写的函数,具体实现如下:

4.从顺序表尾部插入数据

同样先判断地址和空间的有效性

功能实际实现展示:

5.删除顺序表头部数据

一样先判断地址的有效性,因为是删除操作,所以要确保顺序表里的有效元素个数不能为0,可以使用for循环或者memmove函数完成后续具体操作

代码实际实现展示:

6.删除顺序表尾部数据

一样判断地址和元素个数的有效性,不一样的是尾部删除操作没头部删除操作那么复杂,直接将有效元素个数-1即可。

功能实际实现展示:

7.在顺序表指定位置插入数据

我们不再是简单的在头部或者尾部插入元素,而是甚至可以在中间插入元素。

注意先判断地址的有效性和空间够不够用,也要注意要插入的位置下标pos也有局限性

后续具体实现可以使用for循环或者memmove函数实现。

功能实际实现展示:

8.删除顺序表指定位置数据

一样判断地址、空间和删除位置下标pos的有效性。

功能实际实现展示:

9.查找顺序表中某个元素的下标

注意判断地址的有效性

功能实际实现展示:

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号