Python之数据结构--线性表

线性表

    线性表的定义是描述其逻辑结构,而通常会在线性表上进行的查找、插入、删除等操作。

    线性表作为一种基本的数据结构类型,在计算机存储器中的存储一般有两种形式,一种是顺序存储,一种是链式存储。

    线性表的顺序存储

          1. 定义

              若将线性表L=(a0,a1, ……,an-1)中的各元素依次存储于计算机一片连续的存储空间,这种机制表示为线性表的顺序存储            结构。

          2. 特点

             逻辑上相邻的元素 ai, ai+1,其存储位置也是相邻的;

             存储密度高,方便对数据的遍历查找。

             对表的插入和删除等运算的效率较差。

         3. 程序实现

             在Python中,list存放于一片单一连续的内存块,故可借助于列表类型来描述线性表的顺序存储结构,而且列表本身就提           供了丰富的接口满足这种数据结构的运算。

>>>L = [1,2,3,4]
>>>L.append(10) #尾部增加元素
L
[1, 2, 3, 4, 10]
>>>L.insert(1,20) #插入元素
L
[1, 20, 2, 3, 4, 10]
>>>L.remove(3) #删除元素
L
[1, 20, 2, 4, 10]
>>>L[4] = 30 #修改
L
[1, 20, 2, 4, 30]
>>>L.index(2) #查找
2

 

    线性表的链式存储

          1. 定义

              将线性表L=(a0,a1,……,an-1)中各元素分布在存储器的不同存储块,称为结点,每个结点(尾节点除外)中都持有一个指向下一个节点的引用,这样所得到的存储结构为链表结构。

          2. 特点

              逻辑上相邻的元素 ai, ai+1,其存储位置也不一定相邻;

              存储稀疏,不必开辟整块存储空间。

              对表的插入和删除等运算的效率较高。

              逻辑结构复杂,不利于遍历。

         3. 程序实现

示例:

"""
    (重点)链式存储示例:
    思路:
        1、结点如何表示?
            自定义对象:代表数据元素
            元素数据:自身数据+下一个对象地址数据
        2、如何建立关联?
            利用属性存储下一个对象地址
        3、实现什么样的链表操作?
            初始化--显示--追加--插入--删除--根据索引取值--获取长度--是否为空--清空
"""


class Node:
    def __init__(self, name, n=None):
        self.name = name  # 自身数据
        self.next = n  # 下一个结点

    def __str__(self):
        return str(self.name)


class LinkList:
    def __init__(self):
        self.head = Node(None)

    # 初始化数据
    def init_list(self, list_data):
        p = self.head
        for item in list_data:
            p.next = Node(item)
            p = p.next

    # 显示数据
    def show(self):
        p = self.head.next
        while p:
            print(p, end=" ")
            p = p.next
        print()

    # 末尾添加数据
    def append(self, value):
        last = self.head
        while last.next is not None:
            last = last.next
        last.next = Node(value)

    # 指定位置插入
    def insert(self, index, value):
        node = Node(value)
        length = self.length()
        if index >= length:
            self.append(node)
            return
        i = 0
        p = self.head
        while i < index:
            i += 1
            p = p.next
        node.next = p.next
        p.next = node

    # 删除
    def delete(self, item):
        p = self.head
        while p.next:
            if p.next.name == item:
                p.next = p.next.next
                break
            else:
                raise ValueError("value not in list")
            p = p.next

    # 根据索引获取值
    def get(self, index):
        i = 0
        item = self.head
        while item.next:
            if i == index:
                return item.next
            item = item.next
            i += 1
        else:
            raise IndexError("index out of range")

    # 返回长度
    def length(self):
        length = 0
        last = self.head
        while last.next:
            length += 1
            last = last.next
        return length

    # 返回是否为空
    def is_empty(self):
        return False if self.head.next else True

    # 清空链表
    def clear(self):
        self.head.next = None


if __name__ == '__main__':
    link_list = LinkList()
    link_list.init_list([1, 2, 3])
    link_list.delete(2)
    link_list.show()

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章