1.什么是列表(List)?

一个数据项按照相对位置存放的数据集。特别的,被称为“无序表(unordered list)”,其中数据项只按照存放位置来索引,如第1个、第2个…、最后一个等。
如一个考试分数的集合“54,26,93,17,77,31”,如果用无序表来表示,就是[54,26,93,17,77,31]

2.抽象数据类型:无序表List的操作


3.用链表实现无序表

为了实现无序表数据结构,可以采用链接表的方案。
虽然列表数据结构要求保持数据项的前后相对位置,但这种前后位置的保持,并不要求数据项一次存放在连续的存储空间。
如下图,数据项存放位置并没有规则,但如果在数据项之间建立链表指向,就可以保持其前后相对位置。第一个和最后一个数据项需要显式标记出来,一个是队首,一个是队尾,后面再无数据了。

3.1 链表实现

3.1.1 节点Node

链表实现的最基本元素是节点Node
每个节点至少要包含2个信息:数据项本身以及指向下一个节点的引用信息。next为None的意义是没有下一个节点了。

3.1.2 节点Node的python实现

#定义节点
class Node:def __init__(self,initdata):self.data=initdata#把初始项传进去,且下一节点设置为空self.next=Nonedef getData(self):return self.data  #返回数据项def getNext(self):return self.next  #返回下一个节点def setData(self,newdata):self.data=newdata #修改数据项def setNext(self,newnext):self.next=newnext#修改下一个节点的指向引用
temp=Node(93)#创建一个数据项为93的节点
temp.getData()

3.2 链表实现无序表(UnorderedList)

可以采用链接节点的方式构建数据集来实现无序表。
链表的第一个和最后一个节点最重要。如果想访问到链表中的所有节点,就必须从第一个节点开始沿着链接遍历下去。所以无序表必须要有对第一个节点的引用信息。

class UnorderedList:def __init__(self):self.head=Nonemylist=UnorderedList()
print(mylist.head)

随着数据项的加入,无序表的head始终指向链条中的第一个节点。
注意!!!
无序表mylist对象本身并不包含数据项(数据项在节点中),其中包含的head只是对首个节点Node的引用。
判断空表的isEmpty()很容易实现—return self.head ==None

3.2.1 链表实现:add方法实现

由于无序表并没有限定数据项之间的顺序,新数据项可以加入到原表的任何位置。按照实现的性能考虑,应添加到最容易加入的位置上
由链表结构可知,要访问整条链上的所有数据项,都必须从表头head开始沿着next链接逐个向后查找。所以添加新数据项最快捷的位置时表头,整个链表的首位置。

#定义节点
class Node:def __init__(self,initdata):self.data=initdata#把初始项传进去,且下一节点设置为空self.next=Nonedef getData(self):return self.data  #返回数据项def getNext(self):return self.next  #返回下一个节点def setData(self,newdata):self.data=newdata #修改数据项def setNext(self,newnext):self.next=newnext#修改下一个节点的指向引用def add(self,item):temp=Node(item)temp.setNext(self.head)self.head=temp

3.2.2 链表实现:size

size:从链条头head开始遍历到表尾,同时用变量累加经过的节点数。

python代码实现

#定义节点
class Node:def __init__(self,initdata):self.data=initdata#把初始项传进去,且下一节点设置为空self.next=Nonedef getData(self):return self.data  #返回数据项def getNext(self):return self.next  #返回下一个节点def setData(self,newdata):self.data=newdata #修改数据项def setNext(self,newnext):self.next=newnext#修改下一个节点的指向引用
def size(self):current=self.headcount=0while current != None:count=count+1current=current.getNext()return count

3.2.3 链表实现:search

从链表头head开始遍历到表尾,同时判断当前节点的数据项是否为目标。

python代码实现

#定义节点
class Node:def __init__(self,initdata):self.data=initdata#把初始项传进去,且下一节点设置为空self.next=Nonedef getData(self):return self.data  #返回数据项def getNext(self):return self.next  #返回下一个节点def setData(self,newdata):self.data=newdata #修改数据项def setNext(self,newnext):self.next=newnext#修改下一个节点的指向引用def search(self,item):current=self.headisOK=Falsewhile current !=None and not isOK:if current.getData()==item:isOK=Trueelse:current=current.getNext()return isOK

3.2.4 链表实现:remove(item)方法

(1)首先找到item,这个过程跟search一样,但在删除节点时,需要特别的技巧
current指向的是当前匹配数据项的节点,而删除需要把前一个节点的next指向current的下一个节点。所以,我们在search current的同时,还要维护前一个(previous)节点的引用。

(2)找到item之后,current指向item节点,previous指向前一个节点,开始执行删除时,需要区分两种情况:current是个首节点或者是位于链条中间的节点。

python代码实现

#定义节点
class Node:def __init__(self,initdata):self.data=initdata#把初始项传进去,且下一节点设置为空self.next=Nonedef getData(self):return self.data  #返回数据项def getNext(self):return self.next  #返回下一个节点def setData(self,newdata):self.data=newdata #修改数据项def setNext(self,newnext):self.next=newnext#修改下一个节点的指向引用def remove(self,item):previous=Nonecurrent=self.headfound=Falsewhile not found:if current.getData()==item:found=Trueelse:previous=currentcurrent=current.getNext()if previous==None:self.head=current.getNext()else:previous.setNext(current.getNext())

基本数据结构——线性结构(列表/无序表)相关推荐

  1. 基本数据结构——线性结构(有序表)

    1. 什么是有序表(OrderedList) 有序表是一种数据项依照其某可比性质(如整数大小.字母表先后)来决定在列表中的位置.越"小"的数据项越靠近列表的头,越靠"前& ...

  2. 数据结构——线性结构总结

    数据结构--线性结构总结 数据结构--线性结构总结 写在前面 线性结构的特点 线性表 栈 队列 相关的STL容器的基本操作 vector list stack queue deque 习题 线性表相关 ...

  3. 数据结构与算法(python) 线性结构:无序列表 Unordered List以及链表

    参考自 MOOC数据结构与算法Python版 目录 一.什么是列表List 二.抽象数据类型List 2.1 List的基本操作 三. Python实现链表:节点Node 3.1 从尾到头打印链表 一 ...

  4. 数据结构——线性结构(线性表)

    文章目录 一. 线性结构概述 1. 线性结构(线性表的逻辑结构)的定义 2. 线性表的特点 二. 线性结构分类 1. 连续存储[顺序表] (1). 什么叫数组 (2). 顺序表算法的基本操作 (3). ...

  5. java中线性结构的例子_java数据结构--线性结构

    一.数据结构 数据结构由数据和结构两部分组成,就是将数据按照一定的结构组合起来,这样不同的组合方式有不同的效率,可根据需求选择不同的结构应用在相应在场景.数据结构大致 分为两类:线性结构(如数组,链表 ...

  6. 数据结构——线性结构

    简单地说,线性结构就是表中各个结点具有线性关系.如果从数据结构的语言来描述,线性结构应该包括如下几点: 1.线性结构是非空集. 2.线性结构有且仅有一个开始结点和一个终端结点. 3.线性结构所有结点都 ...

  7. 常用数据结构--线性结构

    数据结构是计算机存储.组织数据的方式.常见的数据结构分类方式如下图: 常用的线性结构有:线性表,栈,队列,循环队列,数组.线性表中包括顺序表.链表等,其中,栈和队列只是属于逻辑上的概念,实际中不存在, ...

  8. 数据结构:线性结构和非线性结构的理解

    我们知道数据结构是计算机存储.组织数据的方式.常见的数据结构分类方式如下图: 我们这里主要说一下线性结构和非线性结构 1. 线性结构 线性结构是什么? 数据结构中线性结构指的是数据元素之间存在着&qu ...

  9. 数据结构线性结构和非线性结构

    1.线性结构 特点:1)数据元素之间存在一对一的线性关系 2)线性存储结构分为顺序存储结构和链式结构. 3)顺序表中存储元素(地址)是连续的 4)链表中存储的元素不一定是连续的 5)线性结构常见的有: ...

最新文章

  1. Android开发——说说Adapter那点事
  2. php 最大数字,PHP 计算至少是其他数字两倍的最大数的实现代码
  3. sublimelinter校验php,代码校验工具 SublimeLinter 的安装与使用
  4. 用ANSYS画矩形_用SolidWorks画一个换挡杆防尘罩,此图建了10个基准面,颇为麻烦...
  5. 使用vivado进行逻辑开发时,进行到Generate Bitstream时报错
  6. BW:BW增量更新方法(假增量)
  7. java高效字符串首字母大小写转换
  8. MyEclipse创建struts.xml
  9. JavaScript——闭包函数及拓展题目
  10. 双链表(线性表的链式存储)---C语言版
  11. K3CLOUD业务系统编码规则设置
  12. js 分页页码 根据总条数计算有多少页,计算页码
  13. C++ 八股文(一)
  14. 高级JAVA工程师的岗位职责,岗位要求
  15. 关于 opengl3.3 - 4.1 ABO 的感触. 传统 VBO往 ABO+VBO的 代码移植
  16. 有个网站能开通手机QQ
  17. 向氏-姓氏家谱知识图谱构建
  18. 一寸照片电子版怎么弄?这两种方法要学会
  19. 使用handeye_calib_camodocal进行手眼标定
  20. 第八章 win10+gsoap+onvif+ffmpeg

热门文章

  1. c语言ox是什么意思啊,ox什么意思
  2. 汇编语言中word ptr | byte ptr分别是什么意思
  3. 【obs-studio开源项目从入门到放弃】预览窗口中source的UI操作绘制处理
  4. 地方门户网站的运营我们缺少的是什…
  5. 基于搜狐云景的java语言开发技巧
  6. 大学物理(下)class1
  7. 绘图工具——绘制地图
  8. 利用命令行工具pdftk对PDF进行合并分割
  9. html设置三号字体是多少px,CSS 中二号字体是多少 px?
  10. 人民币贬值波及海外代购:海淘族成本上涨