线性表是最基本、最简单、也是最常用的一种数据结构。线性表(linear list)是数据结构的一种,一个线性表是n个具有相同特性的数据元素的有限序列。线性表中数据元素之间的关系是一对一的关系,即除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接的(注意,这句话只适用大部分线性表,而不是全部。比如,循环链表逻辑层次上也是一种线性表(存储层次上属于链式存储,但是把最后一个数据元素的尾指针指向了首位结点)。
方法 | 作用 |
---|---|
Setnull(L) | 置空表 |
Length(L) | 求表的长度和表中个元素的个数 |
Get(L,i) | 获取表中的第i个元素 0<=i<=n |
Prior(L,i) | 获取i的前驱元素 |
Next(L,i) | 获取i的后继元素 |
Locate(L,x) | 返回指定元素在表中的位置 |
Insert(L,i,x) | 插入新元素 |
Delete(L,x) | 删除已有元素 |
Empty(L) | 判断列表是否为空 |
置空列表
def Setnull(L):
return L.clear()
L=[1,2,3]
print(Setnull(L))
求表的长度和表中元素的个数
def Length(L):
num=0
for i in L:
if i !=None:
num+=1
return len(L),num
a=[None]*20
for i in range(10):a[i]=i
print(Length(a))
获取列表中的第i个元素
def Get(L,i):
if i<0 or i>=len(L):
return
else:
return L[i]
L=[a for a in range(10)]
print(Get(L,2))
获取第i个的前驱元素和后继元素
def Prior(L,i):
if not isinstance(i,int):
raise TypeError
if i-1<0 or i>len(L)-1:
raise IndexError
else:
return L[i-1]
def Next(L,i):
if not isinstance(i,int):
raise TypeError
if len(L)<=i+1:
raise IndexError
else:
return L[i+1]
l=[a for a in range(10)]
print(Prior(l,3))
print(Next(l,3))
返回指定元素在列表中的位置
def Locate(L,x):
if x not in L:
print("%s not in list"%x)
else:
return L.index(x)
l=[a for a in range(10)]
print(Locate(l,2))
插入新元素
def Insert(L,i,x):
if not isinstance(i,int):
raise TypeError
if i<0 :
raise IndexError
if i>len(L):
L.append(x)
num=0
for k in L:
if k !=None:
num+=1
for k in range(num,i,-1):
L[k]=L[k-1]
L[i]=x
return L
l=[None]*30
for i in range(10):l[i]=i**2
print(Insert(l,3,99))
删除已有元素
def Delete(L,x):
if x not in L:
print("%s not in list"%x)
else:
L.remove(x)
return L
l=[a for a in range(5)]
print(Delete(l,2))
判断列表是否为空
def Empty(L):
num=0
for i in L:
if i!=None:
num+=1
return num is 0
A=[None]*10
print(Empty(A))
class seqlist(object):
def __init__(self,max=10):
self.max=max #默认线性表的长度为10
self.num=0
self.date=[None]*self.max
self.last=len(self.date) #当列表满时扩建列表的方式
def is_empty(self): #线性表是否为空
return self.num is 0
def is_full(self):
return self.num is self.max #判断线性表是否已满
#获取某个位置的元素
def __getitem__(self, key): # 该方法获取指定索引对应的元素。
if not isinstance(key,int): #判断key,是否是一个已知的类型,本例中是判断key是否是int类型
raise TypeError
if 0<=key<self.num:
return self.date[key]
else:
raise IndexError #列表为空或者索引超标就会报错‘
def __setitem__(self, key, value): #设置某个位置的元素
if not isinstance(key,int):
raise TypeError
#只能访问列表已有元素,self.num=0时,一个都不访问,self.num=1时,只能访问0
if 0<=key <self.num:
self.date[key]=value
else:
raise IndexError
def clear(self):
self.__init__()
def count(self):
return self.num
def __len__(self):
return self.num
#加入元素的方法,append()和insert()
def append(self,value):
if self.is_full():
print("list is full")
return
else:
self.date[self.num]= value
self.num+=1
#实现插入操作
def insert(self,key,value):
if not isinstance(key,int):
raise TypeError
if key<0:
raise IndexError
if key>=self.num:
self.append(value)
else:
#移动key后的元素
for i in range(self.num,key,-1):
self.date[i]=self.date[i-1]
#赋值
self.date[key]=value
self.num+=1
#删除元素的操作
def pop(self,key=-1):
if not isinstance(key,int):
raise TypeError
if self.num-1<0:
raise IndexError("pop from empty list")
elif key==-1:
#原来的数还在,但列表不识别
self.num-=1
else:
for i in range(key,self.num-1):
self.date[i]=self.date[i+1]
self.num-=1
#搜索操作
def index(self,value,start=0):
for i in range(start,self.num):
if self.date[i]==value:
return i
#没找到
raise ValueError("%d is not in the list"%value)
#表示反转
def reverse(self):
i,j=0,self.num-1
while i<j:
self.date[i],self.date[j]=self.date[j],self.date[i]
i,j=i+1,j-1
if __name__ == '__main__':
a=seqlist()
print(1,a.date)
print('列表是否为空:',a.is_empty())
print('添加元素')
a.append(0)
a.append(1)
a.append(2)
print("元素添加完毕")
print(2,a.date)
print(3,a.num)
print(4,a.max)
a.insert(1,6)
print(5,a.date)
a[1]=5
print(6,a.date)
print(7,a.count())
print(a.index(2,1))
print("="*20)
t=1
if t:
a.pop(1)
print(8,a.date)
print(9,a.num)
else:
a.pop()
print(10,a.date)
print(11,a.num)
print("="*20)
print(12,len(a))
a.reverse()
print(13,a.date)
print(14,a.is_full())
a.clear()
print(a.date)
print(a.count())