zoukankan      html  css  js  c++  java
  • 数据结构与算法 顺序表 链表

    内存

    • 计算机的作用
      • 用来存储和运算二进制的数据
     
    • 衡量计算机内存大小的单位:
      • 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()
  • 相关阅读:
    维护keepalived与mysql漂移脚本
    Linux限制普通用户只能使用某命令
    Android的AlertDialog详解
    android:传感器的使用
    android:wifi
    android: 使用Canvas 绘图
    在 Eclipse 中 配置 tomcat
    android:AIDL
    android之Service 深入剖析
    广播发送者与广播接收者
  • 原文地址:https://www.cnblogs.com/XLHIT/p/11361087.html
Copyright © 2011-2022 走看看