码迷,mamicode.com
首页 > 其他好文 > 详细

01.线性表

时间:2019-10-16 16:12:50      阅读:78      评论:0      收藏:0      [点我收藏+]

标签:rev   eve   排序   顺序   value   状态   empty   判断   link   

顺序表

python中的list和tuple就采用了顺序表的实现技术

tuple是不变的表,因此不支持改变其内部状态的任何操作

list是一种元素个数可变的线性表,可以加入和删除元素,在各种操作中维持已有元素的顺序

list对象无法设置容量的操作

 

if __name__ == __main__:
    lt = list([1, 3, 2])
    print(len(lt))  # 3
    print(lt)  # [1, 3, 2]
    # 元素顺序倒置
    lt.reverse()
    print(lt)  # [2, 3, 1]
    # 排序
    lt.sort()
    print(lt)  # [1, 2, 3]
    # 清除表中所有元素
    lt.clear()
    print(len(lt))  # 0

技术图片

 

单链表:

单链表头部添加元素:

 

技术图片

 

class LNode:
    """表节点"""

    # next_防止与标准函数next重名
    def __init__(self, elem, next_=None):
        self.elem = elem
        self.next = next_


class LinkedListUnderflow(ValueError):
    pass


class LList:
    """单链表"""

    def __init__(self):
        self._head = None

    def is_empty(self):
        """链表是否为空"""
        return self._head is None

    def __len__(self):
        """链表长度"""
        count = 0
        p = self._head
        while p:
            count += 1
            p = p.next
        return count

    def prepend(self, elem):
        """表头插入数据"""
        # node = LNode(elem)
        # node.next = self._head
        # self._head = node
        # 合并为一句
        self._head = LNode(elem, self._head)

    def pop(self):
        """删除头一个元素"""
        if self._head is None:  # 无结点,抛出异常
            raise LinkedListUnderflow("in pop")
        e = self._head.elem
        self._head = self._head.next
        return e

    def append(self, elem):
        """尾部添加元素"""
        if self._head is None:
            self._head = LNode(elem)
            return
        p = self._head
        while p.next is not None:
            p = p.next
        p.next = LNode(elem)

    def printall(self):
        p = self._head
        while p:
            print(p.elem, end=‘‘)
            if p.next:
                print(, , end=‘‘)
            p = p.next
        print(‘‘)

    def for_each(self, proc):
        """遍历函数,proc的参数应该是可以作用于表元素的操作函数,如:print"""
        p = self._head
        while p:
            proc(p.elem)
            p = p.next

    def elements(self):
        """迭代器"""
        p = self._head
        while p:
            yield p.elem
            p = p.next

    def find(self, pred):
        """返回符合条件的第一个"""
        p = self._head
        while p is not None:
            if pred(p.elem):
                return p.elem
            p = p.next

    def filter(self, pred):
        """筛选生成器"""
        p = self._head
        while p is not None:
            if pred(p.elem):
                yield p.elem
            p = p.next

if __name__ == __main__:
    llist1 = LNode(1)
    p = llist1
    for i in range(2, 11):
        p.next = LNode(i)
        p = p.next
    p = llist1
    # 可简写 while p:
    while p is not None:
        print(p.elem)
        p = p.next
    mlist1 = LList()
    for i in range(3):
        mlist1.prepend(i)
    for i in range(4, 7):
        mlist1.append(i)
    mlist1.printall()  # 2, 1, 0, 4, 5, 6
    mlist1.for_each(print)
    print("-------")
    for x in mlist1.elements():
        print(x, end= )  # 2 1 0 4 5 6
    print("-------")
    print(mlist1.find(lambda z: z > 3))  # 4
    print("-------")
    for x in mlist1.filter(lambda z: z > 3):
        print(x, end= )  # 4 5 6
    print("-------")
    print(len(mlist1))  # 6

 

 带有尾节点引用的单链表:

头部添加元素:

技术图片

 

 

 

class LList2(LList):
    """带有尾节点引用的单链表"""

    def __init__(self):
        # 相当于LList.__init__()
        super(LList2, self).__init__()
        self._rear = None

    def prepend(self, elem):
        """表头插入数据"""
        if self._head is None:
            self._head = LNode(elem, self._head)
            self._rear = self._head
        else:
            self._head = LNode(elem, self._head)

    def append(self, elem):
        """尾部添加元素"""
        if self._head is None:
            self._head = LNode(elem, self._head)
            self._rear = self._head
        else:
            self._rear.next = LNode(elem)
            self._rear = self._rear.next

    def pop_last(self):
        """弹出末尾元素"""
        if self._head is None:
            raise LinkedListUnderflow("in pop_last")
        p = self._head
        # 只有一个元素
        # 表判断空用_head的值,所有删除最后一个结点使表变空时,不需要给_rear赋值None
        if p.next is None:
            e = p.elem
            self._head = None
            return e
        while p.next.next:
            p = p.next
        e = p.next.elem
        p.next = None
        self._rear = p
        return e


if __name__ == __main__:
    mlist1 = LList2()
    mlist1.prepend(1)
    mlist1.prepend(2)
    for i in range(3, 5):
        mlist1.append(i)
    for i in mlist1.elements():
        print(i, end= )  # 2 1 3 4
    print("---------")
    print(mlist1.pop_last())  # 4

 

01.线性表

标签:rev   eve   排序   顺序   value   状态   empty   判断   link   

原文地址:https://www.cnblogs.com/fly-book/p/11685581.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!