数据结构与算法 顺序表 链表

内存

  • 计算机的作用
    • 用来存储和运算二进制的数据
 
  • 衡量计算机内存大小的单位:
    • bit(位):
    • 字节:8bit
    • kb:1024字节
    • mb:1024kb
 
  • 问题:计算机如何计算1+2?
    • 必须先在计算机的内存开辟内存空间
    • 才将对应的数值存储到该内存中
 
  • 变量的概念
    • a = 10 在计算机中表示的含义(内存图)
    • 内存空间开辟好了之后,每一块内存空间都会有两个默认的属性
      • 内存空间的大小:算机内存大小的单位
      • 内存空间的地址:十六进制的数值
        • 地址作用:用来定位(追踪)指定内存空间,就可以获取该内存空间中存储的数据
    • 变量本质表示的是内存空间的地址,通常变量想要表示的就是内存地址对应的内存空间
 
  • 理解a=10的内存图(引用,指向)
    • 引用:变量
    • 指向:如果某一个变量/引用存储了某一块内存空间的地址后,则表示该变量指向了该内存地址所对应的内存空间。
 
  • 不同数据占用内存空间的大小
 

顺序表

  • 容器/数据结构中存储的元素是有顺序的,顺序表的结构可以分为两种形式:单数据类型(numpy)和多数据类型(list)。
  • python中的列表和元组就属于多数据类型的顺序表
 
  • 单数据类型顺序表的内存图(内存连续开启)
 
  • 多数据类型顺序表的内存图(内存非连续开辟)
 
  • 顺序表的弊端:顺序表的结构需要预先知道数据大小来申请连续的存储空间,而在进行扩充时又需要进行数据的搬迁。
 

链表:相对于顺序表,链表结构可以充分利用计算机内存空间,实现灵活的内存动态管理且进行扩充时不需要进行数据搬迁。

  • 链表(Linked list)是一种常见的基础数据结构,是一种线性表,但是不像顺序表一样连续存储数据,而是每一个结点(数据存储单元)里存放下一个结点的信息(即地址)
 

. is_empty():链表是否为空

. length():链表长度

. travel():遍历整个链表

. add(item):链表头部添加元素

. append(item):链表尾部添加元素

. insert(pos, item):指定位置添加元素

. remove(item):删除节点

. search(item):查找节点是否存在

# 每一项
class Node():
    def __init__(self,item):
        self.item=item
        self.next=None

# 链表
class Link():
    # 先创建一个空的链表
    def __init__(self):
        self._head=None

    # 链头添加数据
    def add(self,item):
        # 实例化
        node=Node(item)
        #注意不为空时,如何添加
        node.next=self._head
        self._head=node
    # 链表展示
    def travel(self):
        cur=self._head
        while cur:
            print(cur.item)
            cur=cur.next
    # 链表长度
    def length(self):
        count=0
        cur=self._head
        while cur:
            count += 1
            cur=cur.next
        return count

    def isEmpty(self):
        return self._head==None

    # 链表尾部添加
    def append(self,item):
        node=Node(item)
        # 链表为空
        if self.isEmpty():
            self._head=node
            return

        # 链表不为空
        cur=self._head
        pre=None
        while cur:
            pre=cur
            cur=cur.next
        pre.next=node
    # 查找
    def search(self,item):
        flag=False
        cur=self._head
        while cur:
            if cur.item==item:
                flag=True
                break
            cur=cur.next
        return flag
    # 插入
    def insert(self,pos,item):
        # 插入位置错误
        length=self.length()
        if pos<1 or pos>length:
            print('pos 错误')
            return
        else:
            node=Node(item)
            # 假定插入起始值 为1
            cur=self._head
            pre=None
            for i in range(pos-1):
                pre=cur
                cur=cur.next
            pre.next=node
            node.next=cur
    # 删除  删除遇到的第一个元素
    def remove(self,item):
        cur=self._head
        pre=None
        # 删除的是第一个节点
        if cur.item==item:
            self._head=self._head.next
            return
        # 删除的不是第一个节点
        while cur:
            if cur.item==item:
                pre.next=cur.next
                break
            else:
                pre=cur
                cur=cur.next
#链表图

link=Link()
link.append(1)
link.append(2)
link.append(3)

# link.travel()
# print(link.length())
# print(link.isEmpty())
# print(link.search(4))
# link.insert(2,1)
link.remove(1)
link.travel()

猜你喜欢

转载自www.cnblogs.com/XLHIT/p/11361087.html