• 企业400电话
  • 网络优化推广
  • AI电话机器人
  • 呼叫中心
  • 全 部 栏 目

    网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    Python 实现静态链表案例详解
    POST TIME:2021-10-18 12:54

    静态链表和动态链表区别

    静态链表和动态链表的共同点是,数据之间"一对一"的逻辑关系都是依靠指针(静态链表中称"游标")来维持。

    静态链表

    使用静态链表存储数据,需要预先申请足够大的一整块内存空间,也就是说,静态链表存储数据元素的个数从其创建的那一刻就已经确定,后期无法更改。

    不仅如此,静态链表是在固定大小的存储空间内随机存储各个数据元素,这就造成了静态链表中需要使用另一条链表(通常称为"备用链表")来记录空间存储空间的位置,以便后期分配给新添加元素使用。

    这意味着,如果你选择使用静态链表存储数据,你需要通过操控两条链表,一条是存储数据,另一条是记录空闲空间的位置。

    动态链表

    使用动态链表存储数据,不需要预先申请内存空间,而是在需要的时候才向内存申请。也就是说,动态链表存储数据元素的个数是不限的,想存多少就存多少。

    同时,使用动态链表的整个过程,你也只需操控一条存储数据的链表。当表中添加或删除数据元素时,你只需要通过 malloc 或 free 函数来申请或释放空间即可,实现起来比较简单。

    python 实现的静态链表

    静态链表的设计思维非常巧妙,通过索引、游标完成单向链表结构,相对于顺序结构的列表而言,节省了数据移位、内存碎片的开支。

    python 实现的静态链表代码,静态链表采用的 list 结构存储。

    class Node:
        def __init__(self, next, val=None):
            self.val = val  # 值
            self.next = next  # 游标。最后一个元素的游标必须是 0
    
    
    class SLinkList:
        # 分配线性表长度、定义线性表
        def __init__(self, size=7):
            self.size = size
            self.link = [Node((i + 1) % self.size) for i in range(self.size)]
    
        # 线性表清空
        def clearSLL(self):
            self.__init__()
    
        # 线性表是否为空
        def isEmpty(self):
            return False if self.link[self.size - 1].next else True
    
            # 查找空位置
    
        def findEmpty(self):
            ind = self.size
            for i in range(1, self.size - 1):
                if self.link[i].val is None:
                    ind = i
                    break
            return ind
    
        # 指定位置插入元素
        def insert(self, ind, ele):
            sua = -1
            # 前一个元素
            pre = self.size - 1
            # 插入元素的位置(第一个空位置)
            insertLoc = self.link[0].next
            # 条件判断
            if ind  1 or ind >= pre or insertLoc >= self.size:
                return 0
            # 第一个元素的索引
            for i in range(1, self.size - 1):
                index = self.link[pre].next
                if i == ind:
                    self.link[pre].next = insertLoc
                    # 元素插入
                    self.link[insertLoc].val = ele
                    self.link[insertLoc].next = index
                    # 首位元素
                    self.link[0].next = self.findEmpty()
                    sua = 1
                    break
                if self.link[index].val is None:
                    break
                pre = index
            return sua
    
        # 查找线性表某位置的元素
        def getByIndex(self, ind):
            if ind  1 or ind >= self.size - 1:
                return -1
    
            index = self.link[self.size - 1].next
            if index == 0:
                return -1
            for i in range(1, ind):
                index = self.link[index].next
    
            return self.link[index].val
    
            # 查找线性表的元素所在位置
        def locateElement(self, ele):
            index = self.link[self.size - 1].next
            ind = -1
            if index == 0:
                return ind
            for i in range(1, self.size - 1):
                if self.link[index].val == ele:
                    ind = i
                    break
                if self.link[index].val is None:
                    break
                index = self.link[index].next
            return ind
    
            # 删除线性表指定位置的元素
        def deleteElement(self, ind):
            sua = -1
            # 前一个索引
            pre = self.size - 1
            for i in range(1, self.size - 1):
                index = self.link[pre].next
                # 当前位置是个空位置
                if self.link[index].val is None:
                    break
                # 已经遍历到第i个位置
                if i == ind:
                    self.link[pre].next = self.link[index].next
                    self.link[index].val = None
                    # 删除元素的游标指向备用链表
                    self.link[index].next = self.link[0].next
                    # 首位元素
                    self.link[0].next = index
                    sua = 1
                    break
                pre = index
            return sua
    
            # 按照线性表排序线性表遍历
        def travelLink(self):
            print("*" * 50)
            index = self.link[self.size - 1].next
            while self.link[index].val:
                print(
                    f"value = {self.link[index].val} next = {self.link[index].next}"
                )
                index = self.link[index].next
            print("*" * 50)
    
        # 按照索引遍历
        def traversingByIndex(self):
            print("*" * 50)
            for i in range(self.size):
                print(
                    f"index = {i}, value = {self.link[i].val} next = {self.link[i].next}"
                )
            print("*" * 50)
    
    
    if __name__ == '__main__':
        ll = SLinkList()
        ll.traversingByIndex()
        print(ll.isEmpty())
        print(ll.insert(1, 'A'))
        ll.travelLink()
        print(ll.insert(2, 'B'))
        ll.travelLink()
        print(ll.insert(1, 'C'))
        print(ll.insert(4, 'D'))
        ll.travelLink()
        ll.traversingByIndex()
        print(ll.deleteElement(3))
        ll.traversingByIndex()
        ll.travelLink()
        print(ll.isEmpty())
        print(ll.getByIndex(2))
        print(ll.locateElement('BcA'))
        print(ll.clearSLL())
    

    到此这篇关于Python 实现静态链表案例详解的文章就介绍到这了,更多相关Python 实现静态链表内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

    您可能感兴趣的文章:
    • Python rindex()方法案例详解
    • Python 概率生成问题案例详解
    • Python 二叉树的概念案例详解
    • Python实现堆排序案例详解
    • python读取mnist数据集方法案例详解
    • 超实用的 10 段 Python 案例
    上一篇:Python 列表与链表的区别详解
    下一篇:Python和OpenCV进行多尺度模板匹配实现
  • 相关文章
  • 

    关于我们 | 付款方式 | 荣誉资质 | 业务提交 | 代理合作


    © 2016-2020 巨人网络通讯

    时间:9:00-21:00 (节假日不休)

    地址:江苏信息产业基地11号楼四层

    《增值电信业务经营许可证》 苏B2-20120278

    X

    截屏,微信识别二维码

    微信号:veteran88

    (点击微信号复制,添加好友)

     打开微信