数据结构算法笔记

(三)线性表
在这里插入图片描述

线性表:
线性表的定义:零个或者多个数据元素的有限序列。

  1. 数据元素:是同种数据类型的,需要注意的是在复杂的线性表中,一个数据元素可以由若干个数据项组成。
  2. 有限:数据元素个数有限,n = 0时,为空表;
  3. 序列:元素之间是有顺序的,若元素存在多个,则第一个元素没有前驱,最后一个元素没有后继,其他每个元素有且只有一个前驱和后继,即元素之间的关系是一一对应。

线性表的抽象数据类型:

在这里插入图片描述
线性表顺序存储——— 顺序表(数组)、 链表
线性表的顺序存储结构:
顺序存储定义:指用一段地址连续的存储单元依次存储线性表的数据元素。
顺序存储方式:C语言用一维数组来实现顺序存储结构,把第一个数据元素存到数组下标为0的位置中,然后再把相邻的元素存储到数组中相邻的位置。
在这里插入图片描述
描述顺序存储结构需要三个属性:
(1) 存储空间的起始位置:数组data,它第一个元素的存储位置就是存储空间的存储位置
(2) 线性表的最大存储容量:就是数组的长度maxsize
(3) 线性表的当前长度:length;length<= maxsize
数组长度与线性表长度区别:
数组长度是存放线性表的存储空间的长度;线性表长度:就是线性表中数据元素的个数。在任意时刻,线性表的长度应该小于等于数组长度。
地址的计算方法:存储器中的每一个存储单元都有自己的编号,这个编号就是地址。不同的数据类型在内存中占有不同的存储单元空间,假设占用C个存储单元,那么线性表中第i+1个数据的地址和第i个数据的地址满足
LOC(a_(i+1) )= LOC(a_i )+C
顺序结构的操作:
**

**1、 顺序结构的插入:

插入算法思想:
(1)插入位置不合理则抛出异常
(2)者线性表的长度大于等于数组长度,则抛出异常或者动态增加容量;
(3)从最后一个元素开始向前遍历到第i个位置,分别将他们都向后移动一个位置;
(4)将要插入的元素填入第i个位置;
(5)表长加1;
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
2、删除操作:
删除算法的思路:
(1) 如果删除位置不合理,抛出异常;
(2) 取出删除元素;
(3) 从删除元素的位置开始遍历到最后一个元素位置,将他们都向前移动一个位置;
(4) 表长减1;
在这里插入图片描述
线性表顺序存储结构的优缺点
优点:
(1) 无须为表示表中的元素的逻辑关系而增加额外的存储空间;
(2) 可以快速的存取表中任意位置的元素;
缺点:
(1) 插入删除操作需要移动大量的元素;
(2) 当线性表长度变化较大时,难以确定存储空间的容量;
(3) 造成存储空间的“碎片”

线性表的第二种存储结构——链式存储结构
顺序存储结构最大缺点在于插入和删除时需要移动大量的元素,这样比较耗费是时间。原因在于相邻两个元素之间的存储位置也是邻居关系,它们在内存中的位置是挨着的,没有空隙,删除和插入操作后就要弥补这个空隙。
解决这个问题的方法:链式存储思路:让每个元素知道它的下一个元素的位置在哪,这样由第一个元素就能够知道第二个元素的位置(内存地址),以此类推,所有的元素都可以遍历找到。
线性表的链式存储特点:存储单元可以是连续的也可以是不连续的。
在这里插入图片描述
在这里插入图片描述
头指针:把链表中第一个结点的存储位置叫做头指针
在这里插入图片描述
**头结点:**单链表的第一个结点前附设一个结点,为头结点,头结点的数据域可以不存储任何信息。

在这里插入图片描述
单链表的操作:

1、求表长:
在这里插入图片描述
2、查找
在这里插入图片描述** 3、插入:**

单链表插入操作算法思路:
(1) 声明一结点P指向链表第一个结点,初始化J从1开始;
(2) 当J<i,就遍历链表,让P的指针向后移动,不断指向下一个结点,J累加1;
(3) 若到链表末尾P为空,则说明第i个元素不存在;
(4) 否则查找成功,在系统中生成一个空结点S
(5) 将数据元素e赋值给S->data;
(6) 单链表的插入标准语句S->next = P->next ; P->next = S;
(7) 返回成功

在这里插入图片描述
在这里插入图片描述

单链表的删除:
删除q结点,就是将它的前继结点的指针绕过,直接指向它的后继结点即可。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
其他的链表结构:

静态链表:数组描述的链表叫做静态链表。数组的元素都是由两个数据域组成,data和cur,data存放数据,cur数据域相当于单链表指针中的next指针,存放该元素的后继在数组中的下标。

循环链表:将单链表中终端结点的指针端由空指针改为指向头结点,就使整个单链表形成一个环,这种头尾相接的单链表称为循环链表。
双向链表:双向链表是在单链表的每个结点上,再设置一个指向其前驱结点的指针域。所以双向链表中的结点都有两个指针域,一个指向前驱结点,一个指向后继结点。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值