python数据结构——(3)表及其应用

表,分为无序表有序表

无序表

无序表概念:数据项按照相对位置存在的数据列表,跟数据的大小无关。
例如:[21, 44, 5, 65, 32]

在Python中,无序表的数据结构完全可以用Python本身的List表示。list的方法和功能如下:

方法功能
.append(item)将item插入到列表最后
.index(item)返回item在列表中的位置
.insert(pos, item)在列表中pos的位置插入item
.pop()移除列表中的最后一个元素
.pop(pos)移除列表中位置为pos的元素

这对于c/c++来说,几乎是作弊。为了学习表的精髓和灵魂,我们同样采用链表实现无序表和有序表。
链表示意图

最基本元素:节点Node。上图中一个蓝色和黄色部分组成一个节点。其至少包含两个基本信息:(1)数据项本身;(2)指向下一节点的引用信息。

# 链表实现:节点Node
class Node:
    def __init__(self, initdata):
        self.data = initdata
        self.next = None
        
    def getData(self):
        return self.data
    
    def getNext(self):
        return self.next
    
    def setData(self, newdata):
        self.data = newdata
        
    def setNext(self, newnext):
        self.next = newnext

测试代码:

temp = Node(93)
temp.getData()

输出结果:

93

无序表的实现:

 # 无序表
class UnorderedList:
    def __init__(self):
        self.head = None
        
    def isEmpty(self):
        return self.head == None
        
    # add方法实现
    def add(self, item):
        temp = Node(item)
        temp.setNext(self.head)
        self.head = temp
        
    # size实现
    def size(self):
        current = self.head
        count = 0
        while current != None:
            count += 1
            current = current.getNext()
        return count
    
    # search 实现
    def search(self, item):
        current = self.head
        found = False
        while current != None and not found:
            if current.getData() == item:
                found = True
            else:
                current = current.getNext()
        return found
    
    # remove(item)
    def remove(self, item):
        current = self.head
        previous = None
        found = False
        while not found:
            if current.getData() == item:
                found = True
            else:
                previous = current
                current = current.getNext()
                
        if previous == None:
            self.head = current.getNext()
        else:
            previous.setNext(current.getNext())
方法注意事项
add(item)链表中最容易添加元素的位置是“表头”,
size()没有方法可以直接读取列表长度,所以需要从头遍历整个链表得到size
search(item)寻找元素同样需要遍历整个链表
remove(item)移除之前,需要先找到元素。但是移除的时候,要将该移除节点的指向信息传递给前一个节点,然后删除该节点

有序表

有序表中的数据按照某种可比性质放入列表,例如数字大小、字母的先后顺序,这些性质决定了数据在列表中的位置。

有序表中方法和无序表基本类似,在添加元素add(item)和寻找元素search(item)有细微区别。

# 有序表OrderList实现
class OrderedList:
    def __init__(self):
        self.head = None
        
    def isEmpty(self):
        return self.head == None
        
    # size实现
    def size(self):
        current = self.head
        count = 0
        while current != None:
            count += 1
            current = current.getNext()
        return count
    
    # remove(item)
    def remove(self, item):
        current = self.head
        previous = None
        found = False
        while not found:
            if current.getData() == item:
                found = True
            else:
                previous = current
                current = current.getNext()
                
        if previous == None:
            self.head = current.getNext()
        else:
            previous.setNext(current.getNext())
            
        # search 方法 当前节点的数据大于找的数据,就False
        def search(self, item):
            current = self.head
            found = False
            stop = False
            while current != None and not found and not stop:
                if current.getData() == item:
                    found = True
                else:
                    if current.getData() > item:
                        stop = True
                    else:
                        current = current.getNext()
            return found
        
        # add 方法实现
        def add(self, item):
            current = self.head
            previous = None
            stop = False
            while current != None and not stop:
                if current.getData() > item:
                    stop = True
                else:
                    previous = current
                    current = current.getNext()
            temp = Node(item)
            
            # 插入在表头
            if previous == None:
                temp.setNext(self.head)
                self.head = temp
            # 插入在表中
            else:
                temp.setNext(current)
                previous.setNext(temp)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值