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:# 列表长度为0print("顺序表为空。")# 显示为空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:continuedef 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("插入成功")breakelif self.sequencelist[i] != info and i == length - 1:print("未查找到该数据,无法执行下一步插入操作")else:continuedef 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="")# 打印所有元素,双空格分隔不换行defDropList(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("程序已终止")breakelse: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:# 检查链表长度,如果为0return True# 返回Trueelse:return False# 不然返回Falsedef 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()):#如果插入位置在末尾或超限,直接追加数据 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 = 0 and index < (self.Length()):cnode = self.headfor i in range(index + 1):cnode = cnode.next# 直接按照索引定位到节点,然后打印print("索引为%d位置上的信息为%s" % (index, cnode.data))else:print("索引超出合法范围")def SelectAll(self):# 查找全部元素函数cnode = self.headfor i in range(self.Length()):cnode = cnode.nextprint(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)breakexcept 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)breakexcept 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)breakexcept ValueError:print("索引需为自然数。")elif info == "终止":print("程序已终止")breakelse:print("无效指令")if __name__ == "__main__":# 运行demo = LinkedList()demo.Choice()