数据结构:线性表(Python实现基本操作)

目录

  • 简介
  • 顺序结构
    • 顺序表
  • 链式结构
    • 单链表
    • 循环链表
    • 双向循环链表

简介

线性表n 个数据元素有限序列。是一种常见的线性结构。

线性结构特点:

  • 第一个元素无前驱
  • 最后一个元素无后继
  • 除第一个元素和最后一个元素外,所有的元素都有前驱和后继

顺序结构

顺序表

        线性表的顺序存储结构
特点:

  • 逻辑上相邻的元素物理位置上相邻
  • 随机访问

        只要确定好了存储线性表的起始位置,线性表中任一数据元素都可以随机存取,所以线性表的顺序存储结构是一种随机存取的储存结构。通常用数组表示顺序表。

        Python实现基本操作:

List = [0,1,2,3,4,5]
# 按址查找(地址)
List.index(2)
print(List.index(2))
# 插入(地址, 值)
List.insert(2, 3)
print(List)
# 删除(地址)
List.pop(2)
print(List)
# 判空
ListEmpty = True if not List else False
print(ListEmpty)
# 求长
len(List)
print(len(List))

输出:

2
[0, 1, 3, 2, 3, 4, 5]
[0, 1, 2, 3, 4, 5]
False
6

插入与删除:
数据结构:线性表(Python实现基本操作)_第1张图片

链式结构

单链表

线性表的链式存储结构之一
特点:

  • 逻辑相邻的元素物理位置不一定相邻

下面是单链表的简单结构:

        链表中的数据是以结点来表示的,每个结点包含两个域,一个数据域(元素域)和一个指针域。这个指针指向链表中的下一个结点,而最后一个结点的指针域则指向一个空值。每个结点的构成:元素(数据元素的映象) + 指针(指示后继元素存储位置),元素就是存储数据的存储单元,指针就是连接每个结点的地址数据。数据结构:线性表(Python实现基本操作)_第2张图片
基本构成:

  • 结点:每个节点有两个部分,左边部分称为值域,用来存放数据;右边部分称为指针域,用来存放指向下一个元素的指针。
  • head(头结点):head节点永远指向第一个节点
  • tail(尾节点):tail永远指向最后一个节点
  • null:链表中最后一个节点的指针域为None值

Python实现单链表操作(参考:python实现单链表的基本操作)

class Node(object):
    def __init__(self, item):
        # 元素
        self.element = item
        # 指针
        self.next = None


# 创建单链表类
class SingleLinkList(object):
    def __init__(self):
        self.header = None
        self.length = 0

    # 1、判断是否为空
    def is_empty(self):
        if self.header == None:
            return True
        else:
            return False

    # 2、头部插入
    def add(self, node):
        # 如果为空
        if self.is_empty():
            self.header = node
        else:
            node.next = self.header
            self.header = node
            # currentNode = self.header
        self.length += 1

    # 3、尾部插入
    def append(self, node):
        current_Node = self.header
        if self.is_empty():
            self.add(node)
        else:
            # 找到最后一个结点
            while (current_Node.next != None):
                current_Node = current_Node.next
            current_Node.next = node
            self.length += 1

    # 4、指定位置插入
    def insert(self, node, index):
        current_Node = self.header
        
        if index > self.length + 1 or index <= 0:
            while (index > self.length + 1 or index <= 0):
                print("你要插入的位置不对,请重选位置:")
                index = eval(input())

        if index == 1:
            self.add(node)
        elif index == 2:
            node.next = self.header.next
            self.header.next = node
            self.length += 1
        else:
            for i in range(1, index - 1):
                current_Node = current_Node.next
            node.next = current_Node.next
            current_Node.next = node
            self.length += 1

    # 5、遍历
    def travel(self):
        current_Node = self.header
        if self.length == 0:
            print("目前链表没有数据!")
        else:
            print("目前链表里面的元素有:", end=" ")
            for i in range(self.length):
                print("%s " % current_Node.element, end=" ")
                current_Node = current_Node.next
            print("\n")

    # 6、排序不用交换节点的位置,只需要交换节点上的数据值
    def list_sort(self):
        for i in range(0, self.length - 1):
            current_Node = self.header
            for j in range(0, self.length - i - 1):
                if current_Node.element > current_Node.next.element:
                    temp = current_Node.element
                    current_Node.element = current_Node.next.element
                    current_Node.next.element = temp

                current_Node = current_Node.next

    # 7、按索引删除
    def delete(self, index):
        if index <= 0 or index > self.length:
            while (index <= 0 or index > self.length):
                print("你输入的下标不对,请重新输入需要删除的值的下标:")
                index = eval(input())
                #   return
        else:
            if index == 1:
                self.header = self.header.next
                currentNode = self.header
            elif index == 2:
                current_Node = self.header
                current_Node.next = current_Node.next.next
            else:
                current_Node = self.header
                for i in range(1, index - 1):
                    current_Node = current_Node.next
                current_Node.next = current_Node.next.next
        self.length -= 1

    # 8、查找是否包含,并返回下标
    def isContain(self, num):
        contain = 0
        current_Node = self.header
        for i in range(self.length):
            if current_Node.element == num:
                print("%d在链表中%d处\n" % (num, i + 1))  # i+1是在正常人认为的位置处,程序员一般是从0开始算起
                contain = 1
            current_Node = current_Node.next
        if contain == 0:
            print("%d不在链表中\n" % num)

    # 9、根据下标找节点
    def searchNodeByIndex(self, index):
        current_Node = self.header
        if index <= 0 or index > self.length:
            while (index <= 0 or index > self.length):
                print("你输入的下标不对,请重新输入:")
                index = eval(input())
                #   return 0
        if index > 0 or index <= self.length:
            for i in range(index - 1):
                current_Node = current_Node.next
            return current_Node

    # 10、根据下标修改节点的值
    def Alert(self, index, num):  # index定义为下标
        current_Node = self.header
        if index <= 0 or index > self.length:
            print("你输入的下标不对,请重新输入!\n")
        else:
            for i in range(index - 1):
                current_Node = current_Node.next
            current_Node.element = num

循环链表

特点:

  • 最后一个结点的指针指向头结点

数据结构:线性表(Python实现基本操作)_第3张图片

双向循环链表

特点:

  • 一个结点包含指向后继(next)和指向前驱(prior)两个指针,两个方向又分别构成循环链表。

数据结构:线性表(Python实现基本操作)_第4张图片

你可能感兴趣的:(数据结构,数据结构,单链表,链表)