您当前的位置:首页 > IT编程 > python
| C语言 | Java | VB | VC | python | Android | TensorFlow | C++ | oracle | 学术与代码 | cnn卷积神经网络 | gnn | 图像修复 | Keras | 数据集 | Neo4j | 自然语言处理 | 深度学习 | 医学CAD | 医学影像 | 超参数 | pointnet | pytorch | 异常检测 | Transformers | 情感分类 | 知识图谱 |

自学教程:Python 实现静态链表案例详解

51自学网 2021-10-30 22:12:54
  python
这篇教程Python 实现静态链表案例详解写得很实用,希望能帮到您。

静态链表和动态链表区别

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

静态链表

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

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

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

动态链表

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

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

python 实现的静态链表

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

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

class Node:    def __init__(self, next, val=None):        self.val = val  # 值        self.next = next  # 游标。最后一个元素的游标必须是 0class 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 实现静态链表内容请搜索51zixue.net以前的文章或继续浏览下面的相关文章希望大家以后多多支持51zixue.net!


Python 列表与链表的区别详解
Python和OpenCV进行多尺度模板匹配实现
万事OK自学网:51自学网_软件自学网_CAD自学网自学excel、自学PS、自学CAD、自学C语言、自学css3实例,是一个通过网络自主学习工作技能的自学平台,网友喜欢的软件自学网站。