基于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。
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=" ") # 打印所有元素,双空格分隔不换行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("程序已终止")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()): # 如果插入位置位于现有数据之间pnode = self.head # 游标for i in range(index): #还是循环pnode = pnode.nextnode = 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.headfor 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.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 == "查找元素个数":self.Length()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()
基于Python的数据结构实验——顺序表与单链表建立与操作(附详细代码和注释)相关推荐
- 基于Python的数据结构实验——顺序栈与链栈建立与操作(附详细代码和注释)
1.创建名为 prac03_01.py 的文件,在其中编写一个顺序栈的类,该类必须包含顺序栈 的定义及基本操作,并通过以下步骤测试基本操作的实现是否正确,给出运行结果. (1)初始化一个顺序栈 Seq ...
- 线性表之顺序表与单链表的区别及优缺点
这里比较的是基于C语言实现的顺序表与单链表,与其他语言的实现可能会有差异,但我相信语言是相通的,它们的实现机制应该也差不多. 1.What 什么是顺序表和单链表 ①顺序表: 顺序表是在计算机内存中以数 ...
- 数据结构实验二——建立具有至少10个元素的顺序表或单链表,并能对该表进行查找、删除等基本操作。
结合实际应用,建立具有至少10个元素的顺序表或单链表,并能对该表进行查找.删除等基本操作. //主函数 #include"Sq.h" #include<stdio.h> ...
- 逆置单链表c语言程序,(数据结构C语言版)顺序表和单链表的逆置
<(数据结构C语言版)顺序表和单链表的逆置>由会员分享,可在线阅读,更多相关<(数据结构C语言版)顺序表和单链表的逆置(7页珍藏版)>请在人人文库网上搜索. 1.实验1-1顺序 ...
- 数据结构——线性表:顺序表、单链表、双链表(C++)
内容概要: 1.代码部分: 线性表抽象类 顺序表类 单链表类 双链表类 主函数 2.基本概念及注意事项 代码(测试环境VS2017): //线性表ADT类的定义:ADT_List.htemplate ...
- 数据结构个人笔记 第三课 顺序表和单链表
数据结构个人笔记 第三课 顺序表和单链表 顺序表的基本操作 插入元素 删除元素 顺序表查找元素 顺序表更改元素 本节总结代码 单链表 链表的节点 头节点.头指针和首元结点 链表的创建(初始化) 本节总 ...
- 数据结构----顺序表与单链表(JAVA)
下面为学习顺序表和单链表的一些基本操作函数: 1 public class SeqList<T> extends Object { 2 protected int n; 3 protect ...
- java如何给顺序表赋值_JAVA模拟新增顺序表及单链表
最近在回顾大学学的数据结构,这里给大家用javwww.cppcns.coma模拟顺序表和单链表的新增 1顺序表新增 /** * 顺序www.cppcns.com表 * * @author cjd * ...
- 顺序表和单链表的插入删除操作时间复杂度的区别
顺序表和单链表的插入删除操作时间复杂度的区别 最近在学习数据结构,看到如果需要用到大量的插入和删除操作,单链表的效率会高于顺序表.看到这里时内有有个疑惑,这两种数据结构的插入和删除操作的时间复杂度不都 ...
最新文章
- idea 关于spring boot实现自动编译
- vue路由跳转权限_vue权限路由实现方式总结
- 学习笔记(58):Python实战编程-Combobox
- python的属性访问,python:如何访问函数的属性
- 红橙Darren视频笔记 数据库操作优化 数据查询(数据库操作)中
- spark sql 入门详解
- scala 主构造函数_Scala主构造器和辅助构造器
- android system image,android systemimage默認大小以及如何修改
- python教程-1.基础篇
- 三步棋,跟着bit鹏哥学得
- c语言10k ntc 测温表,10KNTC热敏电阻对照表.doc
- android系统息屏设置_安卓实现熄屏功能。
- [usaco2010 Oct]Soda Machine (入门oj Problem 6195 )
- 工业互联网新发展:基于 HTML5 WebGL 的高炉炼铁厂可视化系统!
- 杭州seo优化月底工作总结
- 顾大松:对北京市出租车、网约车、顺风车文件征求意见稿的六项建议
- php 将ppt转html,C#实现将PPT转换成HTML的方法
- 量化投资中的因子逻辑是什么?该如何实现?
- Mysql深入浅出(一)
- 第1章 用物理模型进行高效的水模拟
热门文章
- 20行代码制作字符画版小黄鸭表情包 | 文末送书抽奖结果
- word只能以安全模式打开
- EM78P468 义隆单片机 单键触控
- 【图灵学院】JAVA互联网架构【全】
- android 紫外线传感器,Arduino光线传感器-UV Sensor V1.0-ML8511紫外线传感器
- 【数学】树的重心的性质及其证明
- 史上最简单的spark教程第二章-快速开发部署你的第一个Java+spark程序
- 游戏角色3d建模用什么软件
- 目标检测综述(二:古典方法对比现代方式以及目标检测算法相关概述)
- index函数python什么意思,python index函数是什么