Python的顺序表

一、脑图 

二、封装一个顺序表的类

1.构造函数

class SeqList:
    #显性定义出构造函数
    def __init__(self,capacity = 10):
        #初始化顺序表 ,设置初始容量和已有元素
        self.capacity = capacity #线性表的最大容量
        self.size = 0 #已存储的元素个数
        self.data = [None]*capacity # 存储数据的容器

2.判空、判满函数

       # 判满,为满返回True
    def is_full(self):
        return self.capacity==self.size

    # 判空,为空返回True
    def is_empty(self):
        return self.size==0

3.尾插函数 

# 尾插
    def add_tail(self,value):
        # 判断列表是否为满
        if self.is_full():
            print("顺序表已满")
        else:
            self.data[self.size]=value
            self.size+=1

3.遍历方法

# 遍历
    def show(self):
        # 判断顺序表是否为空
        if self.is_empty():
            print("顺序表为空")
            return
        else:
            n=0
            while n<self.size:
                print(self.data[n],end=' ')
                n+=1
            print()

 4.在任意位置插入数据

    def add_index(self,index,value):

        # 判满  判断要插入的位置是否合理,顺序表
        # 若满返回True
        if self.is_full() or index < 0 or index > self.size:
            print("插入失败!")
            return False
        else:
            # 腾位
            i = 0
            while i < self.size - index:
                self.data[self.size - i] = self.data[self.size - i - 1]
                i += 1
            # 插入数据
            self.data[index] = value
            # 插入成功 顺序表长度自增
            self.size += 1
            return True

 5.在任意位置删除数据

    def del_index(self,index):
        if self.is_empty() or index>=self.size or index<0:
            print('删除失败')
            return False
        else:
            while index<self.size-1:
                self.data[index]=self.data[index+1]
                index+=1
            self.size-=1
            return

6.按位置进行修改

    def change_index(self,index,value):
        #
        if self.is_empty() or index<0 or index >=self.size:
            print("修改失败")
            return
        else:
            self.data[index]=value

7.按值修改

    def change_value(self,value1,value2):
        if self.is_empty():
            print("修改失败")
            return
        else:
            i=0
            while i<self.size:
                if self.data[i]==value1:
                    self.data[i]=value2
                    break
                else:
                    i+=1
            else:
                print('没找到要修改的值')

8.查找值返回位置

    def find_index(self,value):
        if self.is_empty():
            print('查找失败')
        else:
            i = 0
            while i < self.size:
                if self.data[i] == value:
                    # flag =0
                    return i  # 下标
                i += 1
            # if flag == 1:
            print("查无此数据")
            return -1

9.去重

 def duplicate_removal(self):
        if self.is_empty():
            print('去重失败')
        else:
            i = 0
            while i < self.size:
                # 内层循环从 i+1 开始,检查是否有重复
                j = i + 1
                while j < self.size:
                    if self.data[i] == self.data[j]:
                        # 如果发现重复,删除该元素
                        self.del_index(j)
                    else:
                        j += 1
                i += 1

三、变形

class Student:
    def __init__(self, student_id, name, age, gender):
        # 初始化学生信息,包括学号、姓名、年龄和性别
        self.student_id = student_id  # 学号
        self.name = name              # 姓名
        self.age = age                # 年龄
        self.gender = gender          # 性别

    def __str__(self):
        # 提供一个字符串表示方式,方便打印学生信息
        return f"学号: {self.student_id}, 姓名: {self.name}, 年龄: {self.age}, 性别: {self.gender}"

    def to_dict(self):
        # 将学生信息转换为字典形式
        return {'student_id': self.student_id, 'name': self.name, 'age': self.age, 'gender': self.gender}


class StudentSeqList:
    def __init__(self, capacity=10):
        # 初始化顺序表,默认容量为10
        self.capacity = capacity  # 最大容量
        self.size = 0              # 当前学生数量
        self.data = [None] * capacity  # 存储学生信息的列表,初始化为空

    def is_full(self):
        # 判断顺序表是否已满
        return self.capacity == self.size

    def is_empty(self):
        # 判断顺序表是否为空
        return self.size == 0

    def add_tail(self, student_id, name, age, gender):
        # 向顺序表尾部添加学生
        if self.is_full():
            print("顺序表已满")  # 如果顺序表满了,提示不能添加
        else:
            student = Student(student_id, name, age, gender)  # 创建新的学生对象
            self.data[self.size] = student  # 将学生对象添加到顺序表尾部
            self.size += 1  # 更新顺序表的大小

    def show(self):
        # 显示顺序表中的所有学生信息
        if self.is_empty():
            print("顺序表为空")  # 如果顺序表为空,输出提示信息
        else:
            index = 0
            while index < self.size:
                print(self.data[index])  # 打印每个学生的信息
                index += 1

    def add_index(self, index, student_id, name, age, gender):
        # 在指定位置插入学生
        if self.is_full() or index < 0 or index > self.size:
            print("插入失败!")  # 如果顺序表已满或者索引无效,输出错误提示
            return False
        else:
            student = Student(student_id, name, age, gender)  # 创建新的学生对象
            self._shift_elements_right(index)  # 将插入位置后的元素右移
            self.data[index] = student  # 插入学生对象到指定位置
            self.size += 1  # 更新顺序表的大小
            return True

    def _shift_elements_right(self, index):
        # 将顺序表中指定位置后的元素向右移动一位
        i = self.size - 1
        while i >= index:
            self.data[i + 1] = self.data[i]  # 右移元素
            i -= 1

    def del_index(self, index):
        # 删除指定索引的学生
        if self.is_empty() or index >= self.size or index < 0:
            print('删除失败')  # 如果顺序表为空或者索引无效,输出错误提示
            return False
        else:
            self._shift_elements_left(index)  # 将删除位置后的元素左移
            self.size -= 1  # 更新顺序表的大小
            return True

    def _shift_elements_left(self, index):
        # 将顺序表中指定位置后的元素向左移动一位
        i = index
        while i < self.size - 1:
            self.data[i] = self.data[i + 1]  # 左移元素
            i += 1

    def change_index(self, index, student_id, name, age, gender):
        # 修改指定索引位置的学生信息
        if self.is_empty() or index < 0 or index >= self.size:
            print("修改失败")  # 如果索引无效或顺序表为空,输出错误提示
            return
        student = Student(student_id, name, age, gender)  # 创建新的学生对象
        self.data[index] = student  # 更新学生信息

    def change_value(self, old_name, new_name):
        # 修改指定学生的姓名
        index = 0
        while index < self.size:
            if self.data[index].name == old_name:  # 如果找到了旧姓名的学生
                self.data[index].name = new_name  # 修改姓名
                return
            index += 1
        print("没找到要修改的值")  # 如果没有找到匹配的学生,输出提示

    def find_index(self, student_id):
        # 查找指定学号的学生在顺序表中的位置
        index = 0
        while index < self.size:
            if self.data[index].student_id == student_id:
                return index  # 返回找到的索引
            index += 1
        print("查无此数据")  # 如果没有找到,输出提示信息
        return -1  # 返回-1表示未找到

    def duplicate_removal(self):
        # 去除顺序表中的重复学生(根据学生学号去重)
        index = 0
        while index < self.size:
            student_id = self.data[index].student_id  # 获取当前学生的学号
            next_index = self._remove_duplicates_from(index + 1, student_id)  # 查找后续是否有相同学号的学生
            if next_index != -1:
                self.del_index(next_index)  # 如果有重复,删除该学生
            else:
                index += 1  # 如果没有重复,继续检查下一个学生

    def _remove_duplicates_from(self, index, student_id):
        # 从指定位置开始,查找是否有学号重复的学生
        while index < self.size:
            if self.data[index].student_id == student_id:
                return index  # 返回重复学生的索引
            index += 1
        return -1  # 没有找到重复学生,返回-1

    def to_dict_list(self):
        # 将学生顺序表转换为字典列表
        index = 0
        result = []  # 存储转换后的字典列表
        while index < self.size:
            result.append(self.data[index].to_dict())  # 每个学生对象转换为字典并添加到结果列表
            index += 1
        return result


# 示例用法
if __name__ == '__main__':
    student_list = StudentSeqList()  # 创建学生顺序表实例

    # 添加一些学生信息
    student_list.add_tail(1001, "张三", 20, "男")
    student_list.add_tail(1002, "李四", 21, "男")
    student_list.add_tail(1003, "王二", 22, "男")
    student_list.add_tail(1004, "张三", 20, "女")

    # 显示所有学生信息(字典格式)
    print("学生信息 (字典格式):")
    student_dict_list = student_list.to_dict_list()
    print(student_dict_list)

    # 去重:删除重复的学生
    print("\n去重后的学生信息:")
    student_list.duplicate_removal()
    student_dict_list = student_list.to_dict_list()
    print(student_dict_list)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/920892.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

OpenCV从入门到精通实战(九)——基于dlib的疲劳监测 ear计算

本文实现Python库d和OpenCV来实现眼部闭合检测&#xff0c;主要用于评估用户是否眨眼。 步骤一&#xff1a;导入必要的库和设置参数 首先&#xff0c;代码导入了必要的Python库&#xff0c;如dlib、OpenCV和scipy。通过argparse设置了输入视频和面部标记预测器的参数。 from…

windows下,用CMake编译qt项目,出现错误By not providing “FindQt5.cmake“...

开发环境&#xff1a;windows10 qt5.14&#xff0c; 编译器msvc2017x64&#xff0c;CMake3.30&#xff1b; 现象&#xff1a; CMakeList文件里&#xff0c;如有find_package(Qt5 COMPONENTS Widgets REQUIRED) target_link_libraries(dis_lib PRIVATE Qt5::Widgets) 用CMak…

基于SpringBoot+Vue的影院管理系统(含演示视频+运行截图+说明文档)

web启动链接地址&#xff1a; http://localhost:8082&#xff08;管理端&#xff09; http://localhost:8081&#xff08;用户端&#xff09; http://localhost:8082&#xff08;员工端&#xff09; 一、项目介绍 基于框架的系统&#xff0c;系统分为用户、员工和管理员三个…

SpringBoot3+Vue3开发图书馆管理系统

1 项目介绍 图书馆管理系统&#xff0c;管理图书、用户、借书、还书、实时监测归还是否逾期&#xff0c;逾期未归还会生成违规记录。违规状态不可借阅图书。需缴纳罚金&#xff0c;消除违规记录。可动态设置图书最多累计借阅数量上限和最长借阅天数上限&#xff0c;当用户满足…

Figure 02迎重大升级!!人形机器人独角兽[Figure AI]商业化加速

11月19日知名人形机器人独角兽公司【Figure AI】发布公司汽车巨头【宝马】最新合作进展&#xff0c;旗下人形机器人Figure 02在生产线上的性能得到了显著提升&#xff0c;机器人组成自主舰队&#xff0c;依托端到端技术&#xff0c;速度提高了400%&#xff0c;执行任务成功率提…

Oracle之Rman非归档模式下的完全恢复

引言 首先Oracle必须处在非归档模式下才能模拟各种情况,Oracle处在非归档模式,做数据库脱机备份,并且rman的参数使用快闪恢复区作为备份文件的存储目录,配置了控制文件的自动备份。 联机全备 示例1:控制文件、数据文件以及重做日志文件丢失的恢复 数据文件以及重做日志…

Android Google登录接入

官方文献&#xff1a; 1、前期准备&#xff1a; https://developers.google.cn/identity/sign-in/android/legacy-start-integrating?hlzh-cnhttps://developers.google.cn/identity/sign-in/android/legacy-start-integrating?hlzh-cn 2、具体开发&#xff1a; 新版 Googl…

Java 同步锁性能的最佳实践:从理论到实践的完整指南

目录 一、同步锁性能分析 &#xff08;一&#xff09;性能验证说明 1. 使用同步锁的代码示例 2. 不使用同步锁的代码示例 3. 结果与讨论 &#xff08;二&#xff09;案例初步优化分析说明 1. 使用AtomicInteger原子类尝试优化分析 2. 对AtomicInteger原子类进一步优化 …

Docker+Nginx | Docker(Nginx) + Docker(fastapi)反向代理

在DockerHub搜 nginx&#xff0c;第一个就是官方镜像库&#xff0c;这里使用1.27.2版本演示 1.下载镜像 docker pull nginx:1.27.2 2.测试运行 docker run --name nginx -p 9090:80 -d nginx:1.27.2 这里绑定了宿主机的9090端口&#xff0c;只要访问宿主机的9090端口&#…

C#编写的日志记录组件 - 开源研究系列文章

以前编写过一个日志记录组件的博文&#xff0c;这次发布一个修改过的完善版本。 1、 项目目录&#xff1b; 2、 源码介绍&#xff1b; 1) 实现&#xff1b; 2) 使用&#xff1b; 后面的参数为级别设置&#xff0c;只有大于这个级别的才进行日志记录&#xff0c;限制了日志记录的…

win10+vs2019+cmake+opencv4.10+opencv_contrib编译记录

win10vs2019cmakeopencv4.10opencv_contrib编译记录 第一章 环境配置 本机环境已经安装好vs2019和cmake。 第二章 下载opencv相关 1.Opencv4.10下载 下载链接&#xff1a;opencv 下载时选择"Sources" 2.opencv_contrib 下载链接&#xff1a;opencv_contrib 第三…

前端:HTML (学习笔记)【1】

一&#xff0c;网络编程的三大基石 1&#xff0c;URL &#xff08;1&#xff09;url —— 统一资源定位符&#xff1a; 网址——整个互联网中可以唯一且准确的确定一个资源的位置。 【项目外】 网址——https://www.baidu.com/ …

2024年亚太地区数学建模大赛A题-复杂场景下水下图像增强技术的研究

复杂场景下水下图像增强技术的研究 对于海洋勘探来说&#xff0c;清晰、高质量的水下图像是深海地形测量和海底资源调查的关键。然而&#xff0c;在复杂的水下环境中&#xff0c;由于光在水中传播过程中的吸收、散射等现象&#xff0c;导致图像质量下降&#xff0c;导致模糊、…

基于SpringBoot的“广场舞团系统”的设计与实现(源码+数据库+文档+PPT)

基于SpringBoot的“广场舞团系统”的设计与实现&#xff08;源码数据库文档PPT) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBoot 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 系统功能结构图 系统首页界面图 社团界面图 社团活…

视频流媒体播放器EasyPlayer.js无插件直播流媒体音视频播放器Android端webview全屏调用无效问题

流媒体播放器的核心技术与发展趋势正在不断推动着行业的变革。未来&#xff0c;随着技术的不断进步和应用场景的不断拓展&#xff0c;流媒体播放器将为用户带来更加便捷、高效、个性化的观看体验。同时&#xff0c;流媒体播放器也会成为数字娱乐产业的重要组成部分&#xff0c;…

【Python · PyTorch】卷积神经网络 CNN(LeNet-5网络)

【Python PyTorch】卷积神经网络 CNN&#xff08;LeNet-5网络&#xff09; 1. LeNet-5网络※ LeNet-5网络结构 2. 读取数据2.1 Torchvision读取数据2.2 MNIST & FashionMNIST 下载解包读取数据 2. Mnist※ 训练 LeNet5 预测分类 3. EMnist※ 训练 LeNet5 预测分类 4. Fash…

Live2D嵌入前端页面

废话不多说&#xff0c;直接看效果&#xff0c;给页面中嵌入的一个动态的二次元人物&#xff0c;美化页面&#xff0c;实际效果自行查看。 教程开始 一. 把项目拉取到本地 项目地址 自行下载到本地&#xff0c;下载方式自行选择。 二.把项目文件夹放到前端页面目录内 三.把下…

openlayer 将 GeoJSON 格式的 geometry 转换为 feature

openlayer 将 GeoJSON 格式的 geometry 转换为 feature geometry格式如图&#xff1a; 代码&#xff1a; /*** 将 GeoJSON 格式的 geometry 转换为 feature* param geometry* returns*/geoJsonToWkt(geometry) {const { coordinates, type } geometry;let olGeometry;swit…

web应用安全和信息泄露预防

文章目录 1&#xff1a;spring actuator导致的信息泄露1.1、Endpoint配置启用检测1.2、信息泄露复现1.3、防御 2&#xff1a;服务端口的合理使用3&#xff1a;弱口令&#xff08;密码&#xff09;管理4&#xff1a;服务端攻击4.1、短信业务&#xff0c;文件上传等资源型接口1、…

基于LSTM的新闻中文文本分类——基于textCNN与textRNN

构建词语字典 def build_vocab(file_path, tokenizer, max_size, min_freq):# 定义词汇表字典&#xff1a;使用 vocab_dic {} 初始化一个空字典&#xff0c;用于存储每个词及其出现频率vocab_dic {}with open(file_path, r, encodingUTF-8) as f:for line in tqdm(f):lin l…