线性表(1)

0 阅读4分钟

定义和特点

线性表是其组成元素间具有线性关系的一种线性结构。数据元素可以是整数、浮点数、字母或者其他更复杂的信息

特点:1、存在唯一被称为“第一个”的数据元素;2、存在唯一被称为“最后一个”的数据元素;3、除第一个元素之外,结构中的每个数据元素均只有一个直接前驱;4、除最后一个元素之外,结构中的每个数据元素均只有一个直接后继。

线性表的存储结构有顺序存储结构链式存储结构两种

顺序存储结构:顺序表

链式存储结构:单链表、双链表、循环链表

顺序存储结构

顺序存储结构:把线性表中的所有元素,按照其逻辑顺序依次存储到计算机内存单元的从指定存储位置开始的一块连续存储空间中

顺序表存储结构与特点

特点:

  1. 存储连续:逻辑相邻的元素,物理存储位置也相邻。
  2. 随机访问:可通过下标直接存取元素,时间复杂度O(1)。
  3. 增删低效:插入 / 删除时需移动大量元素,时间复杂度O(n)。
  4. 空间特性:需预先分配内存,可能存在空间浪费,但数据存储密度高。

基本操作实现

初始化顺序表

先要给顺序表分配内存空间,声明数组的最大容量。

代码如下:

def __init__(self, max): # 构造函数
        self.max = max # 最多可以保持的元素个数
        self.length = 0 # 现在已有的元素个数
        self.data = [None for _ in range(self.max)]  # [None, None, ...... None]

查找数据元素位置

算法实现步骤:1、依次将顺序表的数据元素的值与e相比较,若二者相等,则查找成功,返回该数据元素的位置。

2、若不想等,则查找失败,抛出异常。

代码如下:

def find(self, e):
        for i in range(self.length):
            if self.data[i] == e:
                print(f"下标为{i}的数字是{e}")
                return i
            else:
                print("错误:没有这个元素")
                return None

插入数据元素

算法实现步骤: ① 判断顺序表的存储空间是否已满。若已满,抛出异常。

② 判断 i 的值是否满足 0≤i≤n。若不满足,抛出异常。

③ 将插入位置 i 至表尾的元素依次向后移动一个存储位置。

④ 在位置 i 插入新元素 e。

⑤ 表长加 1。

代码如下:

def insert(self, ele, index):
        if self.length == self.max:
            print("错误:线性表满了,不能插入")
            return
        # print(f"要把元素{ele} 添加到线性表中的下标为{index}的位置")
        if index > self.max - 1:
            print("错误:超过线性表的最大容量")
            return
        if index < 0:
            print("错误:下标不能为负数")
            return

        if index > self.length:
            print("错误:位置不合法,不能跳着添加")
            return

        # 把index及之后的元素全部后移一位
        j = self.length
        while j > index:
            self.data[j] = self.data[j-1]
            j-= 1
        # 把index 位置的元素值为ele
        self.data[index] = ele
        # 把总长度1加
        self.length += 1

删除数据元素

算法实现步骤: ① 判断i 的值是否满足0≤i≤n−1。若不满足,抛出异常。 ② 将第i 个至表尾的元素依次向后移动一个存储位置。i=n 时无须移动。 ③ 表长减 1。

代码如下:

def remove(self, index):
        print(f"删除下标为{index}的元素,它后面的元素要向前移动")
        # 开始你的表演
        # 0. 不能为空 self.length > 0
        # 1. 判断index的有效性 [0, self.length-1]
        if index < 0 or index > self.length-1:
            print("错误:不在范围内")
            return
        # 2. 它后面的元素要向前移动
        for i in range(index, self.length):
            self.data[i] = self.data[i+1]
        # 3. 长度-1
        self.length -= 1

完整代码

如下:

class Line:
    def __init__(self, max): # 构造函数
        self.max = max # 最多可以保持的元素个数
        self.length = 0 # 现在已有的元素个数
        self.data = [None for _ in range(self.max)]  # [None, None, ...... None]

    def insert(self, ele, index):
        if self.length == self.max:
            print("错误:线性表满了,不能插入")
            return
        # print(f"要把元素{ele} 添加到线性表中的下标为{index}的位置")
        if index > self.max - 1:
            print("错误:超过线性表的最大容量")
            return
        if index < 0:
            print("错误:下标不能为负数")
            return

        if index > self.length:
            print("错误:位置不合法,不能跳着添加")
            return

        # 把index及之后的元素全部后移一位
        j = self.length
        while j > index:
            self.data[j] = self.data[j-1]
            j-= 1
        # 把index 位置的元素值为ele
        self.data[index] = ele
        # 把总长度1加
        self.length += 1

    def remove(self, index):
        print(f"删除下标为{index}的元素,它后面的元素要向前移动")
        # 开始你的表演
        # 0. 不能为空 self.length > 0
        # 1. 判断index的有效性 [0, self.length-1]
        if index < 0 or index > self.length-1:
            print("错误:不在范围内")
            return
        # 2. 它后面的元素要向前移动
        for i in range(index, self.length):
            self.data[i] = self.data[i+1]
        # 3. 长度-1
        self.length -= 1

    def find(self, e):
        for i in range(self.length):
            if self.data[i] == e:
                print(f"下标为{i}的数字是{e}")
                return i
            else:
                print("错误:没有这个元素")
                return None


    def printAllData(self):
        for i in range(self.length):
            print(self.data[i])

line1 = Line(10)
# 最大下标为9

line1.insert(1,0)
line1.insert(2,0)
line1.insert(3,0)
line1.insert(4,0)

line1.remove(2)
line1.find(3)
# line1.insert(1,0) # 把下标为0的位置,设置为1,之后的元素后移一位
# line1.insert(2,0) # 把下标为0的位置,设置为2,之后的元素后移一位
# line1.insert(3,0) # 把下标为0的位置,设置为3,之后的元素后移一位
# line1.insert(4,2) # 把下标为2的位置,设置为4,之后的元素后移一位

line1.printAllData()

运行结果:

image.png