【4】数据结构与算法--- 数据结构 进阶

第 3 章 数据结构 进阶

3.1 线性表

线性表:按照某种线性关系存储下来的表

分类:

线性表 说明
顺序表 将数据放在一个连续的存储空间
链表 把数据分散存储,按照某种关系连成串
分类:单向链表、双向链表、单向循环链表

3.2 顺序表

3.2.1顺序表形式

​ 对象:顺序表里的数据

​ 分类/表现形式:

​ 基本布局:同类数据

​ 元素外置:异类数据

​ 原因:操作系统 自动分析传入的数据类型,分配存储空间

  • 如果是同类数据,那么放在连续存储空间
  • 如果是异类数据,那么放在合适的存储空间

基本布局:

	同类型数据

	数据的查看方法:				

				物理地址

				逻辑地址	---  使用的	

								起始位置 + 偏移量*(元素个数-1) 	

								十六进制的表示形式	0x	

元素外置:

异类数据 存储再不连续的空间

			中间手段		 ----逻辑地址

		单独找一个连续的存储空间,来存储各个数据的逻辑地址

		通过跳转的方式找到具体的元素								
3.2.2 顺序表结构

​ 顺序表结构:
A 基本属性
B的空间容量大小
B空间存储元素的个数
B 元素存储空间
结构存储样式:

结构存储样式 说明
一体式 基本属性信息和元素存储空间 放在一个连续空间
分离式 基本属性信息和元素存储空间 分别存放
3.2.3 顺序表实践

​ A.内容更改

		数据存储一旦定性,就永远不会再变,一旦变了,就是生成了一个新的对象空间
		一体式 
		分离式	
			灵活	****** 

​ B.容量更改

	容量扩充策略
		线性增加
		倍数增长			***********
3.2.4 顺序表常见操作
增加
			头部		保序增加 		O(n)
			尾部		保序增加		O(1)
			指定位置
				方法1	非保序增加		O(1)
				方法2	保序增加 		O(n)
删除
			头部		保序删除 		O(n)
			尾部		保序删除		O(1)
			指定位置
				方法1	非保序删除		O(1)	
				方法2	保序删除 		O(n)

3.3 单向链表

3.3.1 单向链表简介
单向链表是什么	
			基本单位:结点
				结点属性:元素数据区域item + 下一个元素的地址next
				多个结点连成串 
链表基本术语
			结点 
			头结点
			尾结点
			前驱结点(前结点)
			后继结点(后结点)
单向链表特点
			1 找到头结点,所有信息都找得到
			2 尾结点的next属性指向为None
			3 保存链表,只需要保存头结点的地址就可以了			
为什么用链表
			灵活、空间利用率高
3.3.2 python 链表解析
3.3.3 实践 之 基本属性
结点的内置属性
			class BaseNode(object):
				# 结点的基本属性
				def __init__(self,item):
					self.item = item
					self.next = None	
3.3.4 实践 之 操作分析
单向链表的基本属性
		class SingleLinkList(object):
			# 单向链表的基本属性 -- 规则3(保存链表,只需要保存头结点的地址就可以了	)
			def __init__(self,node=None):
				self.__head = node
信息查看类 类方法
链表是否为空 is_empty()
链表元素数量 length()
链表内容查看 travel()
链表内容搜索 search(item)
内容增加类 类方法
插头增 add(item)
插尾增 append(item)
指定位置增 insert(pos,item)
内容删除类 类方法
内容删除 remove(item)
3.3.5 实践 之 查看
判空 
			思路:规则3 
			# 判断链表是否为空
			def is_empty(self):
				# 思路:规则3,隐含规则1(头结点找不到就是空链表)
				return  self.__head is None
数量
	# 判断链表元素个数
    def length(self):
        # 准备工作:标签、计数器
        # 找到当前链表的头结点
        cur = self.__head
        count = 0
        # 遍历循环:条件来源于规则2
        # 查找尾结点
        while cur is not None:
            # 对计数进行加1
            count += 1
            # 移动当前的结点位置
            cur = cur.next		# 验证的是规则1
            # 输出最终计数
            return count		
关键点:
      写的时候,按非空链表来写,
      分析的时候,要分析特殊情况,空链表
所有内容
	# 输出链表所有内容
	def travel(self):
        # 准备工作:标签
        cur = self.__head
        # 遍历循环:条件来源于规则2
        while cur is not None:
            # 输出每个结点的内容,设置分隔符为空格(print默认会换行)
            print(cur.item,end=" ")
            # 移动到当前的结点位置
            cur = cur.next
            # 还原分割符为换行符
            print("")
关键点:
	循环遍历的退出条件:while cur is not None 
    结点内容输出:print(cur.item, end=" ") 
    结点移动:cur = cur.next
搜寻内容
    # 查询我要的内容
    def search(self, item):
        # 找到当前链表的头信息
        cur = self.__head
        # 查找尾结点
        while cur is not None:
            # 如果当前结点的内容就是我们要查找的,就返回True
            if cur.item == item:
                return True
            # 移动当前结点位置到下一节点
            cur = cur.next
        # 如果整个循环都找不到我们要的内容,就返回 False
        return False
3.3.6 实践 之 增加

增加元素的流程:

​ 新结点 – 找位置 – 改属性

头部
    # 头部增加结点
    def add(self, item):
        # 1.实例化新结点
        # 定义一个存储数据的新结点
        node = BaseNode(item)
        # 2.将新结点加入到链表中
        # 指定新结点的next属性为之前链表的头信息
        node.next = self.__head
        # 3.修改链表的默认属性:规则3(保存链表,只保存头结点地址)
        # 指定当前链表的头结点为新结点
        self.__head = node
尾部
    # 尾部元素增加
    def append(self,item):
        # 1.实例化新结点
        # 定义一个存储数据的新结点
        node = BaseNode(item)
        # 2.找位置,将新结点加入到链表中
        # 2.1 空位置
        # 如果当前链表为空,那么直接指定头信息为新结点即可
        if self.is_empty():
            self.__head = node
        # 2.2 非空位置
        # 如果当前链表不为空
        else:
            # 找到当前链表的头信息,然后找到尾结点
            cur = self.__head
            while cur.next is not None:
                cur = cur.next
            # 退出循环,cur就处于尾结点位置
            # 找到尾结点就退出循环,尾结点的next指向新结点即可
            cur.next = node
关键点:
思路:
    新结点
    找位置 
        空链表:改self.__head属性
        非空链表:找尾结点;
                改为结点的next属性
指定位置
    # 指定位置增加
    def insert(self, pos, item):
        # 流程:新结点---找位置---判断位置---改属性
        # 1.新增加结点
        # 定义一个存储数据的新结点
        node = BaseNode(item)

        # 2.找位置
        # 2.1 头、尾
        # 头部添加内容
        if pos <= 0:
            self.add(item)
        # 在尾部添加元素
        elif pos >= self.length():
            self.append(item)

        # 2.2 中间位置
        # 在中间添加元素
        else:
            # 准备工作:标签、计数器
            # 找到头信息,并且开始设置计数器初始值
          
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值