【数据结构和算法】线性结构

实现一个array

#用 list 实现 Array ADT
#因为在别的语言中,array是定长的,因此我们在此,通过List来实现一个定长的数组
这几个魔术方法,能不能会,能不能顶住

# 用 list 实现 Array ADT
# 因为在别的语言中,array是定长的,因此我们在此,通过List来实现一个定长的数组
# 这几个魔术方法,能不能会,能不能顶住

class Array():
    def __init__(self, size) -> None:
        self.__size = size
        self.__item = [None] * size
    
    def __getitem__(self, index):
        return self.__item[index]
    def __setitem__(self,key, value):
        self.__item[key] = value
    
    def __len__(self):
        return self.__size
    
    def clear(self, value = None):
        for i in range(len(self.__size)):
            self.__item[i] = value
    
    def __iter__(self):
        for v in self.__item:
            yield v

if __name__ == '__main__':
    a = Array(10)
    a[0] = 10
    a[2] = 20
    print(len(a))
    print(a.__len__())
    print("0------------------0")
    for aa in a:
        print(aa)

单链表

增加新数据时,将新数据的地址与谁关联,这个代表tail的未知,或者说起到尾指针的作用,和c语言不一样,他这里走的时无头结点,所以append的分了if else

class Node:
    def __init__(self,value,next=None) -> None:
        self.value = value
        self.next = next
    
    def __str__(self) -> str:
        return 'Node:{}'.format(self.value)
        

class LinkedList():
    def __init__(self) -> None:
        self.root = Node()
        #记录有多少元素
        self.size = 0
        #增加新数据时,将新数据的地址与谁关联,这个代表tail的未知,或者说起到尾指针的作用,和c语言不一样,他这里走的时无头结点,所以append的分了if else
        self.next = None
    
    def append_first(self, value):
        # 头插法
        node = Node(value=value)
        # 判断是否以及有数据
        if not self.next: # 如果么米有节点时
            self.root.next = node # 将新节点挂到root后面
        else:
            temp = self.next.next # 获取原来root后面的那个节点
            self.next.next  = node # 将新的节点挂到root上
            node.next = temp
        self.size += 1
    
    def __iter__(self):
        current = self.root.next
        if current:
            while current is not self.next:
                yield current.Value
                current = current.next
            yield current.value
    
    def find(self, value):
        for v in self.__iter__():
            if v == value:
                return True
    
    def find2(self,value):
        current = self.root.next
        if current:
            while current is not self.next:
                if current.value == value:
                    return current
                current = current.next
    def remove(self,value):
        current = self.root.next
        if current:
            while current is not self.next: 
                if current.value == value:
                    temp.next = current.next
                    del current
                    self.size -= 1
                    return True
                temp = current
                current = current.next


if __name__ == "__main__":
    link = LinkedList()
    link.append('孙悟空')
    link.append('猪八戒')
    link.append_first('唐僧')
    for v in link:
        print(v)
    # print(link.find('孙悟空'))
    # print(link.find('六儿猕猴'))
    # print(link.find2('孙悟空'))
    # print(link.find2('六儿猕猴'))
    print('-'*30)
    link.remove('孙悟空')
    for v in link:
        print(v)

双向链表

待续

猜你喜欢

转载自blog.csdn.net/weixin_40293999/article/details/130177420