码字不易,对你有帮助 点赞/转发/关注 支持一下作者
微信搜公众号:不会编程的程序圆
看更多干货,获取第一时间更新
【数据结构轻松学】系列 Github :https://github.com/hairrrrr/Date-Structure
本文的代码已上传至 Github
目录
正文
一 顺序表
1. 结构
静态顺序表
使用定长数组
#define N 100
typedef int SLDataType;
typedef struct SeqList
{
SLDataType array[N]; // 定长数组
size_t size; // 有效数据的个数
}SeqList;
动态顺序表
typedef int DataType; // 可扩展性
typedef struct SeqList
{
DataType* array; // 指向动态开辟的数组
size_t size; // 有效数据个数
size_t capicity; // 容量空间的大小
}SeqList;
2. 接口实现
void SeqListPushBack(plist sl, DataType data); // 尾插
void SeqListPushFront(plist sl, DataType data); // 头插
void SeqListPopBack(plist sl); // 尾删
void SeqListPopFront(plist sl); // 头删
void SeqListInsert(plist sl, size_t pos, DataType data); // pos 位插入 x
void SeqListRemove(plist sl, size_t pos); // pos 位删除
void SeqListInit(plist sl, size_t capacity); // 初始化
void SeqListDestory(plist sl); // 销毁
void SeqListPrint(plist sl); // 打印
void SeqListCheckCapacity(plist sl); // 检查空间是否已经满,如果满了,就扩容
3. 顺序表的优劣势
劣势:
- 中间/头部的插入删除,时间复杂度为O(N)
- 增容需要申请新空间,拷贝数据,释放旧空间。会有不小的消耗。
- 增容一般是呈2倍的增长,势必会有一定的空间浪费。例如当前容量为100,满了以后增容到200,我们再继续插入了5个数据,后面没有数据插入了,那么就浪费了95个数据空间
优势:
空间连续,支持随机访问。
二 链表
1. 无头单向非循环链表
接口实现:
typedef int Type;
typedef struct Node
{
struct Node* _next;
Type _data;
}Node;
//实现不带头单向非循环链表
typedef struct SingleList
{
Node* _head; // head: 表示链表真正的头结点,即第一个有效的数据的位置
}SingleList;
void singleListInit(SingleList* sl);
Node* creatNode(Type data);
void singleListPushBack(SingleList* sl, Type data);
void singleListPopBack(SingleList* sl);
void singleListPushFront(SingleList* sl, Type data);
void singleListPopFront(SingleList* sl);
void singleListInsertAfter(Node* pos, Type data);
void singleListEraseAfter(Node* pos);
Node* find(SingleList* sl, Type data);
void singleListPrint(SingleList* sl);
void singleListDestroy(SingleList* sl);
2. 带头双向循环链表
接口实现
typedef int DataType;
// 结点类型
typedef struct ListNode
{
DataType data;
struct ListNode* next;
struct ListNode* prev;
}ListNode;
// 表头
typedef struct ListHead {
ListNode* head;
}ListHead;
// 接口
void ListCreate(ListHead* plist);
void ListDestory(ListHead* plist);
void ListPrint(ListHead* plist);
void ListPushBack(ListHead* plist, DataType data);
void ListPopBack(ListHead* plist);
void ListPushFront(ListHead* plist, DataType data);
void ListPopFront(ListHead* plist);
ListNode* ListFind(ListHead* plist, DataType data);
void ListInsert(ListNode* pos, DataType data);
void ListErase(ListNode* pos);
3. 链表的优劣势
优势:
以节点为单位存储,不支持随机访问
劣势:
- 任意位置插入删除时间复杂度为O(1)
- 没有增容问题,插入一个开辟一个空间。
查看【数据结构轻松学】更详细的目录: https://github.com/hairrrrr/Date-Structure
不要忘记 star 呦~
欢迎大家在 评论区/私信 提出问题/指正错误,谢谢观看。
我是程序圆,我们下次再见。