数据结构02线性表

线性表(linear list)

线性表是数据结构的一种,一个线性表是n个具有相同特性的数据元素的有限序列。基本

线性表基本运算

//L创建的线性表
Initlist(L):创建一个空的线性表

ListLength(L):返回list长度

GetElem(L,i,e):求线性表中第i个元素是多少,然后赋值给e并返回,线性表序号从1开始
Destroylist(L):销毁线性表,释放线性表占用的空间
ListEmpty(L):判断线性表是否为空,如果是返回真,不是为假
InsertList(L,i,x),插入,在表L的第i元素之前插入一个值为x的新元素,表L的长度加一
DispList(L):如果表不为空顺序显示当前值,可以理解为遍历
GetElem(L,i,e):求线性表中第i个元素是多少,然后赋值给e并返回,线性表序号从1开始不是数组从0
LocateElem(L,e):返回线性表中e第一次出现的位置
ListInsert(L,i,e):在第i位插入e,所有之后的数序列往后延长1
DeleteList(L,I,e):删除第i个元素并用e返回其值,线性表长度减1

线性表的分类

线性表包括顺序表和链表,其中链表又包括单链表、循环链表、双向链表。
顺序存储结构和链式存储结构有所不同,具体区别如下表所示:

存储类别存储分配方式时间性能空间性能
顺序存储结构用—段连续的存储单元依次存储线性表的数据元素查找O(1)、插入和删除O (n)需要预分配存储空间,分大了浪费,小了容易上溢
单链表采用链式存储结构,用一组任意的存储单元存放线性表的元素查找O (n)、插入和删除O (1)不需要分配存储空间,只要有就可以分配,


线性表是一种逻辑结构,相同数据类型的n个数据元素的有限序列,除第一个元素外,每个元素有且仅有一个直接前驱,除最后一个元素外,每个元素有且仅有一个直接后继。


线性表的特点

1.元素个数有限
2.逻辑上元素有先后次序

3.数据类型相同
4.仅讨论元素间的逻辑关系
注:线性表是逻辑结构,顺序表和链表是存储结构。

 通过上面的对比,可以得出一些经验性的结论:

  • 若线性表需要频繁查找,很少进行插入和删除操作时,宜采用顺序存储结构。若需要频繁插入和删除时,宜采用单链表结构。
  • ·当线性表中的元素个数变化较大或者根本不知道有多大时,最好用单链表结构,这样可以不需要考虑存储空间的大小问题。而如果事先知道线性表的大致长度,用顺序存储结构效率会高很多。

顺序表里面元素的地址是连续的,链表里面节点的地址不是连续的,是通过指针连起来的。

顺序存储

顺序存储的优点:

  • 无须为表示表中元素之间的逻辑关系而增加额外的存储空间。
  • 可以快速地存取表中任意位置地元素

顺序存储的缺点:

  • ·插入和删除操作需要移动大量元素
  • ·当线性表长度变化较大时,难以确定存储空间的容量
  • ·容易造成存储空间的“碎片”

链式存储

比起顺序存储结构每个数据元素只需要存储一个位置就可以。现在链式存储结构中,除了要存储数据元素信息外,还要存储它的后继元素的存储地址(指针)。把存储数据元素信息的域称为数据域,把存储直接后继位置的域称为指针域。指针域中存储的信息称为指针或链。这两部分信息组成数据元素称为存储映像,称为节点(Node) 。


链表的每个节点中只包含一个指针域,则称为单链表


头指针和头结点

头指针是指链表指向第一个节点的指针,若链表有头节点,则是指向头结点的指针。

头指针具有表示作用,所以常用头指针冠以链表的名字。无论链表是否为空,头指针均不为空。头指针是链表的必要元素。

头结点是为了操作的统一和方便而设立的,放在第一个元素的节点之前,其数据域一般无意义通常为空,但是指针域指向第一个元素。有了头结点,对在第一元素节点前插入结点和删除第一结点起操作与其它结点的操作就统一了。头结点不一定是链表的必要元素。


单链表的创建

单链表和顺序存储结构不一样,他不像顺序存储结构数据那么集中,它的数据可以是分散在内存各个角落的,它的增长也是动态的。对于每个链表来说,它所占用空间的大小和位置是不需要预先分配划定的,可以根据系统的情况和实际的需求即时生成。
 

头插法:

头插法从一个空表开始,生成新结点,读取数据存放到新结点的数据域中,然后奖新结点插入到当前链表的表头上,直到结束为止。简单来说,就是把新加进的元素放在表头后的第一个位置:

  • ·先让新节点的next指向头节点之后
  • ·然后让表头的next指向新节点

用现实环境模拟的话就是插队的方法,始终让新节点插在第一的位置上。

静态链表

对于线性链表,也可用一维数组来进行描述。这种描述方法便于在没有指针类型的高级程序设计语言中使用链表结构。用数组描述的链表,即称为静态链表


这种存储结构,仍需要预先分配一个较大的空间,但在作为线性表的插入和删除操作时不需移动元素,仅需修改指针,故仍具有链式存储结构的主要优点。其实和顺序存储结构类似来分配空间,插入元素时,元素依次放在后面,但是插入的元素的游标域要根据插入位置来改变。假如有如上的静态链表S中存储着线性表(a, b, c, d, f. g, h. i) , Maxsize=11,如图所示,要在第四个元素后插入元素e,方法是:先在当前表尾加入一个元素e,即:S[9].data = e;然后修改第四个元素的游标域,将e插入到链表中,即:S[9].cursor =S[4].cursor; S[4J.cursor = 9,接着,若要删除第7个元素h,则先顺着游标链通过计数找到第7个元素存储位置6,删除的具体做法是令S[6].cursor = S[7].cursor。


关于静态链表:

  • 我们对数组的第一个和最后一个元素做特殊处理,他们的data不存放数据。
  • 我们通常把未使用的数组元素称为备用链表。
  • 数组的第一个元素,即下标为0的哪个元素的cur(游标)就存放备用链表的第一个结点的下标。
     
  • 数组的最后一个元素,即下标为MAXSIZE-1的cur则存放第一个有数值的元素的下标,相当于单链表中的头结点作用。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值