数据结构_study(二)

线性表

零个或多个相同数据类型的数据元素的有限序列

元素个数有限

序列:有顺序,第一个元素无前驱,最后一个元素无后继,其他每个元素都有且仅有一个直接前驱和直接后继

线性表的长度:元素个数n(n>=0),n=0时空表

非空表中每个元素都有一个确定的位置,ai在线性表中的位置为i

一对一

在这里插入图片描述

抽象数据类型

List

Data:线性表特性

Operation:
创建初始化 InitList(*L);
重置为空表 ClearList(*L);
判空 ListEmpty(L);
根据位序得到数据元素 GetElem(L,i,*e);
查找元素是否存在 LocateElem(L,e);
获取线性表长度 ListLength(L);
移除某个位置 ListDelete(*L,i,*e);
插入某个位置 ListInsert(*L,i,e);

顺序存储结构

一段地址连续的存储单元依次存储线性表的数据元素

起始位置:数组data
最大存储容量:数组长度MaxSize(分配的空间大小)
线性表当前长度:length(数据元素的个数)

length<=MaxSize
数组下标:0~n-1,线性表第i个元素在数组i-1的位置

第i个数据的存储位置和第1个数据的存储位置之间相差(i-1)项,每一项占用c个存储单元:
LOC(ai)=LOC(a1)+(i-1)*c;
在这里插入图片描述

查找

每一项的地址已知,故存取事件性能为O(1),随机存储结构

插入

插入位置不合理,抛出异常
插入之后长度超出数组长度,抛出异常或动态增加容量
最后一个位置向前到第i个位置都向后移动一位
插入元素到i
表长+1

删除

删除位置不合理,抛出异常
取出删除元素
第i个位置向后到最后一个位置都向前移动一位
表长-1

最好情况:插入、删除到最后,不移动,O(1)
最坏情况:插入、删除到第一个,移动所有元素,O(n)
平均情况:每个元素移动概率相同,(n-1)/2,O(n)

优缺点

  1. 不需要为表示表中元素间的逻辑关系额外增加空间
  2. 快速存取
  3. 插入删除需要移动大量元素
  4. 长度变化大时无法确定MaxSize
  5. 存储空间碎片

链式存储结构

用一组任意的存储单元存储线性表的数据元素

数据元素可以存在内存未被占用的任何位置

不需要提前分配存储空间,用多少分配多少,元素个数不受限制

数据域:存数据元素信息的域
指针域:存直接后继位置信息(指针、链)的域,最后一个结点没有后继,指针域为空(NULL或^)
结点:数据域+指针域
链表:n个结点链接,即为线性表的链式存储结构

单链表

存数据元素+后继元素的存储地址

单链表:每个结点只包含一个指针域

头指针

  • 指针,指向链表中第一个结点,如果有头结点则指向头结点
  • 头指针一般冠以链表的名字,head
  • 必要元素

头结点

  1. 带头结点链表的第一个结点;
  2. 指针域:指向第一个结点的指针;
  3. 数据域:可以不存储信息,或者公共数据;
  4. 方便统一第一个结点和其他结点的插入删除操作,统一操作head->next;
  5. 统一空表和非空表,头指针都指向头结点,头结点指针域为空或不为空
  6. 不必要元素
    在这里插入图片描述

查找

  1. 声明结点p指向链表第一个结点,j=1
  2. j<i,p指向下一个结点,j++
  3. p为空时,第i个元素不存在
  4. 返回p

从头开始找,最坏时间复杂度O(n)
单链表没有定义表长,不适合for
工作指针后移
在这里插入图片描述

插入

  1. 声明结点p指向第一个结点,j=1
  2. j<i,p指向下一个结点,j++
  3. p为空,查找失败
  4. 查找成功,生成新节点s,并赋值;
  5. s->next=p->next;p->next=s;不可以逆序,会导致p->next丢失
  6. 返回成功
    在这里插入图片描述

删除

  1. 声明结点p指向第一个结点,j=1
  2. j<i,p指向下一个结点,j++
  3. p为空,查找失败
  4. 查找成功,q=p->next;p->next=q->next;
  5. e=q->data,释放q结点,返回成功
    在这里插入图片描述

时间复杂度O(n)
第一次找到第i个位置的指针,之后每次插入删除O(1)

插入删除数据越频繁,单链表效果优势越明显

整表创建

  1. 声明结点p和计数器变量i
  2. 初始化空链表L
  3. L头结点指针指向NULL
  4. 循环:生成新节点赋值给p;数字赋值给p->data;
    头插:插入p到头结点和前一新结点之间
    尾插:插入到终端节点后
    在这里插入图片描述

整表删除

  1. 声明结点p,q
  2. 结点赋值给p
  3. 循环:下一级结点赋值给q,释放p,q赋值给p

选择

顺序结构:频繁查找,很少插入删除时;预先知道元素个数或变化不大时;
单链表结构:频繁插入删除;元素个数未知且变化较大时;

静态链表

没有指针,用数组描述的链表

未被使用的数组元素称为备用链表
在这里插入图片描述

插入

  1. malloc
    返回数组头元素cur存的第一个空闲下标 7
    更新空闲分量的cur 8 赋值给头元素
  2. 插入的数据放入空闲下标 7
  3. 找到i-1元素的位置,插入数据的cur改为i-1元素的cur 3,i-1元素的cur改为插入数据的下标7
    在这里插入图片描述

删除

  1. 获取第i个元素cur
  2. 第i-1元素的cur更新为i元素的cur
  3. free
    把第一个元素cur值赋给要删除的分量cur
    把要删除的分量下标赋值给第一个元素的cur

在这里插入图片描述

优缺点

  • 插入和删除时只需要修改游标,不需要移动元素
  • 没有解决连续分配存储附带的表长难以确定问题
  • 没有随机存取特性

循环链表

将单链表中终端结点的指针,由空指针改为指向头结点,头尾相接的单链表

从某一个结点出发,访问链表全部结点

头结点:方便统一空链表和非空链表

尾指针rear:指示终端结点,开始节点是rear->next->next

合并两个循环链表
在这里插入图片描述

双向链表

在单链表的每个结点中,设置一个指向其前驱结点的指针域
结点中有两个指针域,一个直接前驱,一个直接后继

p->next->prior = p = p->prior->next
插入和删除时需要改变两个指针变量
增加反向遍历查找的功能

空间换时间
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值