目录
前言
一、顺序表实现
1.图书类、图书数组定义
2.读取文件保存到图书数组
3.将图书数组写入到文件
4.插入图书信息
5.删除图书信息
6.更新图书信息
7.查询图书信息
8.排序图书信息
二、链表实现(待更新)
总结
已经具备c/c++基础,而数模和项目中python更为方便(这一点在2020年国赛B题穿越沙漠的编程实现中深有体会,将python版的答案改成c++结果一天没改好),所以在学习数据结构的过程中用c实现一遍再用python实现一遍,希望藉此快速入门python并巩固已修数据结构知识。
在python中,典型的顺序表就是List,我们对它进行一个简单的封装,把它封装成一个类,其中elem是数据部分,size则是整个顺序表的实际长度
class Book:
#(1)
def __init__(self, no, name, price):
self.no = no
self.name = name
self.price = price
class SeqList:
def __init__(self):
#(2)
self.elem = []
self.size = 0
#1:定义一个Book类,添加_init_构造函数,self类似c++中的this,该构造函数会在创建对象实例自动调用,与c++不同的是,无需单独定义属性,直接在函数中使用就意味着含有该属性,该图书类共有no编号、name名字、price价格三个属性
#2:定义一个数组类,在python中,典型的顺序表就是列表list,可以存放任意类型的数据而无需显示说明(一个list内部的数据类型也可以不相同),常用表达 var = [ ]
def read_file(seq, filepath):
# 1
try:
# 2
with open(filepath, 'r') as file:
# 3
next(file)
next(file)
# 4
count = 0
# 5
for line in file:
# 6
parts = line.split()
if len(parts) >= 3:
# 7
seq.elem.append(None)
book = Book(parts[0], parts[1], float(parts[2]))
seq.elem[count] = book
count += 1
# 8
seq.size = count
except FileExistsError:
print('文件不存在')
def save_file(seq, filepath):
# 1
with open(filepath, 'r') as fin:
line1 = fin.readline().strip()
line2 = fin.readline().strip()
# 2
with open(filepath, 'w') as file:
# 3
file.write(line1 + '\n')
file.write(line2 + '\n')
#4
for j in range(0, seq.size, +1):
file.write(seq.elem[j].no + '\t' + seq.elem[j].name + '\t' + str(seq.elem[j].price) + '\n')
#1:只读模式打开文件,记录前两行标题,以字符串的形式保存到line1、line2,strip()对其作净化处理(去除字符串两端的空白字符)
#2:写入模式打开文件,以 as file引用它
#3:写入前两行标题信息
#4:遍历seq图书数组,0 =< j < seq.size,j++,每次向文件中写入对应的图书信息,str()将浮点数转化成字符串
def insert_book(seq, i, book):
# 1
seq.size += 1
# 2
seq.elem.append(None)
# 3
for j in range(seq.size-1, i-1, -1):
seq.elem[j] = seq.elem[j-1]
# 4
seq.elem[i-1] = book
#1:更新图书数组长度
#2:一个萝卜一个坑,插入之前现在elem尾部增加一个元素位置
#3:for循环从seq.size-1开始,到 i 结束,依次将 seq.size-2 到 i-1 的元素后移一位(因为数组的长度已经增加了、因为#2),此处应当仔细体会
#4:更新插入位置的元素
def delete_book(seq, i):
#1
for j in range(i, seq.size-1, +1):
seq.elem[j-1] = seq.elem[j]
#2
seq.size -= 1
#1:从i开始,依次向前覆盖,实现删除
#2:更新数组长度
python中,对列表的遍历是十分方便的,无需考虑元素类型,只需要列表可迭代
def update_book(seq):
# 1
for item in seq.elem:
if item.price < 45:
item.price *= 1.2
else:
item.price *= 1.1
#1:python十分方便的遍历数组(seq.elem本身可迭代),从第零个元素到最后一个元素
python中的输入十分方便,a=int(input("xxxxx:")),控制台输出提示信息后,我们从键盘输入数据,被视为字符串,按需要强转,比如这题我们强转为int类型
def query_book(seq, type):
# 1
ret = SeqList()
if type == 1:
# 2
pos = int(input("请输入要更新的书本序号:"))
# 3
ret.elem.append(seq.elem[pos-1])
# 4
ret.size = 1
if type == 2:
name = input("请输入要查询的书本名称:")
for j in range(0, seq.size-1, +1):
if seq.elem[j].name == name:
ret.elem.append(seq.elem[j])
ret.size += 1
return ret
#1:定义返回值ret,类型为封装的list
#2:python中的输入流,a=input("xxxxxxxx:"),控制台输出xxxxxx提示信息后,键盘输入数据到a中,输入的数据类型不限,都会被视为字符串,int()强制类型转换了解一下
#3:向list类型的elem中添加元素
#4:更新返回数组长度
def price_sort(seq):
for i in range(0, seq.size, +1):
for j in range(0, seq.size-i-1, +1):
if seq.elem[j+1].price < seq.elem[j].price:
tmp = seq.elem[j]
seq.elem[j] = seq.elem[j+1]
seq.elem[j+1] = tmp
冒泡排序,不再赘述