【数据结构轻松学 二】顺序表 和 链表

码字不易,对你有帮助 点赞/转发/关注 支持一下作者

微信搜公众号:不会编程的程序圆

看更多干货,获取第一时间更新

【数据结构轻松学】系列 Github :https://github.com/hairrrrr/Date-Structure

本文的代码已上传至 Github

看更好的排版,阅读原文:
https://mp.weixin.qq.com/s/QhRWUPCxZPm1ViojONscWg

目录


toc

正文


一 顺序表

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. 顺序表的优劣势

劣势:

  1. 中间/头部的插入删除,时间复杂度为O(N)
  2. 增容需要申请新空间,拷贝数据,释放旧空间。会有不小的消耗。
  3. 增容一般是呈2倍的增长,势必会有一定的空间浪费。例如当前容量为100,满了以后增容到200,我们再继续插入了5个数据,后面没有数据插入了,那么就浪费了95个数据空间

优势:

空间连续,支持随机访问。

二 链表

image

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. 链表的优劣势

优势:

以节点为单位存储,不支持随机访问

劣势:

  1. 任意位置插入删除时间复杂度为O(1)
  2. 没有增容问题,插入一个开辟一个空间。

查看【数据结构轻松学】更详细的目录: https://github.com/hairrrrr/Date-Structure

不要忘记 star 呦~

欢迎大家在 评论区/私信 提出问题/指正错误,谢谢观看。

我是程序圆,我们下次再见。

你可能感兴趣的:(【数据结构轻松学 二】顺序表 和 链表)