1.线性表
什么是线性表呢大家往下面看:
其实线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表是⼀种在实际中⼴泛使 ⽤的 数据结构,常⻅的线性表:顺序表、链表、栈、队列、字符串( 线性表在逻辑上是线性结构,也就说是连续的⼀条直线。但是在物理结构上并不⼀定是连续的, 线性表在物理上存储时,通常以数组和链式结构的形式存储 。 ) 2.顺序表 顺序表是⽤⼀段物理地址连续的存储单元依次存储数据元素的线性结构,⼀般情况下采⽤数组 存储 。 想必大家有很多疑问这不就是数组嘛为什么叫顺序表呢那他俩的区别到底是啥呢? 其他他俩的区别在于 顺序表的底层结构是数组,对数组的封装,实现了常⽤的增删改查等接⼝ 2.2 分类 2.2.1静态顺序表 静态顺序表缺点: 就是空间少了不够用,空间多了又造成空间的浪费,那有没有好的方法呢? 接下来就要说到动态顺序表了 2.2.2 动态顺序表 动态顺序表:可以增肉当你空间不够用的时候可以去扩大空间.那这个空间是想扩大多少就扩大多少吗?请思考一下。 2.3顺序表问题与思考 中间/头部的插⼊删除,时间复杂度为O(N) 增容需要申请新空间,拷⻉数据,释放旧空间。会有不⼩的消耗。 增容⼀般是呈2倍的增⻓,势必会有⼀定的空间浪费。例如当前容量为100,满了以后增容到200, 我们 2.3.1 动态顺序表的实现 一般实现要分为三个文件:顺序表头文件,顺序表源文件,顺序表测试文件 Seqlist.h (顺序表头文件--名字可以自己取) #define INIT_CAPACITY 4 typedef int SLDataType;---- 不知道具体类型可以使用声明方便后期修改 // 动态顺序表 -- 按需申请 typedef struct SeqList { SLDataType* a;--- 定义一个顺序表数组 int size; ----- 有效数据个数 int capacity; ----- 空间容量 }SL; void SLInit(SL* ps);--- 初始化声明 void charu(SL* ps, SLDatatype x);---- 尾插 Seqlist.c (顺序表源文件) #include "Seqlist.h"void SLinit(SL *ps)------ 初始化
{
ps->arr = NULL;
ps->size = ps->capacity = 0;
}
void charu(SL* ps, SLDatatype x)------- 扩容
{
if (ps->size == ps->capacity)----- -判断有效数据和空间是不是一样如如果一样就扩容
{
int newcapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;
SLDatatype *tmp = (SLDatatype*)realloc(ps->arr,newcapacity *2*sizeof(SLDatatype));
if (tmp == NULL)------ 判断扩容是否成功
{
perror("realloc fail");
exit(1);
}
ps->arr = tmp;--------- 把新的空间赋给数组
ps->capacity = newcapacity;---------把新的容量赋给原来的
}
ps->arr[ps->size++] = x;---- 尾插
} Test.c (顺序表测试文件)
#include "Seqlist.h"
void SLtest()
{
SL sl; ---声明一个结构体
SLinit(&sl);
charu(&sl,1);
}
int main()
{
SLtest();
}