当前位置:   article > 正文

基于Python的数据结构实验——顺序表与单链表建立与操作(附详细代码和注释)_单链表实验python

单链表实验python

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。

  1. class SequenceList(object): # 新建顺序表类
  2. def __Init__(self):
  3. self.sequencelist = [] # 初始化顺序表
  4. def EmptyJudgement(self): # 是否为空判断函数
  5. if len(self.sequencelist) == 0: # 列表长度为0
  6. print("顺序表为空。") # 显示为空
  7. else:
  8. print("顺序表不为空。")
  9. def Insert(self):
  10. counter = len(self.sequencelist) # 准备计数
  11. while True: # 循环输入
  12. info = input("请输入要插入的数据,一次输入一个,输入“终止”以结束输入:")
  13. if info == "终止":
  14. print("已终止输入。")
  15. break # 终止输入则终端循环
  16. elif info == "": # 控制存在就不让输入
  17. print("数据不能为空,请重新插入。")
  18. else:
  19. counter = counter + 1 # 计数器
  20. self.sequencelist.append(info)
  21. print("成功插入第%d个元素%s" % (counter, info)) # 显示信息
  22. def Count(self):
  23. length = len(self.sequencelist)
  24. print("顺序表现有元素%d个" % length) # 获取长度然后打印出来
  25. def GetIndex(self): # 获取索引和位置函数
  26. length = len(self.sequencelist) # 这是循环的时候定界用的
  27. info = input("请输入要查找的元素:")
  28. for i in range (length):
  29. if self.sequencelist[i] == info:
  30. print(info, "的索引是", str(i), ",", "其位置是", str(i+1)) # 索引不够直观,因此加一个位置
  31. break # 终止循环节省算力
  32. elif self.sequencelist[i] != info and i == length - 1: # 如果都循环到头了还没找到该元素
  33. print("未查找到该数据,无法执行下一步插入操作")
  34. else:
  35. continue
  36. def InsertByIndex(self): # 定位插入元素
  37. length = len(self.sequencelist)
  38. info = input("请输入要插入位置的前一个元素:")
  39. for i in range(length):
  40. if self.sequencelist[i] == info: #本质还是一个查找的过程,找到了就插入,找不到就不插入了
  41. info2 = input("请输入要插入的元素:")
  42. self.sequencelist.insert(i+1, info2)
  43. print("插入成功")
  44. break
  45. elif self.sequencelist[i] != info and i == length - 1:
  46. print("未查找到该数据,无法执行下一步插入操作")
  47. else:
  48. continue
  49. def Delete(self):
  50. try:
  51. info = input("请输入要删除的元素:")
  52. self.sequencelist.remove(info) # 按照元素信息删除
  53. print("删除成功。")
  54. except ValueError:
  55. print("未查找到改数据,无法执行下一步操作。")
  56. def SelectAll(self):
  57. length = len(self.sequencelist)
  58. for i in range(length):
  59. print(self.sequencelist[i], end=" ") # 打印所有元素,双空格分隔不换行
  60. def DropList(self):
  61. del self.sequencelist # 把列表删了
  62. def Choice(self):
  63. self.__Init__() # 初始化列表
  64. while True:
  65. info = input("请选择操作(插入数据,查找元素位置,查找全部元素,查找元素个数,定位插入元素,列表是否非空,删除元素,删除列表)或输入“终止”以结束:")
  66. if info == "插入数据":
  67. self.Insert()
  68. elif info == "查找元素位置":
  69. self.GetIndex()
  70. elif info == "查找全部元素":
  71. self.SelectAll()
  72. elif info == "查找元素个数":
  73. self.Count()
  74. elif info == "定位插入元素":
  75. self.InsertByIndex()
  76. elif info == "列表是否非空":
  77. self.EmptyJudgement()
  78. elif info == "删除元素":
  79. self.Delete()
  80. elif info == "删除列表":
  81. self.DropList()
  82. print("程序已终止")
  83. break # 列表都删除了就不能再搞其他操作了
  84. elif info == "终止":
  85. print("程序已终止")
  86. break
  87. else:
  88. print("无效指令")
  89. if __name__ == "__main__": # 运行程序
  90. demo = SequenceList()
  91. 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 中所有结点。

  1. class Node(object): # 定义节点类
  2. def __init__(self, data): # 设置节点
  3. self.data = data # 节点中的数据
  4. self.next = None # 节点存储的下一个的信息
  5. class LinkedList(object): # 定义链表类
  6. def __init__(self):
  7. self.head = Node(None) # 头结点
  8. def EmptyJudgement(self): # 空链表判断函数
  9. if self.Length() == 0: # 检查链表长度,如果为0
  10. return True # 返回True
  11. else:
  12. return False # 不然返回False
  13. def Append(self, data): # 写入数据(追加数据)函数
  14. node = Node(data) # 新建数据节点
  15. if self.EmptyJudgement(): # 判断链表是否为空
  16. self.head.next = node # 为空则将头结点的下一个赋为数据节点
  17. print("成功插入第1个数据%s" % data) # 提示
  18. else: # 如果不是
  19. cnode = self.head # 赋为头结点,作为游标使用
  20. counter = self.Length() + 1 # 计数器,后面提示用的
  21. while cnode.next != None: # 如果还没到空节点就循环
  22. cnode = cnode.next # 不断向后移动游标
  23. cnode.next = node # 退出循环后就将下一个直接将数据节点赋值过去
  24. print("成功插入第%d个数据%s" % (counter, data)) # 提示
  25. def Length(self): # 链表长度判断函数
  26. cnode = self.head # 赋为头结点,作为类似使用
  27. counter = 0 # 长度计数器
  28. while cnode.next != None: # 如果还没到空节点就循环
  29. cnode = cnode.next # 不断向后移动游标
  30. counter = counter + 1 # 计数器计数
  31. return counter # 返回计数结果,即链表元素数量,链表元素
  32. def Insert(self, index, data): # 定位插入函数
  33. if index >= 0 and index < (self.Length()): # 如果插入位置位于现有数据之间
  34. pnode = self.head # 游标
  35. for i in range(index): #还是循环
  36. pnode = pnode.next
  37. node = Node(data)
  38. node.next = pnode.next # 将要插入的数据所形成的节点指向原来的上一个节点所指向的节点
  39. pnode.next = node # 将原来的上一个节点所指向的节点改为新插入的节点
  40. print("插入成功")
  41. elif index >= (self.Length()): #如果插入位置在末尾或超限,直接追加数据
  42. self.Append(data) # 写入数据
  43. print("插入成功")
  44. else: # 索引小于0,判定不合法
  45. print("插入位置不合法")
  46. def HeadInsert(self, data): # 头插函数
  47. self.Insert(0, data) # 直接相当于索引为0时定位插入函数
  48. def Delete(self, index): # 删除元素函数
  49. if index >= 0 and index < (self.Length()): # 一样的判定
  50. cnode = self.head
  51. for i in range(index):
  52. cnode = cnode.next # 游标移动到索引位置的前一个
  53. pnode = cnode # 赋值为将要删除的节点的先导节点
  54. cnode = cnode.next # 将游标再向后移动一个
  55. pnode.next = cnode.next # 将先导节点所指的内容移动到
  56. print("成功删除索引为%d的元素%s" % (index, cnode.data))
  57. del cnode # 删除节点
  58. else: # 直接超限,不再分成两个
  59. print("索引超出合法范围")
  60. def Select(self, index):
  61. if index >= 0 and index < (self.Length()):
  62. cnode = self.head
  63. for i in range(index + 1):
  64. cnode = cnode.next # 直接按照索引定位到节点,然后打印
  65. print("索引为%d位置上的信息为%s" % (index, cnode.data))
  66. else:
  67. print("索引超出合法范围")
  68. def SelectAll(self): # 查找全部元素函数
  69. cnode = self.head
  70. for i in range(self.Length()):
  71. cnode = cnode.next
  72. print(cnode.data, end=" ") # 双空格分隔不换行
  73. def Choice(self):
  74. self.__init__() # 初始化链表
  75. while True:
  76. info = input("请选择操作(写入数据,依索引查找元素,查找全部元素,查找元素个数,定位插入元素,链表是否非空,删除元素)或输入“终止”以结束:")
  77. if info == "写入数据":
  78. while True:
  79. data = input("请输入要写入的数据,一次输入一个,输入“终止”以结束输入:")
  80. if data != "终止":
  81. self.Append(data)
  82. else:
  83. break # 终止的话就直接停止循环
  84. elif info == "依索引查找元素":
  85. while True:
  86. try:
  87. index_0 = input("请输入要查找元素的索引:")
  88. index = int(index_0)
  89. self.Select(index)
  90. break
  91. except ValueError: # 输入错误提醒
  92. print("索引需为自然数")
  93. elif info == "查找全部元素":
  94. self.SelectAll()
  95. elif info == "查找元素个数":
  96. quantity = self.Length()
  97. print("元素个数为:%d" % quantity)
  98. elif info == "定位插入元素":
  99. while True:
  100. try:
  101. index_0 = input("请输入插入位置索引:")
  102. index = int(index_0)
  103. data = input("请输入要写入的数据:")
  104. self.Insert(index, data)
  105. break
  106. except ValueError:
  107. print("索引需为自然数")
  108. elif info == "链表是否非空":
  109. a = self.EmptyJudgement()
  110. if a is True:
  111. print("链表为空")
  112. else:
  113. print("链表不为空")
  114. elif info == "删除元素":
  115. while True:
  116. try:
  117. index_0 = input("请输入要查找元素的索引:")
  118. index = int(index_0)
  119. self.Delete(index)
  120. break
  121. except ValueError:
  122. print("索引需为自然数。")
  123. elif info == "终止":
  124. print("程序已终止")
  125. break
  126. else:
  127. print("无效指令")
  128. if __name__ == "__main__": # 运行
  129. demo = LinkedList()
  130. demo.Choice()

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/590858?site
推荐阅读
相关标签
  

闽ICP备14008679号