发布时间:2023-06-27 15:30
目录
一,线性表
二,顺序表
顺序表的分类
顺序表缺陷
试题
三,链表
链表的分类(总共可分为八种)
单链表(单向无头不循环)
双向链表
顺序表和链表的区别
备注
一,线性表
二,顺序表
//静态顺序表,顺序表的静态存储
#define N 7
typedef int SLDataType;
typedef struct SeqList
{
SLDataType data[N]; //定长数组
size_t size; //有效数据个数
}SeqList;
//动态顺序表,顺序表的动态存储
typedef int SLDataType;
typedef struct SeqList
{
SLDataType* data; //指向动态开辟的数组
size_t size; //有效数据个数
size_t capicity; //容量空间(涉及扩容)
}SeqList;
接口实现
// 基本增删查改接口
// 顺序表初始化
void SeqListInit(SeqList* psl);
// 检查空间,如果满了,进行增容
void CheckCapacity(SeqList* psl);
// 顺序表尾插
void SeqListPushBack(SeqList* psl, SLDataType x);
// 顺序表尾删
void SeqListPopBack(SeqList* psl);
// 顺序表头插
void SeqListPushFront(SeqList* psl, SLDataType x);
// 顺序表头删
void SeqListPopFront(SeqList* psl);
// 顺序表查找
int SeqListFind(SeqList* psl, SLDataType x);
// 顺序表在pos位置插入x
void SeqListInsert(SeqList* psl, size_t pos, SLDataType x);
// 顺序表删除pos位置的值
void SeqListErase(SeqList* psl, size_t pos);
// 顺序表销毁
void SeqListDestroy(SeqList* psl);
// 顺序表打印
void SeqListPrint(SeqList* psl);
注:完整接口实现代码路径;
三,链表
单链表(单向无头不循环)
//单链表(无头单向不循环)
typedef int SLDataType;
typedef struct SListNode
{
SLDataType data;
struct SListNode* next;
}SListNode;
接口实现
//基本增删查改接口
//动态申请空间,生成一个节点
SListNode* BuySListNode(SLDataType x);
//单链表尾插
void SListNodePushBack(SListNode** pphead, SLDataType x);
//单链表头插
void SListNodePushFront(SListNode** pphead, SLDataType x);
//单链表尾删
void SListNodePopBack(SListNode** pphead);
//单链表头删
void SListNodePopFront(SListNode** pphead);
//单链表查找,先查找根据返回位置进行修改(无需在增加修改接口)
SListNode* SListNodeFind(SListNode* phead, SLDataType x);
//单链表指定位置前插入,先查找在根据返回位置插入(插入时还需遍历链表效率低)
//单链表不适合在指定位置前面插入
void SListNodeInsertBefore(SListNode** pphead, SListNode* pos, SLDataType x);
//单链表指定位置后插入,先查找在根据返回位置插入
void SListNodeInsertAfter(SListNode* pos, SLDataType x);
//单链表指定位置删除,先查找在根据返回位置删除(删除时还需遍历链表效率低)
//单链表不适合在指定位置删除
void SListNodeErase(SListNode** pphead, SListNode* pos);
//单链表指定位置后删除
void SListNodeEraseAfter(SListNode* pos);
//单链表节点释放
void SListNodeDestroy(SListNode** pphead);
//单链表打印
void SListNodePrint(SListNode* phead);
//单链表节点个数
int SListNodeSize(SListNode* phead);
//是否为空链表
bool SListNodeEmpty(SListNode* phead);
注:完整接口实现代码路径;
试题
判断链表是否带环
分析:假设fast比slow快一倍,则L=M
推导出:
或
结论:
头节点到入环起始节点之间的节点数等于相遇节点到入环起始节点之间的节点数!
即,一指针从头走,一指针从相遇节点走,每次均走一步,最终会在入环节点相遇;
带头双向循环链表
//双向链表
typedef int SLDataType;
typedef struct SListNode
{
struct SListNode* prev;
struct SListNode* next;
SLDataType data;
}SListNode;
接口实现
//基本增删查改接口
//初始化链表,会创建头节点(哨兵)
void SListInit(SListNode** pphead);
//链表尾插
void SListPushBack(SListNode* phead, SLDataType x);
//链表尾删
void SListPopBack(SListNode* phead);
//链表头插
void SListPushFront(SListNode* phead, SLDataType x);
//链表头删
void SListPopFront(SListNode* phead);
//查找节点
SListNode* SListFind(SListNode* phead, SLDataType x);
//指定位置前插入
void SListInsert(SListNode* pos, SLDataType x);
//指定位置删除
void SListErase(SListNode* pos);
//打印链表
void SListPrint(SListNode* phead);
//释放链表节点
void SListDestroy(SListNode* phead);
//求链表的节点数
size_t SListSize(SListNode* phead);
//判断是否为空链表
bool SListEmpty(SListNode* phead);
注:完整接口实现代码路径;
顺序表和链表的区别
储存空间:
随机访问(下标访问):
任意位置插入或删除元素:
插入元素:
应用场景:
缓存利用率
备注
拓展:与程序员相关的CPU缓存知识;