线性表数据结构相关的操作:
1、提供创建线性表的操作
2、信息检索操作(求表长、判空、表中查询指定数据。。。)
3、能改变表的内容(添加、删除、按指定条件添加删除。。。)
4、多个表的联合操作(合并、去重、排序。。。)
5、遍历
Class List:
List(self) #表的构造,创建表
is_empty(self) #判表空
len(self) #求表长
prepend(self, elem) #将新元素elem加入表中作为第一个元素
append(self, elem) #将新元素elem加入表中作为最后一个元素
insert(self, elem, i) #将新元素elem加入表中,作为第i个元素,其他元素的顺序不变
del_first(self) #删除表中的第一个元素
del_last(self) #删除表中的最后一个元素
search(self, elem) #查找元素elem在表中的位置,没有找到返回-1
forall(self, op) #对表中的每个元素做op操作
1、顺序表
实现方式:表中元素存放在一片足够大的连续存储区里,第一个元素存放在该区域的开始位置,其余元素依次存放。
Python中可以直接用list实现顺序表相关的操作。
2、链接表
(1)单链表
单链表的结点是一个二元组。其数据域elem保存着表元素的数据项,链接域next保存下一个结点的标识(链接)。
重点:
1、想要掌握一个单链表,就需要知道他的首结点,通过这个首结点就可以找到表的第一个元素,依次下去,能遍历整个表。
因此,需要一个变量来保存这个首结点的引用(链接),称之为表头变量或者表头指针。
2、为了能表示一个表的结束,需要给表的最后一个结点(表尾结点)的链接域这是一个不会作为对象标识的值,称为空链接,Python中用None标识,通过判断链接域=None,找到表尾结点。
3、类似于第2点,空表的判定就是根据表头结点的链接域为None来知道的(表没有元素就已经结束)。
定义一个简单的表结点类:
class Node:
def __init__(self,value,next_ = None):
self.value = value #数据域
self.next = next_ #链接域
'''
链接域命名为next_,是为了避免与Python标准函数next重名,这是个惯例
'''
定义单链表类及其相关操作:
class LinkList(object):
#初始化单链表
def __init__(self, node=None):
self.__head = node
#遍历链表,求表长
def __len__(self):
cur = self.__head #游标,用来遍历
count = 0 #记录表长
while cur: #当cur==None,说明遍历完毕
count += 1
cur = cur.next
return count
#判空
def is_empty(self):
return self.__head == None #若表头结点为空,则表空
#添加元素
def add(self,value):
'''
头插法:每次新增元素,插在表的开始位置
1、先让新结点的next指向头结点
2、再让头结点替换为新结点
3、注意:必须顺序执行上述步骤,保证原链表不会丢失。
'''
node = Node(value)
node.next = self.__head
self.__head = node
#添加元素
def append(self,value):
'''
尾插法
'''
node = Node(value)
cur = self.__head
if self.is_empty():
self.__head = node
else:
while cur.next:
cur = cur.next
cur.next = node
#插入元素到指定下标位置
def insert(self, pos, value):
if pos<=0:
self.add(value)
elif pos > len(self)-1:
self.append(value)
else:
node = Node(value)
prior = self.__head
count = 0
#在插入位置的前一个位置停下
while count < (pos-1):
prior = prior.next
count += 1
#先将插入结点与结点后的结点连接,防止链表断掉,先连接后面的,在链接前面的
node.next = prior.next
prior.next=node
#删除指定元素
def remove(self, value):
cur = self.__head
prior = None
while cur:
if value == cur.value:
#判断此结点是否为头结点
if cur == self.__head:
self.__head = cur.next
else:
prior.next = cur.next
break
#还没找到结点,有继续遍历
else:
prior = cur
cur = cur.next
#查找指定元素是否存在
def search(self, value):
cur = self.__head
while cur:
if value == cur.value:
return True
cur = cur.next
return False
#遍历打印整个表
def traverse(self):
cur = self.__head
while cur:
print(cur.value)
cur = cur.next
单链表使用:
linklist=LinkList() #创建一个空链表,下面的各个功能测试在此基础上操作
#linklist=LinkList(Node(1)) #创建一个链表,第一个元素值为1
#***************************************************************************
print(linklist.__len__()) #得到链表的长度 0
print(linklist.is_empty()) #linklist是否为空表,True
#***************************************************************************
linklist.add(1) #add 头插法,每次插入链表的头部
linklist.add(2)
linklist.add(3)
print(linklist.traverse()) #结果:3 2 1
#***************************************************************************
linklist.append(1) #append 尾插法,每次插入链表的结尾
linklist.append(2)
linklist.append(3)
print(linklist.traverse()) #结果:1 2 3
#***************************************************************************
linklist.append(1) #append 尾插法,每次插入链表的结尾
linklist.append(2)
linklist.append(3)
linklist.insert(1,-4)
print(linklist.traverse()) #结果:1 -4 2 3 在下标为1的位置插入
#***************************************************************************
linklist.append(1)
linklist.append(2)
linklist.append(3)
linklist.append(2)
linklist.remove(2)
print(linklist.traverse()) #结果:1 3 删除元素2,注意:只删除了第一次出现2
#***************************************************************************
linklist.append(1)
linklist.append(2)
linklist.append(3)
print(linklist.search(2)) #结果:True 找到了存在元素值为2的结点