火影推荐程序连载72- 线性表的存储结构

今天开始线性表部分的梳理,线性表主要分为了基础概念基本操作两大部分,由于某些过程或概念比较抽象,我添加了部分图示,希望能够把这些抽象的东西直观的表达出来。

 

基本操作模块重点主要在单链表顺序表两部分,本文着重梳理了线性表插入、删除、查询等基础方法并搭配了部分实例供参考。

 

1  基本概念

对于线性表来说,它是一组相同元素的有限序列,元素的个数就是线性表的长度,当元素个数为 0 时,线性表就是空表。

 

数据结构包括逻辑结构、存储结构和算法。线性表的基本概念这里主要看线性表的逻辑结构和存储结构就可以了。

 

1.1 线性表的逻辑结构

 

线性表的逻辑特性很好理解,由于是相同元素的有限序列,可以类比生活中的排队场景:

  • 只有一个表头元素,表头元素没有前驱

  • 只有一个表尾元素,表尾元素没有后继

  • 除表头表尾元素外,其他元素都只有一个前驱和一个后继

 

 

1.2 线性表的存储结构

 

线性表的存储结构有两类:顺序表和链表

  System.out.println(list.stream( www.haoranjupt.com).min((www.baihua178.cn b) -> a-b).get()); // 1
  
  System.out.println(www.wangffzc.cn list.stream(www.tengyueylzc.cn).count(www.baihuayllpt.cn));//
  
  String str =www.qitianylezc.cn"11,22,33,44,55";
  
  System.out.println(Stream.of(str.split(www.lthczcgw.cn",")).mapToInt(www.baihuayl7.cn -> Integer.valueOf(x)).sum());
  
  System.out.println(Stream.of(str.split("www.lanboylgw.com,")).mapToInt(Integer::valueOf).sum());
  
  System.out.println(Stream.of(str.split(www.shentuylzc.cn",")).map(x -www.javachenglei.com> Integer.valueOf(x)).mapToInt(x -> x).sum());
  
  System.out.println(Stream.of(str.split www.baihua178.cn,")).map(Integer::valueOf).mapToInt(x www.yuchengyule.com-> x).su

  • 顺序表

将线性表的元素按照逻辑关系,存储到指定位置开始的一块连续的存储空间。

特性:占用一块连续的存储空间,随机读取,插入(删除)时需要移动多个元素

 

  • 链表

链表包含指针域与数值域两部分,因此存储不需要占用连续空间,由指针来连接记录结点位置信息,通过前驱节点的指针找到后继结点。

特性:动态分配空间,顺序读取,插入(删除)时不需要移动元素。

 

顺序表和链表对比.jpg

 

链表的分类如下:

 

  • 单链表

每个节点包含数据域与指针域,单链表分为带头节点的和不带头结点的。

 

带头节点和不带头节点.jpg

 

  • 带头结点的链表中,头结点的值域不含任何储存数据的信息,从头结点的下一个结点开始存储数据信息,头结点的指针 head 始终不等于 NULL,当 head -> next 等于 NULL 时,此时链表为空

  • 不带头结点的链表中,头指针直接指向第一个结点,第一个结点就开始存储数据信息,当 head 等于 NULL 时链表为空。

 

注意区分头结点和头指针

 

  • 头指针: 指向链表的第一个结点,无论带不带头结点都有头指针

 

  • 头结点:只有带头结点的链表才有,值域只存描述链表属性的信息,此时头指针指向头结点始终不为 NULL 。

 

  • 双链表

 

双链表在单链表的基础上添加一个指针域指向前驱结点,可以通过不同的指针域找到其前驱结点或后继节点。

 

  • 带头结点的双链表,类似单链表,当 head -> next 为空链表为空

  • 不带头结点的双链表 当 head 为空时链表为空

 

 

  • 循环单链表

 

在单链表的基础上,将最后一个结点的指针域指向表头结点即可。

 

  • 带头结点的循环单链表,当 head 等于 head -> next 时 链表为空

  • 不带头结点的循环单链表,当 head 为 空时链表为空

  • 循环双链表

 

在双链表的基础上,将最后一个结点的尾指针指向第一个结点,将第一个结点的头指针指向最后一个结点。

 

  • 不带头结点的循环双链表 当 head 为空时 链表为空

  • 带头结点循环双链表 当 head -> next (尾指针) 和 head -> prior  (头指针) 任一一个等于 head 时 ,链表为空,事实上满足以下任一条件,链表都为空:

 

复制代码

head -> next = head

head ->prior = head

head -> next = head && head ->prior = head

head -> next = head || head ->prior = head
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值