一、脑图
二、封装一个顺序表的类
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)