Python数据结构之顺序表和单链表介绍

一.顺序表和单链表介绍

计算机的内存、数据类型本质及连续存储

  1. 在计算机内存中,存储数据的基本单位是字节(bytes),一个字节是8位,也就是8比特
  2. 对于32系统的电脑而言,一个整型占4个字节,一个字符占一个字节
  3. 计算机内存空间是有一些基本的存储单元(字节)组成的。
    总结:不同数据类型占用的存储单元的个数不同;根据不同的数据类型,计算机会对相应的数据类型作出不同的处理

顺序表的基本形式

  1. 基本元素顺序表:将元素直接进行连续存储
  2. 元素外置顺序表:将元素的内存地址进行连续存储,再以链接的形式关联上对应的元素

顺序表的两种基本实现方式

  1. 一体式的存储结构:其实一个完整的顺序表分为表头和数据区,表头包含容量和元素存储个数,一体式的存储结构的表头和数据区是一体的。
  2. 分离式的存储结构: 其实一个完整的顺序表分为表头和数据区,表头包含容量和元素存储个数,但分离式的存储结构的表头和数据区是分开的。
  3. 一体式的存储结构和分离式的存储结构的区别:一体式的存储结构如果有元素发生置换,则顺序表的所有元素会全部置换,内存地址会相应发生改变;而分离式的存储结构当有元素发生置换时只有数据区会发生相应的改变,表头内存地址不变,因此顺序表的内存地址也不会改变

备注:python内置的数据类型列表采用的就是分离式、元素外置的顺序表实现方式,所以对列表进行操作其内存依然不改变

顺序表的扩充策略

  1. 每一次扩充十个元素的的方式来实现扩充
  2. 每一次扩充4倍大,当空间达到规定的阀值后,改用每一次扩充一倍的方式

二.链表的介绍及具体实现

1.单链表的介绍

单链表的节点以数据区和链接区作为一个完整的节点,单链表可以更加灵活的管理数据存储空间,形成一个动态链表

2. 单链表节点的实现

创建链表节点

'''创建链表节点模板 '''
class StructNode():
	def __init__(self,element):
		self.element = element
		self.next = None
#创建一个节点
node = StructNode(100)

3.创建单链表

如何创建单链表

'''创建单链表模板'''
class SingleLinklist():
	def __init__(self,node = None):
		self.__head = node
#创建空链表
empty_link_list = SingleLinklist()

4.将已有节点挂载到创建的单链表上

#创建节点
class StructNode(object):
	def __init__(self,element):
		self.element = element
		self.next = None
#创建单链表
class SingleLinklist(object):
	def __init__(self,node = None):
		self.__head = node
		print(self.__head)
#将已有节点挂载到单链表上
node = StructNode(100)
link_list = SingleLinklist(node) 

输出结果:
在这里插入图片描述

#当节点没挂载到链表上时
link_list = SingleLinklist()
#输出结果则为:
None

5.判断链表是否为空

#首先得创建一个链表
class SingleLinklist(object):
	#初始化链表
	def __init__(self,node = None):
		self.__head = node
		#print(self.__head)
	#判断链表是否为空,若为空则返回True,否则返回False
	def empty_judgement(self):
		if self.__head == None:
			return True
		else:
			return False
		#也可以简写成这样:
		#return self.__head == None
#创建一个节点
class StructNode(object):
	def __init__(self,element):
		self.element = element
		self.next = None

#实例化
node = StructNode(100)
link_list = SingleLinklist(node)
link_list_latter = SingleLinklist()
print(link_list.empty_judgement())   #返回False
print(link_list_latter.empty_judgement())   #返回True
 		

输出结果分别为:

False
True

6.检查链表的长度

#首先得创建一个链表
class SingleLinklist(object):
	#初始化链表
	def __init__(self,node = None):
		self.__head = node
	#检查链表的长度
	def length(self):
		count = 1
		if self.__head == None:
			count = 0
		else:
			curl  = self.__head
			while curl.next != None:
				count += 1
				curl = curl.next
		return count
	#检查链表长度的另一个方法
	#def length(self):
		#count = 0
		#创建指针
		#curl = self.__head
		#while curl != None:
			#count += 1
			#curl = curl.next
		#else:
			#return count
#创建一个节点
class StructNode(object):
	def __init__(self,element):
		self.element = element
		self.next = None
#实例化
node = StructNode(300)
link_list = SingleLinklist(node)	
link_list_later = SingleLinklist()
#检查链表长度
print(link_list.length())   #返回值为1
print(link_list_later.length()) 	#返回值为0
			

输出结果如下:

1
0

7. 检查某个元素在链表中是否存在

#首先得创建一个链表
class SingleLinklist(object):
	#初始化链表
	def __init__(self,node = None):
		self.__head = node
		#print(self.__head)
	#判断链表是否为空,若为空则返回True,否则返回False
	def empty_judgement(self):
		if self.__head == None:
			return True
		else:
			return False
		#也可以简写成这样:
		#return self.__head == None
	#判断元素在链表中是否存在
	def ElementExists(self,element):
		if self.empty_judgement():
			return False
		else:
			curl = self.__head
			res = False
			while curl != None:
				if curl.element == element:
					res = True
					break
				else:
					curl = curl.next
			return res
			
#创建一个节点
class StructNode(object):
	def __init__(self,element):
		self.element = element
		self.next = None
#实例化
node = StructNode(30)
link_list = SingleLinklist(node)    #创建非空链表
link_list_later = SingleLinklist()  #创建空链表
print(link_list.ElementExists(20))       #判断是否存在
print(link_list.ElementExists(30))       #判断是否存在
print(link_list_later.ElementExists(30)) #判断是否存在

输出结果:

False
True
False

三.如何判断一个字符串里面的字符是否都不重复

创建一个函数来实现判断传入的元素是否重复的功能

def is_repeated():
	res = False
	while not res:
		element = input('请输入:  ')
		s = set(element)
		if len(s) == len(element):
			print('您输入的字母都没有重复')
			res = True
		else:
			print(res,'您输入有重复字母,请重新输入')
	return res
print(is_repeated())

输出结果:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值