线性表设计与实现

线性表

定义

有顺序且有限的相同类型的数据元素的集合

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内核链表

在这里插入图片描述

用数据域包含指针域 缺点是要计算偏移量

企业通用链表

在这里插入图片描述

用数据域包含指针域 不用计算偏移量

分类
单链表

在这里插入图片描述

双链表

在这里插入图片描述

循环链表

在这里插入图片描述

特点

无需一次性制定链表的容量‘ 插入删除元素操作无需移动数据元素

数据元素必须保存后继元素的位置信息
获取指定数据的元素操作需要顺序访问之前的元素

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

。✧* ꧁流痕꧂✧*。

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值