一.线性表
线性表是n个具有相同特性的数据元素的有限序列。线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表,链表,栈,队列,字符串.....
线性表在逻辑上是线性结构,也就是说是连续的一条直线。但是在物理结构上并不一定是连续的,线性表在物理上存储时,通常以数组和链式结构的形式存储。
二.顺序表
1.概念与结构
概念:顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。顺序表的底层结构是数组,对数组进行了封装,实现了常用的增删查改等接口。
2.分类
2.1静态顺序表
使用定长数组存储元素,缺点是:空间给少了不好用,给多了又造成空间浪费。
//定义动态顺序表结构
typedef int SLDatatype;
#define N
typedef struct Seqlist
{
SLDatatype* arr[N];//定长数组
int size;//有效数据个数
}SL;
2.2动态顺序表
//定义动态顺序表结构
typedef int SLDatatype;
typedef struct Seqlist
{
SLDatatype* arr;
int capacity;//空间大小
int size;//有效数据个数
}SL;
相较于静态顺序表:动态顺序表可以灵活调整空间大小,将空间浪费降到最低。
三.链表
1.概念与结构
概念:链表是一种物理存储结构上非连续,非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。我们可以把链表想象成火车一节连接着一节
2.结点
与顺序表不同的是,链表里的没接车厢都是独立申请下来的空间,我们称之为结点。
结点的组成主要有两个部分:当前结点要保存的数据和保存下一个结点的地址(指针变量)。
3.链表的性质
1.链式机构在逻辑上是连续的,在物理结构上不一定连续,因为空间是系统随机分配的。
2.结点一般是从堆上申请的。
3.从堆上申请来的空间,是按照一定策略分配出来的,每次申请的空间可能连续,可能不连续。
4.实现单链表
//单链表结点的创建
typedef int SLTDatatype;
typedef struct SLTNode
{
SLTDatatype data;
struct SLTNode* next;
}SLTNode;
//链表打印
void SLPrint(SLTNode* phead)
{
SLTNode* pcur = phead;
while (pcur)
{
printf("%d->", pcur->data);
pcur = pcur->next;
}
printf("NULL\n");
}