赞
踩
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()
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。