您的位置:首页 > 理论基础 > 数据结构算法

[读书笔记]-大话数据结构-3-线性表(二)-线性表的链式存储

2017-10-30 11:30 344 查看

线性表链式存储结构

为了解决线性表插入、删除操作复杂和空间大小不灵活等缺点, 可以用链式存储结构表示线性表。链式存储结构的定义为:为了表示每个数据元素ai与其直接后继数据元素ai+1之间的逻辑关系,对数据元素ai来说,除了存储其本身的信息之外,还需要存储一个指示其后继的信息(即直接后继的存储位置)。我们把存储数据元素信息的域称为数据域,把存储直接后继位置的域称作为指针。这两部分信息组成数据元素ai的存储映像,称为节点(Node).

n个节点链接成一个链表,即线性表(a1,a2,...an)的链式存储结构。因为该链表每个节点只包含一个指针域,也叫做单链表。如下图:

#encoding=UTF-8
class Node(object):
def __init__(self,data=None):  #生成数据节点
self.data=data
self.next=None             #指针默认指向空

class LinkList(object):
def __init__(self):      #生成一个链表,无头结点,默认指向空
self.head=None

def ListEmpty(self):
return self.head==None

def ClearList(self):
self.head=None

def GetElem(self,i):
p=self.head    #p指向链表的头
j=1            #初始下标为1
while p!=None and j<i:   #下标小于i或者p不到链表尾部(p=None)时,资讯
j+=1              #下标加1
p=p.next          #节点指向下一个
if p==None or j>i: raise IndexError('not exit')   #第i个元素不存在
return p.data    #返回第i个元素的值

def LoacateElem(self,e):
p=self.head
i=0
while p!=None:
i+=1
if p.data==e:return i
p=p.next
return -1

def ListInsert(self, i, e):
p=self.head
j=1
while p!=None and j<i:
j+=1
p=p.next
if p==None or j>i: raise IndexError('not exit')
s=Node(e)            #生成新节点
s.next=p.next       #新节点指向p的下一个元素
p.next=s            #p指向s
return True         #返回成功

def ListDelete(self,i):
p=self.head       #工作节点
q=None            #p的前一个节点
j=1
while p!=None and j<i:  #遍历寻找节点i
j+=1
q=p
p=p.next
if p==None or j>i:raise IndexError('not exit')
if q==None: self.head=p.next   #当q指向空时,头指针指向p.next
else: q.next=p.next          #上一个节点指向p.next,即删除p
return p.data     #返回p的值

def ListLength(self):
cnt=0
p=self.head
while p!=None:
cnt+=1
p=p.next
return cnt

def ListShow(self):
p=self.head
q=self.head
while p!=None:
print p.data,
p=p.next
print ''

def ListCreate(self,l):
self.head=None
l.reverse()
for e in l:         #从最后一个元素到第一个元素
p=Node(e)            #生成一个新节点
p.next=self.head     #这个及诶单指向链表头
self.head=p          #链表头指向这个节点

def ListCreateTail(self,l):
self.head=None
q=None
for e in l:         #从第一个到最后一个元素
p=Node(e)       #新生成一个节点
if self.head==None:   #如果头结点为空
self.head=p       #头节点指向先生存的节点
else:q.next=p         #否则q指向新节点
q=p                   #q等于尾节点

def Union(self,lb):
p=lb.head
while p!=None:
e=p.data
if self.LoacateElem(e)==-1:  #如果p.data不在la中
q=Node(e)
q.next=self.head
self.head=q
p=p.next

if __name__=='__main__':
la=LinkList()
lb=LinkList()
print la.ListEmpty()
la.ListCreateTail(range(0,20,2))
la.ListShow()
lb.ListCreate(range(1,20,3))
lb.ListShow()

print la.ListEmpty()
print la.GetElem(7)

print la.LoacateElem(8)
la.ListInsert(5,15)
la.ListShow()

print la.ListLength()
#print la.ListDelete(1)
la.ListShow()

la.Union(lb)
la.ListShow()
la.ClearList()
la.ListShow()


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: