文章目录
线性表
定义
有顺序且有限的相同类型的数据元素的集合
eg:星座列表
星座通常以白羊座开始 双鱼座结尾 星座都有前驱后继 一共有十二个
数学定义
线性表是具有相同类型的n个数据元素的有限序列
a1 a2 ·······an
ai 是表项 n是表长度
性质
a0为线性表第一个元素 只有后继
an是最后一个 只有前驱
线性表可以逐项访问 顺序存取
线性表操作
创建线性表
销毁线性表
清空线性表
将元素插入线性表
将元素从线性表中删除
获取线性表中某个位置的元素
获取线性表的长度
#ifndef _WBM_LIST_H_
#define _WBM_LIST_H_
typedef void List;
typedef void ListNode;
//创建并且返回一个空的线性表
List* List_Create();
//销毁一个线性表list
void List_Destroy(List* list);
//将一个线性表list中的所有元素清空, 线性表回到创建时的初始状态
void List_Clear(List* list);
//返回一个线性表list中的所有元素个数
int List_Length(List* list);
//向一个线性表list的pos位置处插入新元素node
int List_Insert(List* list, ListNode* node, int pos);
//获取一个线性表list的pos位置处的元素
ListNode* List_Get(List* list, int pos);
//删除一个线性表list的pos位置处的元素 返回值为被删除的元素,NULL表示删除失败
ListNode* List_Delete(List* list, int pos);
#endif
线性表的顺序存储结构
即一段地址连续 的 存储单元依次存储线性表的数据元素
插入元素算法
判断线性表是否合法
判断插入位置是否合法
把最后一个元素到插入位置的元素后移一个位置
将新元素插入
线性表长度加1
获取元素算法
判断线性表是否合法
判断位置是否合法
直接通过数组下标的方式获取元素
删除元素算法
判断线性表是否合法
判断删除位置是否合法
将元素取出
将删除位置后的元素分别向前移动一个位置
线性表长度减1
特点
优点:无需为线性表的逻辑关系增加额外的空间
可快速获取表中合法位置的元素
缺点:插入删除需要移动大量的元素
线性表长度变化较大时难以确定存储空间的容量
线性表的链式存储结构
每个数据元素除了存储本身的数据之外 还要存储指示其直接后继的信息。
表头节点
包含指向第一个数据元素的指针和自身信息
数据节点
包含指向下一个数据元素的指针和数据元素的信息
尾结点
最后一个数据节点 其下一个元素指针为空 无后继
链表领域技术推演
传统链表
简单好用 但不能实现数据域和指针域的分离
Linux内核链表
用数据域包含指针域 缺点是要计算偏移量
企业通用链表
用数据域包含指针域 不用计算偏移量
分类
单链表
双链表
循环链表
特点
无需一次性制定链表的容量‘ 插入删除元素操作无需移动数据元素
数据元素必须保存后继元素的位置信息
获取指定数据的元素操作需要顺序访问之前的元素