1、创建一个名为 prac02_01.py 的文件,在其中编写一个顺序表的类,该类必须包含顺 序表的定义及基本操作,并通过以下步骤测试基本操作的实现是否正确,给出运行结果。
(1)初始化一个顺序表 SL。
(2)判断 SL 是否为空。
(3)将元素 2,5,16,55,8 依次存入 SL 中。
(4)输出 SL 中元素的个数。
(5)获取 SL 中元素 5 的位置。
(6)在元素 5 之后插入元素 11。
(7)删除值为 16 的元素。
(8)将 SL 中元素依次输出。
(9)销毁 SL。
class SequenceList(object): # 新建顺序表类
def __Init__(self):
self.sequencelist = [] # 初始化顺序表
def EmptyJudgement(self): # 是否为空判断函数
if len(self.sequencelist) == 0: # 列表长度为0
print("顺序表为空。") # 显示为空
else:
print("顺序表不为空。")
def Insert(self):
counter = len(self.sequencelist) # 准备计数
while True: # 循环输入
info = input("请输入要插入的数据,一次输入一个,输入“终止”以结束输入:")
if info == "终止":
print("已终止输入。")
break # 终止输入则终端循环
elif info == "": # 控制存在就不让输入
print("数据不能为空,请重新插入。")
else:
counter = counter + 1 # 计数器
self.sequencelist.append(info)
print("成功插入第%d个元素%s" % (counter, info)) # 显示信息
def Count(self):
length = len(self.sequencelist)
print("顺序表现有元素%d个" % length) # 获取长度然后打印出来
def GetIndex(self): # 获取索引和位置函数
length = len(self.sequencelist) # 这是循环的时候定界用的
info = input("请输入要查找的元素:")
for i in range (length):
if self.sequencelist[i] == info:
print(info, "的索引是", str(i), ",", "其位置是", str(i+1)) # 索引不够直观,因此加一个位置
break # 终止循环节省算力
elif self.sequencelist[i] != info and i == length - 1: # 如果都循环到头了还没找到该元素
print("未查找到该数据,无法执行下一步插入操作")
else:
continue
def InsertByIndex(self): # 定位插入元素
length = len(self.sequencelist)
info = input("请输入要插入位置的前一个元素:")
for i in range(length):
if self.sequencelist[i] == info: #本质还是一个查找的过程,找到了就插入,找不到就不插入了
info2 = input("请输入要插入的元素:")
self.sequencelist.insert(i+1, info2)
print("插入成功")
break
elif self.sequencelist[i] != info and i == length - 1:
print("未查找到该数据,无法执行下一步插入操作")
else:
continue
def Delete(self):
try:
info = input("请输入要删除的元素:")
self.sequencelist.remove(info) # 按照元素信息删除
print("删除成功。")
except ValueError:
print("未查找到改数据,无法执行下一步操作。")
def SelectAll(self):
length = len(self.sequencelist)
for i in range(length):
print(self.sequencelist[i], end=" ") # 打印所有元素,双空格分隔不换行
def DropList(self):
del self.sequencelist # 把列表删了
def Choice(self):
self.__Init__() # 初始化列表
while True:
info = input("请选择操作(插入数据,查找元素位置,查找全部元素,查找元素个数,定位插入元素,列表是否非空,删除元素,删除列表)或输入“终止”以结束:")
if info == "插入数据":
self.Insert()
elif info == "查找元素位置":
self.GetIndex()
elif info == "查找全部元素":
self.SelectAll()
elif info == "查找元素个数":
self.Count()
elif info == "定位插入元素":
self.InsertByIndex()
elif info == "列表是否非空":
self.EmptyJudgement()
elif info == "删除元素":
self.Delete()
elif info == "删除列表":
self.DropList()
print("程序已终止")
break # 列表都删除了就不能再搞其他操作了
elif info == "终止":
print("程序已终止")
break
else:
print("无效指令")
if __name__ == "__main__": # 运行程序
demo = SequenceList()
demo.Choice()
2、创建名为 prac02_02.py 的文件,在其中编写一个结点类,该类中必须包含结点的定 义及初始化操作,再编写一个单链表类,该类中包含单链表的定义及基本操作。请通过以下 步骤测试基本操作的实现是否正确(假定头结点所处位置为第 0 个位置),给出运行结果。
(1)初始化一个单链表 SLL。
(2)判断 SLL 是否为空。
(3)将值为 33,24,231,3,11 的结点依次链入 SLL 中。
(4)获取 SLL 的长度。
(5)将值为 18 的结点插入至 SLL 中第 3 个位置。
(6)在 SLL 首端插入值为 25 的结点。
(7)删除 SLL 中第 4 个位置的结点。
(8)查找 SLL 中第 3 个位置结点的值。
(9)遍历 SLL 中所有结点。
class Node(object): # 定义节点类
def __init__(self, data): # 设置节点
self.data = data # 节点中的数据
self.next = None # 节点存储的下一个的信息
class LinkedList(object): # 定义链表类
def __init__(self):
self.head = Node(None) # 头结点
def EmptyJudgement(self): # 空链表判断函数
if self.Length() == 0: # 检查链表长度,如果为0
return True # 返回True
else:
return False # 不然返回False
def Append(self, data): # 写入数据(追加数据)函数
node = Node(data) # 新建数据节点
if self.EmptyJudgement(): # 判断链表是否为空
self.head.next = node # 为空则将头结点的下一个赋为数据节点
print("成功插入第1个数据%s" % data) # 提示
else: # 如果不是
cnode = self.head # 赋为头结点,作为游标使用
counter = self.Length() + 1 # 计数器,后面提示用的
while cnode.next != None: # 如果还没到空节点就循环
cnode = cnode.next # 不断向后移动游标
cnode.next = node # 退出循环后就将下一个直接将数据节点赋值过去
print("成功插入第%d个数据%s" % (counter, data)) # 提示
def Length(self): # 链表长度判断函数
cnode = self.head # 赋为头结点,作为类似使用
counter = 0 # 长度计数器
while cnode.next != None: # 如果还没到空节点就循环
cnode = cnode.next # 不断向后移动游标
counter = counter + 1 # 计数器计数
return counter # 返回计数结果,即链表元素数量,链表元素
def Insert(self, index, data): # 定位插入函数
if index >= 0 and index < (self.Length()): # 如果插入位置位于现有数据之间
pnode = self.head # 游标
for i in range(index): #还是循环
pnode = pnode.next
node = Node(data)
node.next = pnode.next # 将要插入的数据所形成的节点指向原来的上一个节点所指向的节点
pnode.next = node # 将原来的上一个节点所指向的节点改为新插入的节点
print("插入成功")
elif index >= (self.Length()): #如果插入位置在末尾或超限,直接追加数据
self.Append(data) # 写入数据
print("插入成功")
else: # 索引小于0,判定不合法
print("插入位置不合法")
def HeadInsert(self, data): # 头插函数
self.Insert(0, data) # 直接相当于索引为0时定位插入函数
def Delete(self, index): # 删除元素函数
if index >= 0 and index < (self.Length()): # 一样的判定
cnode = self.head
for i in range(index):
cnode = cnode.next # 游标移动到索引位置的前一个
pnode = cnode # 赋值为将要删除的节点的先导节点
cnode = cnode.next # 将游标再向后移动一个
pnode.next = cnode.next # 将先导节点所指的内容移动到
print("成功删除索引为%d的元素%s" % (index, cnode.data))
del cnode # 删除节点
else: # 直接超限,不再分成两个
print("索引超出合法范围")
def Select(self, index):
if index >= 0 and index < (self.Length()):
cnode = self.head
for i in range(index + 1):
cnode = cnode.next # 直接按照索引定位到节点,然后打印
print("索引为%d位置上的信息为%s" % (index, cnode.data))
else:
print("索引超出合法范围")
def SelectAll(self): # 查找全部元素函数
cnode = self.head
for i in range(self.Length()):
cnode = cnode.next
print(cnode.data, end=" ") # 双空格分隔不换行
def Choice(self):
self.__init__() # 初始化链表
while True:
info = input("请选择操作(写入数据,依索引查找元素,查找全部元素,查找元素个数,定位插入元素,链表是否非空,删除元素)或输入“终止”以结束:")
if info == "写入数据":
while True:
data = input("请输入要写入的数据,一次输入一个,输入“终止”以结束输入:")
if data != "终止":
self.Append(data)
else:
break # 终止的话就直接停止循环
elif info == "依索引查找元素":
while True:
try:
index_0 = input("请输入要查找元素的索引:")
index = int(index_0)
self.Select(index)
break
except ValueError: # 输入错误提醒
print("索引需为自然数")
elif info == "查找全部元素":
self.SelectAll()
elif info == "查找元素个数":
quantity = self.Length()
print("元素个数为:%d" % quantity)
elif info == "定位插入元素":
while True:
try:
index_0 = input("请输入插入位置索引:")
index = int(index_0)
data = input("请输入要写入的数据:")
self.Insert(index, data)
break
except ValueError:
print("索引需为自然数")
elif info == "链表是否非空":
a = self.EmptyJudgement()
if a is True:
print("链表为空")
else:
print("链表不为空")
elif info == "删除元素":
while True:
try:
index_0 = input("请输入要查找元素的索引:")
index = int(index_0)
self.Delete(index)
break
except ValueError:
print("索引需为自然数。")
elif info == "终止":
print("程序已终止")
break
else:
print("无效指令")
if __name__ == "__main__": # 运行
demo = LinkedList()
demo.Choice()