Java教程

线性表设计与实现

本文主要是介绍线性表设计与实现,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

文章目录

    • 线性表
      • 定义
      • 数学定义
      • 性质
      • 线性表操作
      • 线性表的顺序存储结构
        • 插入元素算法
        • 获取元素算法
        • 删除元素算法
        • 特点
      • 线性表的链式存储结构
        • 表头节点
        • 数据节点
        • 尾结点
        • 链表领域技术推演
          • 传统链表
          • Linux内核链表
          • 企业通用链表
        • 分类
          • 单链表
          • 双链表
          • 循环链表
        • 特点

线性表

定义

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

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

在这里插入图片描述

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

企业通用链表

在这里插入图片描述

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

分类

单链表

在这里插入图片描述

双链表

在这里插入图片描述

循环链表

在这里插入图片描述

特点

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

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

这篇关于线性表设计与实现的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!