数据结构底层实现的物理结存储构说到底无非就是 —— 数组(Array) 和 链表(LinkList)。
线性表定义
具有相同特征的数据元素的一个有限序列。
顺序存储结构 —— 顺序表
- 连续的一段存储空间,逻辑上相邻元素,物理存储上也是相邻的。
- 直接通过一个下标获取到表中某个元素。
- 顺序表存储数据时,会提前申请一整块足够大小的物理空间
头文件:”OrderList.h”
1 |
|
以下:“OrderList.c”
1、初始化顺序表:
这里可以指定初始化大小size,通过malloc函数动态获取内存空间,返回一个已经定义好的结构的表。
- 初始化分配内存空间
- 指针指向内存空间
- 设置总空间size
- 设置当前使用长度length
1 | /*初始化顺序表*/ |
2、动态扩容操作
在使用过程中,我们可能会往表里面不断加入数据,但是我们刚才默认申请的内存空间是10,当空间不够用了,我们需要灵活的增加,如下:
- 定义一个数据指针
- 开辟一片原来空间大小2倍的新内存空间,用指针指向它
- 拷贝原来数据指针指向空间的数据,到新开辟区域内
- 重置空间大小参数size
- 原来的表数据指针指向新申请的空间地址
1 | /*动态扩容*/ |
3、销毁表
只需要 使用 free() 函数 释放掉数据指针即可
1 | /*销毁顺序表*/ |
4、判断为空
1 | /*是否为空*/ |
5、插入元素【从数据中间和末尾都要考虑】
- 指定插入位置
- 如果插入位置在已有元素中间,则要往后移动元素,如果空间不足要动态扩容
- 如果插入位置没有存储数据,直接放入即可
- 长度length增加
1 | /*插入新元素*/ |
6、末尾追加元素
在现有数据的最后追加元素
- 直接放在length位置,并增加长度即可
1 | /*末尾添加元素*/ |
7、按照下标删除元素
指定位置往后的元素向前移动,长度减少
- 删除第i位,从第i 位 开始往后到元素末尾,依次往前移动
1 | /*删除元素-按照下标*/ |
8、删除元素-按照元素名
可设置是否删除所有重复的,delAll 为 FALSE只删除查找到的第一个
- 注意,删除一个元素,会移动元素,下标随之改变,所以,需要从头再搜索
1 | /*删除元素-按照元素值*/ |
9、排序
1 | /*冒泡排序*/ |
10、查找
1 | /*暴力查找元素*/ |
11、打印输出
1 | /*打印顺序表所有元素*/ |
主程序使用
1 |
|
链式存储结构 —— 链表
在链式存储结构中,不仅含有元素本身信息(数据域),而且包含元素之间的逻辑关系信息(指针域)。
单链表
除了数据元素本身外,应该包含一个指针域,用以指向当前元素的后继节点。
定义如下:
1、结构体
1 | typedef char *elemType; |
2、创建一个单链表节点
1 | /*创建一个数据节点*/ |
3、尾插法
1 | /*尾插*/ |
4、头插法
1 | /*头插*/ |
打印单链表
1 | /*打印单链表*/ |