欢迎各位参考该篇文章,切勿直接复制粘贴,需有自己的思考,该篇文章仅为学习提供思路。
实验目的:理解单链表的链式存储结构,并掌握单链表的基本操作。
实验要求:编写一个节点类,该类中必须包含节点的定义及初始化操作,再编写一个单链表类,该类中包含单链表的定义及基本操作。请通过以下步骤测试基本操作的实现是否正确。
(1)初始化一个单链表SL。
(2)判断SL是否为空。
(3)将值为33、24、231、3、11的节点依次链入SL中。
(4)获取SL的长度。
(5)将值为11的节点插至SL中第3个位置。
(6)在SL首端插入值为25的节点。
(7)删除SL中第4个位置的节点。
(8)查找SL中第3个位置节点的值。
(9)遍历SL中所有节点。
class Node(object):
def __init__(self, data):
self.data = data
self.next = None # 初始化节点函数
class SingleList(object):
def __init__(self):
self.head = Node(None) # 设置头节点
def CreateSingleList(self):
cNode = self.head
Element = input("请输入节点的值:")
while Element != "#":
nNode = Node(int(Element)) # 将输入的值存入节点
cNode.next = nNode
cNode = cNode.next
Element = input("请输入节点的值:")
# 创建一个单链表存储节点
def GetLength(self):
cNode = self.head
length = 0
while cNode.next != None:
length += 1
cNode = cNode.next # 通过指向下一个节点 计数加一获取整个链表的长度
print(f"该链表的长度为:{length}\n")
# 获取单链表的长度
def IsEmpty(self):
if self.GetLength() == 0:
print("该链表为空表.\n")
else:
print("该链表不为空表.\n")
# 判断单链表是否为空
def InsertList_Middle(self):
key = 0
cNode = self.head
Pos = int(input("请输入新节点的指定位置:"))
Element = input("请输入新节点的值:")
nNode = Node(int(Element)) # 先将新值附为一个节点
while key < Pos - 1:
cNode = cNode.next
key += 1 # 通过指针指向下一个节点 计数加一 直到检索新节点的指定位置停止
nNode.next = cNode.next # 新节点前面的节点的指针指向新节点 此时因为指针移动到新节点 新节点变成cNode(curr Node 的意思)
cNode.next = nNode # 新节点后面的节点的地址存进当前位置(也就是cNode)的指针域
# 在节点中间位置插入新节点
def InsertList_First(self):
Element = input("请输入首端新节点的值:")
if Element == "#":
return
cNode = self.head # 设置头节点 头节点为空
nNode = Node(int(Element))
nNode.next = cNode.next # 头节点的指针y移动新节点的指针域
cNode.next = nNode # 原第一个节点的地址存到新节点的指针域 通过移动到新节点的头节点指针指向原第一个节点
# 在首段节点位置插入新节点
def InsertList_Last(self):
Element = input("请输入末端新节点的值:")
if Element == "#":
return
cNode = self.head
nNode = Node(int(Element))
while cNode.next != None:
cNode = cNode.next # 当指针没有检测到None时 指针继续往后移动
cNode.next = nNode # 指针检测到None时 跳出while循环 将新节点的地址存到cNode的指针域
# 在末端节点位置插入新节点
def DeleteNode(self):
key = 0
pNode = self.head
cNode = self.head # 通过设立两个头节点 在往后检测所需的指定位置 形成一前一后
Pos = int(input("请输入你想要删除节点的位置:"))
if self.IsEmpty():
print("当前单链表为空!\n")
return
while key != Pos:
pNode = cNode
cNode = cNode.next
key += 1 # 当计数不为Pos时 两个头节点继续移动 计数加一
pNode.next = cNode.next # 到指定位置时 cNode在指定位置 pNode在其前面
del cNode # 将存在cNode指针域的下一节点的地址 转存到pNode的指针域 此时删除cNode 不影响指针传递
# 在单链表中删除某一节点
def FindNode(self):
key = 0
cNode = self.head
Pos = int(input("请输入你想要查找节点的位置:"))
if self.IsEmpty():
print("当前单链表为空!\n")
return
while key != Pos:
cNode = cNode.next
key += 1 # 当计数不为Pos时 头节点往后移动 计数加一 直至与Pos相等
print(f"在第{Pos}个节点的值为:{cNode.data}\n") # 打印该点的值
# 在单链表中查找某一节点的值
def VisitElement(self, tNode):
if tNode != None:
print(tNode.data, "->", end="")
else:
print("None\n")
def TraverseList(self):
cNode = self.head
if cNode.next == None:
print("当前单链表为空!")
return
print("\n您当前的单链表为:")
while cNode != None:
cNode = cNode.next
self.VisitElement(cNode)
# 遍历整个单链表
LS = SingleList()
LS.CreateSingleList()
LS.InsertList_First()
LS.TraverseList()
LS.InsertList_Middle()
LS.TraverseList()
LS.InsertList_Last()
LS.TraverseList()
LS.DeleteNode()
LS.TraverseList()
LS.FindNode()
LS.TraverseList()
LS.GetLength()
下期预告------python数据结构之循环单链表
不定期更新 如有不足 欢迎指正!