python算法之线性表操作

前言

线性表是最基本、最简单、也是最常用的一种数据结构。线性表(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())

效果截图

python算法之线性表操作_第1张图片

总结

  1. 虽然不清楚这些操作和python列表自带的操作有什么区别,但是这样打一遍,收获却是挺多的。例如:内部逻辑的理解,还有一些魔法方法的使用也掌握了。
  2. 不要单纯的赋值粘贴代码,因为这样的学习效果并不好。应该自己慢慢的敲。虽然这样只是代码的搬运工,但是我认为只有经过这些搬运,才能深刻的理解代码,才能达到灵活的运用,最后才能成为高级程序员。

你可能感兴趣的:(不限,列表,python,数据结构,算法)