目录
抽象数据类型-无序表List:
UnorderedList所定义的操作
UnorderedList():创建一个空列表
add(item):添加一个数据项到列表中,假设item原先不存在于列表中
remove(item):从列表中移除item,列表被修改,item原先应存在于表中
search(item):在列表中查找item,返回布尔值
isEmpty():返回列表是否为空
size():返回列表包含了多少数据项
****列表****
append(item):添加一个数据项到表末尾,假设item原先不存在于列表中
index(item):返回数据项在表中的位置
insert(pos,item):将数据项插入到位置pos,假设item原先不在列表中,同时原列表具有足够多个数据项,能让item占据位置pos
pop():从列表末尾移除数据项,假设原列表至少有1个数据项
pop(pos):移除位置为pos的数据项,假设原列表存在位置pos
链表实现:节点Node
链表实现的最基本元素是节点Node 。
每个节点至少要包含2个信息:数据项本身,以及指向下一个节点的引用信息。注意next为None的意义是没有下一个节点。
class Node:
def __init__(self,initdata):
self.data=initdata
self.next=None
def 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
链表实现:无序表UnorderedList
可以采用链接节点的方式构建数据集来实现无序表。
链表的第一个和最后一个节点最重要。注意:如果想访问到链表中的所有节点,就必须从第一个节点开始沿着链接遍历下去。
所以无序表必须要有对第一个节点的引用信息。
随着数据项的加入,无序表的head始终指向链条中的第一个节点。注意:无序表对象本身并不包含数据项,数据项在节点中
"""链表实现无序表UnorderedList"""
class UnorderedList:
def __init__(self):
"""设立一个属性head,保存对第一个节点的引用,空表的head为None"""
self.head=None
"""判断空表"""
def isEmpty():
return self.head==None
"""链表实现:add方法实现"""
"""添加新数据项最快捷的位置是表头,整个链表的首位置"""
def add(self,item):
temp=Node(item)
temp.setNext(self.head)
self.head=temp
"""链表实现:size"""
"""size:从链条head开始遍历到表尾同时用变量累加经过的节点个数"""
def size(self):
current=self.head
count=0
while current!=None:
count=count+1
current=current.getNext()
return count
"""链表实现:search"""
"""从链表头head开始遍历到表尾,同时判断当前节点的数据项是否为目标"""
def search(self,item):
current=self.head
found=False
while current!=None and not found:
if current.getData()==item:
found=True
else:
current=current.getNext()
return found
"""链表实现:remove(item)代码"""
"""首先找到目标,删除需要把前一个节点的next指向current的下一个节点"""
def remove(self,item):
current=self.head
previous=None
found=False
while not found:
if current.getData()==item:
found=True
else:
previous=current
current=current.getNext()
if previous==None:
self.head=current.getNext()
else:
previous.setNext(current.getNext())
抽象数据类型-有序表OrderedList
OrderedList定义的操作
OrderedList():创建一个空有序表
add(item):添加一个数据项到列表中,假设item原先不存在于列表中
remove(item):从表中移除item,列表被修改,item原先应存在于表中
search(item):在表中查找item,返回布尔值
isEmpty():返回列表是否为空
size():返回列表包含了多少数据项
index(item):返回数据项在表中的位置
pop():从列表末尾移除数据项,假设原列表至少有1个数据项
pop(pos):移除并返回位置为pos的数据项,假设原列表存在位置pos
有序表OrderedList实现
在实现有序表的时候,需要记住的是,数据项的相对位置,取决于它们之间的“大小”比较。
同样采用链表方法实现
Node定义相同
OrderedList也设置一个head来保存链表表头的引用
class OrderedList:
def __init__(self):
self.head=None
对于isEmpty/size/remove这些方法,与节点次序无关,所以其实现跟UnorderedList是一样的。
search/add需要修改
search方法
在无序表的search中,如果需要查找的数据项不存在,则会搜遍整个链表,直到尾项;对于有序表来说,可以利用链表节点的有序排列的特性,来为search节省不存在数据项的查找时间。一旦当前节点的数据项大于所要查找的数据项,则说明链表后面已经不可能再有要查找的数据项,可以直接返回False
"""链表实现:search"""
"""从链表头head开始遍历到表尾,同时判断当前节点的数据项是否为目标"""
def search(self,item):
current=self.head
found=False
stop=False
while current!=None and not found and not stop:
if current.getData()==item:
found=True
else:
if current.getData()>item:
stop=True
else:
current=current.getNext()
return found
add方法
add方法必须保证加入的数据项添加在合适的位置,以维护整个链表的有序性。由于涉及到的插入位置是当前节点之前,而链表无法得到“前驱”节点的引用。所以跟remove方法类似,引入previous的引用,跟随当前节点current。
def add(self,item):
current=self.head
previous=None
stop=False
while current!=None and not stop:
if current.getData()>item:
stop=True
else:
previous=current
current=current.getNext()
temp=Node(item)
if previous==None:
temp.setNext(self.head)
self.head=temp
else:
temp.setNext(current)
previous.setNext(temp)