基于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:  # 列表长度为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()

你可能感兴趣的:(python,python,数据结构)