Python 实现静态链表案例详解

 更新时间:2021年09月10日 10:20:14   作者:Yake1965  
这篇文章主要介绍了Python 实现静态链表案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下

静态链表和动态链表区别

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

静态链表

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

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

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

动态链表

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

同时,使用动态链表的整个过程,你也只需操控一条存储数据的链表。当表中添加或删除数据元素时,你只需要通过 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 修改本地网络配置的方法

    python 修改本地网络配置的方法

    今天小编就为大家分享一篇python 修改本地网络配置的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-08-08
  • pycharm中leetcode插件使用图文详解

    pycharm中leetcode插件使用图文详解

    这篇文章主要介绍了pycharm中leetcode插件使用图文详解,本文分步骤给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-12-12
  • KMP算法精解及其Python版的代码示例

    KMP算法精解及其Python版的代码示例

    KMP算法基本上被人们用作字符串的匹配操作,这里我们就来介绍KMP算法精解及其Python版的代码示例,需要的朋友可以参考下
    2016-06-06
  • Python中turtle.write方法使用说明

    Python中turtle.write方法使用说明

    turtle模块以面向对象和面向过程的方式提供turtle图形基元,由于它使用Tkinter作为基础图形,因此需要安装有Tk支持的Python版本,下面这篇文章主要给大家介绍了关于Python中turtle.write方法使用说明的相关资料,需要的朋友可以参考下
    2022-02-02
  • Python3 串口接收与发送16进制数据包的实例

    Python3 串口接收与发送16进制数据包的实例

    今天小编就为大家分享一篇Python3 串口接收与发送16进制数据包的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-06-06
  • Python中使用摄像头实现简单的延时摄影技术

    Python中使用摄像头实现简单的延时摄影技术

    这篇文章主要介绍了Python中使用摄像头实现简单的延时摄影技术,本文只是一个简单的小示例,讲解了实现过程并给出实现代码,需要的朋友可以参考下
    2015-03-03
  • 基于Python实现英语单词小游戏

    基于Python实现英语单词小游戏

    这篇文章主要为大家详细介绍了如何通过Python实现一个简单的英语单词小游戏,四级考满分的学姐告诉你这样学英语逢考必过,赶紧康康叭
    2022-11-11
  • django 使用 request 获取浏览器发送的参数示例代码

    django 使用 request 获取浏览器发送的参数示例代码

    这篇文章主要介绍了django 使用 request 获取浏览器发送的参数示例代码,获取数据有四种方式,具体内容详情大家跟随脚本之家小编一起看看吧
    2018-06-06
  • Python多线程threading和multiprocessing模块实例解析

    Python多线程threading和multiprocessing模块实例解析

    这篇文章主要介绍了Python多线程threading和multiprocessing模块等相关内容,分享了相关代码示例,小编觉得还是挺不错的,这里分享给大家,需要的朋友可以参考下
    2018-01-01
  • python提取具有某种特定字符串的行数据方法

    python提取具有某种特定字符串的行数据方法

    今天小编就为大家分享一篇python提取具有某种特定字符串的行数据方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-12-12

最新评论