图1 黄金链
链的特点是一环扣一环,上一环的尾部扣着下一环的头部。链表也是如此,链表把上一环的尾部扣着下一环的头部的点称为结点,如图2所示的黄金链的位置。在编程语言中,链表是由一组结点的数据元素组成的数据结构。
图2 黄金链中的结点
了解结点后,接下来介绍链表的内部结构。链表的结构其实和图10.2所示内容类似,例如有“学生”这样一个链表,链表中需要包括学生的姓名、性别、学号等一些基本信息。创建这样的一个链表,链表里面包括多个学生的信息,链表的内部结构如图3所示。
图3 学生链表的内部结构图
从图3中可以看出,“学生一”的尾结点“next”指向了下一个“学生二”的头结点学号“02”,这就是链表的特性,即上一个信息的尾结点next会指向下一个信息的头结点的内存地址。由于每个结点都包含了可以链接起来的地址信息,所以用一个变量就能够访问整个结点序列。 在上面讲解中出现了两个词:“指向”和“地址”,了解C语言的人可能会知道,这是典型的指针。没错,在C语言中,可以使用指针创建链表。但是在Python中并没有指针的概念,那么应该怎样创建链表呢?我们先来看如何使用Python交换两个值。首先是定义两个变量,代码如下: x=13 y=14 利用Python交换两个变量代码如下: x,y =y,x 在Python中交换值可以这样做,但在别的语言中不可以。这是因为在Python中,在定义x=13时,除了开辟一块内存给13这个值,还需要开辟一块内存用于存储13的地址,这块地址称之为x。类似地,在定义y=14时,除了开辟一块内存给14这个值,还需要开辟一块内存用于存储14的地址,这块称之为y。所以说,在Python中交换两个数的值,其实是地址的指向发生转换,类似于C语言中的指针。 在“x,y = y,x”中,我们先看右边,“y,x”的值分别为14,13。即得到“x,y =14,13”。然后x再存储14的地址,y再存储13的地址,这样就达到交换的效果。如图4所示。
图4 交换值
因此,Python中的变量名保存的不是值,而是地址。同时,由于在Python中变量是隐式说明,所以Python中x可以指向任何东西。 了解地址在Python代码中的保存形式之后,就用Python代码实现利用结点创建一个链表的功能。代码如下:
"""
功能:定义类,作用是指向下一个结点
"""
class Node():
def __init__(self,elem): # 链表元素
self.elem =elem
self.next = None # 初始设置下一结点为空
接下来,用代码实现利用结点创建一个学生链表。
实例1 创建学生链表
具体代码如下:
"""
功能:创建学生结点类
"""
class student:
def __init__(self):
self.name=''
self.sex = ''
self.next=None
head=student() # 建立链表头部
head.next=None # 下一个元素为空
ptr=head # 储存指针的位置
select=0 # 用来选择
while select!=2: # 不为2就循环
print("(1)添加 (2)退出程序") # 提示
select = int(input('请输入一个选项:'))
if select==1: # 选择1时,添加信息
NewData=student() # 添加下一个元素
NewData.no = input("学号:") # 添加学号
NewData.name=input("姓名:") # 添加姓名
NewData.sex=input("性别:") # 添加性别
ptr.next=NewData # 存储指针设置为新元素所在的位置
NewData.next=None # 下一个元素的next先设置为空
ptr=ptr.next # 指向下一个结点
elif select == 2: # 选择2时退出程序
break
else: # 选择其他时提示有误
print("输入有误")
运行结果如图5所示。
图5 创建学生链表