数据结构与算法 顺序表 链表
内存
- 计算机的作用
- 用来存储和运算二进制的数据
- 衡量计算机内存大小的单位:
- 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()