一、实验目的
1.掌握线性表的顺序存储结构的表示和实现方法。
2.掌握顺序表基本操作的算法实现。
3.掌握顺序表的应用。
二、实验环境
Thonny
三、实验内容
编写一个程序,实现顺序表的各种基本运算(假设顺序表的元素类型为 char), 并在此基础上设计一个主程序完成如下功能:
(1)初始化顺序表 L;
(2)依次采用尾插法插入 a、b、c、d、e 元素;
(3)输出顺序表 L;
(4)输出顺序表 L 的长度;
(5)判断顺序表 L 是否为空;
(6)输出顺序表 L 的第 3 个元素;
(7)输出元素 a 的位置
(8)在第 4 个元素位置上插入 f 元素
(9)输出顺序表 L;
(10)删除 L 的第 3 个元素;
(11)输出顺序表 L;
(12)释放顺序表 L。
四、实验要求
1、用pycharm工具创建文件或程序,输入代码后,进行编译运行。
2、观看程序运行结果,并根据结果进行思考,对程序进行修改和总结。
【核心算法提示】
1.顺序表插入操作的基本步骤:要在顺序表中第 i 个数据元素之前插入一个数据元素 x,首先要判断插入位置 i 是否合法,假设线性表的长为 n,则 i 的合法值范围: 0≤i≤n,若是合法位置,就再判断顺序表否满,如果满,则增加空间并插入数据元素x,如果不满,则将第 i 个数据元素及其之后的所有数据元素都后移一个位置,此时第 i 个位置已经腾空,再将待插入的数据元素 x 插入到该位置上,最后将线性表的长增加 1。
2.顺序表删除操作的基本步骤:要删除顺序表中第 i 个数据元素,首先仍然要判断 i 的合法性, i 的合法范围是 0≤i≤n,若是合法位置,则将第 i 个数据元素之后的所有数据都前移一个位置,最将线性表长减1。
3.顺序表查找操作的基本步骤:要在顺序表中查找一个给定值的数据元素 则可以采用顺序查找的方法,从表中第 1 个数据元素开始依次将值与给定值进行比较,若相等则返回该数据元素在顺序表中的位置,否则返回 0 值。
五、实验源代码
class SqList: #顺序表类
def __init__(self): #构造方法
self.initcapacity=5; #初始容量设置为5
self.capacity=self.initcapacity #容量设置为初始容量
self.data=[None]*self.capacity #设置顺序表的空间
self.size=0 #长度设置为0
#线性表的基本运算算法
def resize(self, newcapacity): #改变顺序表的容量为newcapacity
assert newcapacity>=0 #检测参数正确性的断言
olddata=self.data
self.data=[None]*newcapacity
self.capacity=newcapacity
for i in range(self.size):
self.data[i]=olddata[i]
def CreateList(self, a): #由数组a中元素整体建立顺序表
for i in range(0,len(a)):
if self.size==self.capacity:
self.resize(2*self.size);
self.data[self.size]=a[i]
self.size+=1
def Add(self, e): #在线性表的末尾添加一个元素e
if self.size==self.capacity:
self.resize(2*self.size)
self.data[self.size]=e
self.size+=1
def display(self): #输出线性表
for i in range(0,self.size):
print(self.data[i],end=' ')
print()
def getsize(self): #求线性表长度
return self.size
def __getitem__(self): #求序号为i的元素
print("请输入要查找的元素的序号:")
i=int(input())
assert 0<=i<self.size
return self.data[i]
def Insert(self): #在线性表中序号i位置插入元素e
print('请分别输入要插入的位置和元素')
i=int(input())
e=str(input())
assert 0<=i<=self.size
if self.size==self.capacity:
self.resize(2*self.size)
for j in range(self.size,i-1,-1):
self.data[j]=self.data[j-1]
self.data[i]=e
self.size+=1
def Delete(self): #在线性表中删除序号i的元素
print('请输入要删除的元素的序号')
i=int(input())
assert 0<=i<=self.size-1
for j in range(i,self.size-1):
self.data[j]=self.data[j+1]
self.size-=1
if self.capacity>self.initcapacity and self.size<=self.capacity/4:
self.resize(self.capacity//2)
def GetNo(self): #查找第一个为e的元素的序号
i=0;
print('请在下面输入要查找的元素并按回车查找')
e=str(input())
while i<self.size and self.data[i]!=e:
i+=1
if(i>=self.size):
return -1;
else:
return i;
def DestorySequenceList(self): #释放顺序表
self.__init__()
if __name__ == '__main__':
L=SqList()
L.Add('a'),L.Add('b'),L.Add('c'),L.Add('d'),L.Add('e')
print("L: ",end=''),L.display()
print("size=%d"%(L.getsize()))
if L.getsize()==0:
print("顺序表为空")
else:
print("顺序表不为空")
print("你要查找的元素为:%s"%(L.__getitem__()))
print("你要查找的元素位置在第%d个"%(L.GetNo()))
L.Insert()
print("插入后为: ",end=''),L.display()
L.Delete()
print("删除后为: ",end=''),L.display()
L.DestorySequenceList()
print("释放顺序表后为:",end=''),L.display()
六、实验运行截图
以上内容仅个人见解与看法,如有错误请批评指正。