数据结构与算法实现:基础篇

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:本项目分享了作者在Python中实现基本数据结构和算法的经验,包括数组、链表、栈、队列、堆、二叉树、图、排序和查找算法以及哈希表。这些概念的详细说明和具体实现方法有助于理解复杂问题并提升编程效率,为解决实际项目中的性能挑战打下基础。 数据结构算法实现:初始提交

1. 数组(Array)和Python列表实现

1.1 数组的基本概念

数组(Array)是一种线性数据结构,它可以存储固定数量的元素,这些元素具有相同的数据类型,并且通过索引进行访问。在Python中,列表(List)是一种内置的数据结构,它类似于数组,但在功能上更为强大和灵活。

1.2 数组和列表的区别

尽管数组和列表在某些方面相似,但它们在实现和性能上有所不同。数组通常是静态的,一旦创建,其大小就不可改变,而Python列表则是动态的,可以在运行时进行元素的添加和删除。此外,数组通常是同质的,意味着它们只能包含相同类型的数据,而Python列表则不受这种限制。

1.3 Python列表的实现

在Python中,列表是使用动态数组实现的。这意味着列表会根据需要自动调整其大小,而不需要手动管理内存分配和扩容操作。下面是一个简单的Python列表实现示例:

class MyList:
    def __init__(self):
        self.data = []
    def add(self, element):
        self.data.append(element)
    def remove(self, element):
        self.data.remove(element)
    def __getitem__(self, index):
        return self.data[index]
    def __setitem__(self, index, element):
        self.data[index] = element
    def __str__(self):
        return str(self.data)

在这个简单的列表实现中,我们使用Python内置的列表来存储元素。 add 方法用于添加元素, remove 方法用于删除元素, __getitem__ __setitem__ 方法分别用于获取和设置特定索引的元素, __str__ 方法用于将列表转换为字符串形式。

2. 链表(Linked List)的Python类模拟

链表是一种常见的数据结构,它由一系列节点组成,每个节点包含数据部分和指向下一个节点的指针。在Python中,我们可以通过类来模拟链表的行为。本章节我们将深入探讨链表的基本概念和结构,并通过Python类模拟实现链表的操作。

2.1 链表的基本概念和结构

链表的种类有很多,包括单向链表、双向链表和循环链表。每种链表都有其特定的应用场景和优缺点。

2.1.1 单向链表

单向链表是最简单的链表类型,每个节点包含数据和一个指向下一个节点的指针。

class ListNode:
    def __init__(self, value=0, next=None):
        self.value = value
        self.next = next

class SinglyLinkedList:
    def __init__(self):
        self.head = None

    def append(self, value):
        new_node = ListNode(value)
        if self.head is None:
            self.head = new_node
        else:
            current = self.head
            while current.next:
                current = current.next
            current.next = new_node

2.1.2 双向链表

双向链表的每个节点除了包含指向下一个节点的指针外,还包含一个指向前一个节点的指针。

class DoublyListNode:
    def __init__(self, value=0, prev=None, next=None):
        self.value = value
        self.prev = prev
        self.next = next

class DoublyLinkedList:
    def __init__(self):
        self.head = None
        self.tail = None

    def append(self, value):
        new_node = DoublyListNode(value)
        if not self.head:
            self.head = new_node
            self.tail = new_node
        else:
            self.tail.next = new_node
            new_node.prev = self.tail
            self.tail = new_node

2.1.3 循环链表

循环链表的最后一个节点的指针指向链表的头节点,形成一个环。

class CircularListNode:
    def __init__(self, value=0):
        self.value = value
        self.next = None

class CircularLinkedList:
    def __init__(self):
        self.head = None

    def append(self, value):
        new_node = CircularListNode(value)
        if not self.head:
            self.head = new_node
            new_node.next = self.head
        else:
            current = self.head
            while current.next != self.head:
                current = current.next
            current.next = new_node
            new_node.next = self.head

2.2 链表的操作实现

链表的操作主要包括节点的增删改查以及链表的遍历。

2.2.1 节点的增删改查

在链表中添加、删除、修改节点的操作都涉及对指针的重新指向。

2.2.2 链表的遍历

遍历链表是链表操作的基础,可以使用迭代或递归的方式进行。

2.3 Python类模拟链表

2.3.1 类的设计和初始化

在Python中,我们可以定义类来模拟链表的行为。

2.3.2 方法的实现和使用

我们将实现链表的常见操作,如添加、删除和遍历节点。

class Node:
    def __init__(self, data):
        self.data = data
        self.next = None

class LinkedList:
    def __init__(self):
        self.head = None

    def append(self, data):
        if not self.head:
            self.head = Node(data)
        else:
            current = self.head
            while current.next:
                current = current.next
            current.next = Node(data)

    def delete(self, key):
        current = self.head
        prev = None
        if current and current.data == key:
            self.head = current.next
            current = None
            return
        while current and current.data != key:
            prev = current
            current = current.next
        if current:
            prev.next = current.next
            current = None

    def display(self):
        elements = []
        current = self.head
        while current:
            elements.append(current.data)
            current = current.next
        return elements

# 使用示例
llist = LinkedList()
llist.append(1)
llist.append(2)
llist.append(3)
print(llist.display())  # 输出: [1, 2, 3]
llist.delete(2)
print(llist.display())  # 输出: [1, 3]

通过本章节的介绍,我们了解了链表的基本概念和结构,并通过Python类模拟实现了链表的操作。链表作为一种基础的数据结构,其应用广泛,掌握其操作对于学习更高级的数据结构和算法有着重要的意义。在本章节中,我们详细探讨了单向链表、双向链表和循环链表的定义和特点,以及如何在Python中通过类来模拟这些数据结构。此外,我们还学习了如何实现链表的增删改查操作,并通过实际代码示例加深了理解。

3. 栈(Stack)的后进先出操作

3.1 栈的定义和特性

3.1.1 栈的基本概念

栈是一种特殊的列表,它只允许在表的一端进行插入和删除操作,这一端被称为栈顶(Top),另一端被称为栈底(Bottom)。栈的操作是后进先出(LIFO, Last In First Out)的,即最后加入的元素最先被移除。这种特性使得栈在很多场景下都非常有用,比如在浏览器的后退功能中,栈可以用来保存访问过的页面地址;在程序设计语言中,函数的调用也是通过栈来实现的。

3.1.2 栈的后进先出(LIFO)特性

栈的LIFO特性意味着元素的移除顺序与添加顺序相反。例如,如果我们在栈中依次添加元素A、B、C,那么在移除元素时,我们会先移除C,然后是B,最后是A。这种特性使得栈非常适合处理那些需要反转元素顺序的场景,如算法中的括号匹配问题,或者在进行深度优先搜索(DFS)时保存访问路径。

3.2 栈的Python实现

3.2.1 使用列表模拟栈

在Python中,我们可以使用内置的列表(list)数据结构来模拟栈的行为。列表提供了append()和pop()方法,这些方法正好对应于栈的push和pop操作。

class Stack:
    def __init__(self):
        self.items = []

    def is_empty(self):
        return len(self.items) == 0

    def push(self, item):
        self.items.append(item)

    def pop(self):
        if not self.is_empty():
            return self.items.pop()
        raise IndexError("pop from an empty stack")

    def peek(self):
        if not self.is_empty():
            return self.items[-1]
        raise IndexError("peek from an empty stack")

    def size(self):
        return len(self.items)
代码逻辑解读分析:
  • __init__ 方法初始化一个空列表 self.items ,用于存储栈内的元素。
  • is_empty 方法检查栈是否为空,返回布尔值。
  • push 方法在列表的末尾添加一个元素,模拟栈的入栈操作。
  • pop 方法移除并返回列表的最后一个元素,模拟栈的出栈操作。如果栈为空,则抛出 IndexError
  • peek 方法返回列表的最后一个元素而不移除它,模拟查看栈顶元素的操作。如果栈为空,则抛出 IndexError
  • size 方法返回栈内元素的数量。

3.2.2 栈的基本操作:push, pop, peek

接下来,我们将演示如何使用上面定义的 Stack 类来执行基本操作。

# 创建一个栈实例
stack = Stack()

# 入栈操作
stack.push('A')
stack.push('B')
stack.push('C')

# 查看栈顶元素
print(stack.peek())  # 输出: C

# 出栈操作
print(stack.pop())  # 输出: C
print(stack.pop())  # 输出: B
print(stack.pop())  # 输出: A

# 检查栈是否为空
print(stack.is_empty())  # 输出: True
参数说明:
  • 'A' , 'B' , 'C' :入栈的元素。
  • stack :栈的实例。
执行逻辑说明:
  • 首先,我们创建了一个 Stack 类的实例 stack
  • 使用 push 方法将 'A' , 'B' , 'C' 依次入栈。
  • 使用 peek 方法查看栈顶元素,输出应该是 'C'
  • 使用 pop 方法依次出栈,输出依次是 'C' , 'B' , 'A'
  • 最后,使用 is_empty 方法检查栈是否为空,输出应该是 True ,表示栈已经为空。

通过本章节的介绍,我们可以了解到栈的概念、特性和Python中的实现方式。栈是一种非常基础且重要的数据结构,它的后进先出特性在很多算法和应用中都有着广泛的应用。在下一章节中,我们将继续探讨队列的先进先出操作,以及如何在Python中实现它。

4. 队列(Queue)的先进先出实现

队列是一种常见的数据结构,它遵循先进先出(First In First Out, FIFO)的原则。在现实生活中,队列的应用非常广泛,比如排队买票、任务调度等。在计算机科学中,队列常用于实现任务调度、缓冲处理等场景。

4.1 队列的定义和特性

队列作为一种线性数据结构,具有以下基本概念和特性:

4.1.1 队列的基本概念

队列是一种特殊的列表,只能在一端(称为“队尾”)插入新元素,在另一端(称为“队头”)删除元素。队列的操作主要有两种:入队(enqueue)和出队(dequeue)。入队指的是在队尾添加一个元素,而出队指的是移除队头的元素。

4.1.2 队列的先进先出(FIFO)特性

队列的核心特性是先进先出,这意味着最早被添加到队列中的元素将会是第一个被移除的。这个特性使得队列非常适合用于模拟一系列按照特定顺序发生的事件。

4.2 队列的Python实现

在Python中,队列可以通过内置的 list 类型来实现,也可以使用 collections 模块中的 deque 类来实现更高效的队列操作。

4.2.1 使用列表模拟队列

使用列表实现队列是一种简单直观的方法。以下是使用列表模拟队列的一个基本示例:

class Queue:
    def __init__(self):
        self.items = []
    def enqueue(self, item):
        self.items.insert(0, item)
    def dequeue(self):
        return self.items.pop()
    def is_empty(self):
        return len(self.items) == 0
    def size(self):
        return len(self.items)

在这个 Queue 类中,我们使用一个列表 items 来存储队列中的元素。 enqueue 方法通过 insert(0, item) 在列表的开始位置插入新元素, dequeue 方法通过 pop() 移除列表的最后一个元素。 is_empty 方法检查队列是否为空, size 方法返回队列的大小。

4.2.2 队列的基本操作:enqueue, dequeue

下面是一个简单的测试代码,演示了如何使用上述 Queue 类进行入队和出队操作:

# 创建一个队列实例
q = Queue()

# 入队操作
q.enqueue('Alice')
q.enqueue('Bob')
q.enqueue('Charlie')

# 出队操作
print(q.dequeue())  # 输出: Alice
print(q.dequeue())  # 输出: Bob

# 检查队列是否为空
print(q.is_empty())  # 输出: False

# 获取队列的大小
print(q.size())      # 输出: 1

在本章节中,我们介绍了队列的基本概念和特性,以及如何在Python中使用列表和 collections.deque 来实现队列。队列是一种非常基础且重要的数据结构,它在许多算法和实际应用中都有着广泛的应用。在下一章节中,我们将继续探讨堆和优先队列的操作。

5. 堆(Heap)和优先队列操作

堆是一种特殊的树形数据结构,具体来说,它是一种完全二叉树。在堆中,每个节点的值都必须大于或等于(最大堆)或小于或等于(最小堆)其子节点的值。这种性质使得堆成为实现优先队列的极佳数据结构,其中元素的优先级由堆的性质决定。

5.1 堆的基本概念

5.1.1 堆的定义和性质

堆通常被定义为一个特殊的完全二叉树,其中每个父节点的值都大于或等于(在最大堆中)或小于或等于(在最小堆中)其子节点的值。堆的性质决定了其操作的特性和效率。堆通常用于实现优先队列,其中元素的优先级由其在堆中的位置决定。

堆的一个关键性质是它的完全二叉树结构,这意味着除了最后一层外,所有层都被完全填满,最后一层的节点集中在左侧。这个结构使得堆非常适合使用数组来实现,数组的索引可以用来计算父节点和子节点之间的关系。

堆的另一个重要性质是其高度平衡的特性,这保证了堆操作的对数时间复杂度。在最大堆中,最大元素始终位于根节点,这使得它非常适合实现具有最高优先级的元素总是最先被处理的场景。

5.1.2 堆的操作:堆化(heapify)

堆化是堆结构的核心操作之一,它用于重新排列数组,使其满足堆的性质。堆化通常用于构建堆或在修改堆后恢复其性质。在最大堆中,堆化过程会从最后一个非叶子节点开始,向上进行,确保每个节点都满足最大堆的性质。最小堆的堆化过程与之类似,但是它是确保每个节点都满足最小堆的性质。

堆化的时间复杂度为 O(n),其中 n 是堆中元素的数量。这是因为堆的高度为 log(n),而堆化的每一步都只需要 O(log(n)) 的时间。因此,对于整个堆来说,时间复杂度是线性的。

堆化的代码实现如下:

def heapify(arr, n, i):
    largest = i
    left = 2 * i + 1
    right = 2 * i + 2
    # 如果左子节点存在且大于当前节点
    if left < n and arr[i] < arr[left]:
        largest = left
    # 如果右子节点存在且大于当前最大节点
    if right < n and arr[largest] < arr[right]:
        largest = right
    # 如果最大节点不是当前节点,交换并继续堆化
    if largest != i:
        arr[i], arr[largest] = arr[largest], arr[i]
        heapify(arr, n, largest)

def build_heap(arr):
    n = len(arr)
    # 从最后一个非叶子节点开始向上堆化
    for i in range(n // 2 - 1, -1, -1):
        heapify(arr, n, i)

# 示例数组
arr = [3, 5, 9, 6, 8, 20, 10, 12, 18, 9]
build_heap(arr)

print("Heapified array is:", arr)

5.2 优先队列的实现

5.2.1 优先队列的基本概念

优先队列是一种抽象数据类型,它允许插入新的对象,并且每次删除(或访问)时返回优先级最高的对象。在堆中实现的优先队列通常具有对数级的时间复杂度,这是因为堆的高度为 log(n)。优先队列在许多算法中都有应用,例如在图的算法中,用于找到最短路径的 Dijkstra 算法就使用了优先队列。

5.2.2 使用堆实现优先队列

在 Python 中,我们可以使用列表来模拟堆,并且使用堆操作来实现优先队列。我们可以定义一个类 PriorityQueue ,它包含插入( enqueue )和删除( dequeue )方法。插入方法将新元素添加到列表的末尾,然后通过堆化过程将其移动到正确的位置。删除方法返回并移除堆的根节点(最大或最小元素),然后将堆的最后一个元素移动到根节点的位置,并进行堆化。

以下是使用最小堆实现优先队列的示例代码:

import heapq

class PriorityQueue:
    def __init__(self):
        self.heap = []
    def enqueue(self, item):
        heapq.heappush(self.heap, item)
    def dequeue(self):
        return heapq.heappop(self.heap)
    def __repr__(self):
        return f"PriorityQueue({self.heap})"

pq = PriorityQueue()
pq.enqueue(5)
pq.enqueue(3)
pq.enqueue(10)
pq.enqueue(1)

print(pq)  # PriorityQueue([1, 3, 10, 5])
print(pq.dequeue())  # 1
print(pq)  # PriorityQueue([3, 5, 10])

在这个示例中,我们使用了 Python 的 heapq 模块来实现堆操作。 PriorityQueue 类的 enqueue 方法使用 heapq.heappush 来添加元素,而 dequeue 方法使用 heapq.heappop 来移除并返回堆的根节点。这样,我们就得到了一个简单的优先队列实现。

6. 二叉树(Binary Tree)结构和二叉搜索树(BST)

6.1 二叉树的基本概念

6.1.1 二叉树的定义和类型

二叉树是每个节点最多有两个子树的树结构,通常子树被称作“左子树”和“右子树”。二叉树的递归定义如下:

  • 空树是二叉树。
  • 如果一个节点有左子树和右子树,则这两个子树也必须分别是二叉树。

二叉树的类型主要有以下几种:

  • 完全二叉树:除了最后一层外,每一层都被完全填满,且所有节点都尽可能地向左。
  • 满二叉树:每一层的所有节点都有两个子节点,除了叶子节点。
  • 平衡二叉树(AVL树):任何节点的两个子树的高度差不超过1。
  • 二叉搜索树(BST):对于树中的每个节点,其左子树中的所有元素都小于该节点,右子树中的所有元素都大于该节点。

6.1.2 二叉树的遍历算法:前序、中序、后序

二叉树的遍历通常有三种主要方式:

  • 前序遍历(Pre-order Traversal):首先访问根节点,然后遍历左子树,最后遍历右子树。
  • 中序遍历(In-order Traversal):首先遍历左子树,然后访问根节点,最后遍历右子树。对于二叉搜索树,中序遍历可以得到有序的节点值。
  • 后序遍历(Post-order Traversal):首先遍历左子树,然后遍历右子树,最后访问根节点。

以下是使用递归方式实现三种遍历的Python代码示例:

class TreeNode:
    def __init__(self, value):
        self.value = value
        self.left = None
        self.right = None

def preorder_traversal(root):
    if root:
        print(root.value, end=' ')
        preorder_traversal(root.left)
        preorder_traversal(root.right)

def inorder_traversal(root):
    if root:
        inorder_traversal(root.left)
        print(root.value, end=' ')
        inorder_traversal(root.right)

def postorder_traversal(root):
    if root:
        postorder_traversal(root.left)
        postorder_traversal(root.right)
        print(root.value, end=' ')

6.2 二叉搜索树(BST)的实现

6.2.1 二叉搜索树的性质

二叉搜索树(BST)是一种特殊的二叉树,它满足以下性质:

  • 对于树中的每个节点X,其左子树中所有元素的值都小于X的值。
  • 对于树中的每个节点X,其右子树中所有元素的值都大于X的值。
  • 左右子树也分别为二叉搜索树。
6.2.2 BST的插入、删除和查找操作

BST的插入、删除和查找操作都是基于上述性质进行的。以下是BST的基本操作的Python代码示例:

class TreeNode:
    def __init__(self, value):
        self.value = value
        self.left = None
        self.right = None

def insert(root, value):
    if root is None:
        return TreeNode(value)
    else:
        if value < root.value:
            root.left = insert(root.left, value)
        else:
            root.right = insert(root.right, value)
    return root

def find(root, value):
    if root is None or root.value == value:
        return root
    if value < root.value:
        return find(root.left, value)
    return find(root.right, value)

def delete(root, value):
    if root is None:
        return root
    if value < root.value:
        root.left = delete(root.left, value)
    elif value > root.value:
        root.right = delete(root.right, value)
    else:
        if root.left is None:
            temp = root.right
            root = None
            return temp
        elif root.right is None:
            temp = root.left
            root = None
            return temp
        temp = minValueNode(root.right)
        root.value = temp.value
        root.right = delete(root.right, temp.value)
    return root

def minValueNode(node):
    current = node
    while current.left is not None:
        current = current.left
    return current

请注意,删除操作的逻辑需要特别注意,当要删除的节点有两个子节点时,通常用其右子树中的最小节点来替换它。这是因为在二叉搜索树中,右子树的最小值一定大于左子树的所有值,并且大于当前节点的值,满足BST的性质。

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:本项目分享了作者在Python中实现基本数据结构和算法的经验,包括数组、链表、栈、队列、堆、二叉树、图、排序和查找算法以及哈希表。这些概念的详细说明和具体实现方法有助于理解复杂问题并提升编程效率,为解决实际项目中的性能挑战打下基础。

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

1.1 数组和字符串 2 1.1.1 一维数组的倒置 2 范例1-1 一维数组的倒置 2 ∷相关函数:fun函数 1.1.2 一维数组应用 3 范例1-2 一维数组应用 3 1.1.3 一维数组的高级应用 5 范例1-3 一维数组的高级应用 5 1.1.4 显示杨辉三角 7 范例1-4 显示杨辉三角 7 ∷相关函数:c函数 8 1.1.5 魔方阵 9 范例1-5 魔方阵 9 1.1.6 三维数组的表示 14 范例1-6 三维数组的表示 14 ∷相关函数:InitArray函数 1.1.7 多项式的数组表示 17 范例1-7 多项式数组的表示 17 1.1.8 查找矩阵的马鞍点 19 范例1-8 查找矩阵的马鞍点 19 ∷相关函数:Get_Saddle函数 1.1.9 对角矩阵建立 21 范例1-9 对角矩阵建立 21 ∷相关函数:Store函数 1.1.10 三对角矩阵的建立 22 范例1-10 三对角矩阵的建立 22 ∷相关函数:Store函数 1.1.11 三角矩阵建立 24 范例1-11 三角矩阵建立 24 ∷相关函数:Store函数 1.1.12 对称矩阵的建立 25 范例1-12 对称矩阵的建立 25 ∷相关函数:store函数 1.1.13 字符串长度的计算 28 范例1-13 字符串长度的计算 28 ∷相关函数:strlen函数 1.1.14 字符串的复制 29 范例1-14 字符串的复制 29 ∷相关函数:strcpy函数 1.1.15 字符串的替换 31 范例1-15 字符串的替换 31 ∷相关函数:strrep函数 1.1.16 字符串的删除 33 范例1-16 字符串的删除 33 ∷相关函数:strdel函数 1.1.17 字符串的比较 35 范例1-17 字符串的比较 35 ∷相关函数:strcmp函数 1.1.18 字符串的抽取 36 范例1-18 字符串的抽取 36 ∷相关函数:substr函数 1.1.19 字符串的分割 38 范例1-19 字符串的分割 38 ∷相关函数:partition函数 1.1.20 字符串的插入 40 范例1-20 字符串的插入 40 ∷相关函数:insert函数 1.1.21 字符串的匹配 42 范例1-21 字符串的匹配 42 ∷相关函数:nfind函数 1.1.22 字符串的合并 43 范例1-22 字符串的合并 43 ∷相关函数:catstr函数 1.1.23 文本编辑 45 范例1-23 文本编辑 45 ∷相关函数:StrAssign函数 1.2 栈和队列 54 1.2.1 用数组仿真堆栈 54 范例1-24 用数组仿真堆栈 54 ∷相关函数:push函数 pop函数 1.2.2 用链表仿真堆栈 57 范例1-25 用链表仿真堆栈 57 ∷相关函数:push函数 pop函数 1.2.3 顺序栈公用 59 范例1-26 顺序栈公用 59 ∷相关函数:push函数 pop函数 1.2.4 进制转换问题 61 范例1-27 进制转换问题 61 ∷相关函数:MultiBaseOutput函数 1.2.5 顺序队列操作 64 范例1-28 顺序队列操作 64 ∷相关函数:push函数 pop函数 1.2.6 循环队列 66 范例1-29 循环队列 66 ∷相关函数:EnQueue函数 DeQueue函数 1.2.7 链队列的入队、出队 69 范例1-30 链队列入队、出队 69 ∷相关函数:push函数 pop函数 1.2.8 舞伴问题 71 范例1-31 舞伴问题 71 ∷相关函数:EnQueue函数 DeQueue函数 DancePartner函数 1.3 链表 75 1.3.1 头插法建立单链表 75 范例1-32 头插法建立单链表 75 ∷相关函数:createlist函数 1.3.2 限制链表长度建立单链表 77 范例1-33 限制链表长度建立长单链表 77 ∷相关函数:createlist函数 1.3.3 尾插法建立单链表 79 范例1-34 尾插法建立单链表 79 ∷相关函数:createlist函数 1.3.4 按序号查找单链表 80 范例1-35 按序号查找单链表 80 ∷相关函数:getnode函数 1.3.5 按值查找单链表 82 范例1-36 按值查找单链表 82 ∷相关函数:locatenode函数 1.3.6 链表的插入 84 范例1-37 链表的插入 84 ∷相关函数:insertnode函数 1.3.7 链表的删除 86 范例1-38 链表的删除 86 ∷相关函数:deletelist函数 1.3.8 归并两个单链表 88 范例1-39 归并两个单链表 88 ∷相关函数:concatenate函数 1.3.9 动态堆栈 90 范例1-40 动态堆栈 90 ∷相关函数:push函数 Pop函数 1.3.10 动态队列 93 范例1-41 动态队列 93 ∷相关函数:Enqueue函数 1.3.11 初始化单循环链表 95 范例1-42 初始化单循环链表 95 ∷相关函数:ListLength_CL函数 1.3.12 查询元素的前驱和后继 98 范例1-43 查询元素的前驱和后继 98 ∷相关函数:PriorElem_CL函数 NextElem_CL函数 1.3.13 单循环链表中元素的删除 101 范例1-44 单循环链表中元素的删除 101 ∷相关函数:ListDelete_CL函数 1.3.14 单循环链表的清除和销毁 107 范例1-45 单循环链表的清除和销毁 107 ∷相关函数:DestroyList函数 1.3.15 仅设表尾指针循环链表的合并 110 范例1-46 仅设表尾指针循环链表的合并 110 ∷相关函数:MergeList_CL函数 1.3.16 正序输出双向链表 113 范例1-47 正序输出双向链表 113 ∷相关函数:ListInsert函数 ListTraverse函数 1.3.17 逆向输出双向链表 116 范例1-48 三角矩阵建立 116 ∷相关函数:ListTraverseBack函数 1.3.18 删除双向链表中的节点 121 范例1-49 删除双向链表中的节点 121 ∷相关函数:ListDelete函数 1.3.19 双向链表的元素个数 124 范例1-50 双向链表的元素个数 124 ∷相关函数:ListLength函数 1.3.20 判断双向链表是否为空 126 范例1-51 判断双向链表是否为空 126 ∷相关函数:ListEmpty函数 1.3.21 双向链表元素值的查询 129 范例1-52 双向链表元素值的查询 129 ∷相关函数:GetElemP函数 1.3.22 稀疏矩阵的建立 136 范例1-53 稀疏矩阵的建立 136 ∷相关函数:Create函数 1.3.23 稀疏矩阵的删除 138 范例1-54 稀疏矩阵的删除 138 ∷相关函数:erase函数 1.4 树和二叉树 141 1.4.1 获得二叉树的深度和根(顺序结构) 141 范例1-55 获得二叉树的深度和根 141 ∷相关函数:BiTreeDepth函数 Root函数 1.4.2 获得二叉树的深度和根(链表结构) 144 范例1-56 获得二叉树的深度和根 144 ∷相关函数:BiTreeDepth函数 Root函数 1.4.3 树的插入(顺序结构) 147 范例1-57 树的插入 147 ∷相关函数:InsertChild函数 1.4.4 节点的修改(顺序结构) 150 范例1-58 节点的修改 150 ∷相关函数:Assign函数 1.4.5 节点的修改(链式结构) 154 范例1-59 节点的修改 154 ∷相关函数:Assign函数 1.4.6 双亲、孩子和兄弟节点的查询(顺序结构) 158 范例1-60 双亲、孩子和兄弟节点的查询 158 ∷相关函数:Parent函数 LeftChild函数 RightChild函数 LeftSibling函数 RightSibling函数 1.4.7 双亲、孩子和兄弟节点的查询(链式结构) 162 范例1-61 双亲、孩子和兄弟节点的查询 162 ∷相关函数:Parent函数 LeftChild函数 RightChild函数 LeftSibling函数 RightSibling函数 1.4.8 中序遍历二叉树(顺序结构) 169 范例1-62 中序遍历二叉树 169 ∷相关函数:InOrderTraverse函数 1.4.9 中序遍历二叉树(链式结构) 171 范例1-63 中序遍历二叉树 171 ∷相关函数:InOrderTraverse函数 1.4.10 中序非递归遍历二叉树(链式结构)(1) 174 范例1-64 中序非递归遍历二叉树 174 ∷相关函数:InOrderTraverse函数 1.4.11 中序非递归遍历二叉树(链式结构)(2) 177 范例1-65 中序非递归遍历二叉树 177 ∷相关函数:InOrderTraverse2函数 1.4.12 后序遍历二叉树(顺序结构) 180 范例1-66 后序遍历二叉树 180 ∷相关函数:PostOrderTraverse函数 1.4.13 后序遍历二叉树(链式结构) 183 范例1-67 后序遍历二叉树 183 ∷相关函数:PostOrderTraverse函数 1.4.14 层次遍历二叉树(顺序结构) 186 范例1-68 层次遍历二叉树 186 ∷相关函数:LevelOrderTraverse函数 1.4.15 层次遍历二叉树(链式结构) 188 范例1-68 层次遍历二叉树 188 ∷相关函数:LevelOrderTraverse函数 1.4.16 树的合并 191 范例1-70 树的合并 191 ∷相关函数:Find函数 Union函数 1.4.17 树的二叉链表存储的基本操作 193 范例1-71 树的二叉链表存储的基本操作 193 ∷相关函数:LevelOrderTraverse函数 1.4.18 二叉树的三叉链表存储的基本操作 201 范例1-72 二叉树的三叉链表存储表示 201 ∷相关函数:CreateBiTree函数 1.4.19 二叉树的二叉线索存储的基本操作 212 范例1-73 二叉树的二叉线索存储 212 ∷相关函数:CreateBiThrTree函数 1.4.20 树的双亲表存储的基本操作 215 范例1-74 树的双亲表存储的基本操作 215 ∷相关函数:CreateTree函数 1.4.21 哈夫曼编码(1) 223 范例1-75 哈夫曼编码(1) 223 ∷相关函数:HuffmanCoding函数 1.4.22 哈夫曼编码(2) 226 范例1-76 哈夫曼编码(2) 226 ∷相关函数:HuffmanCoding函数 1.5 排序 229 1.5.1 直接插入排序 229 范例1-77 直接插入排序 229 ∷相关函数:InsertSort函数 1.5.2 折半插入排序(顺序结构) 231 范例1-78 折半插入排序(顺序结构) 231 ∷相关函数:BInsertSort函数 1.5.3 2—路插入排序(顺序结构) 233 范例1-79 2—路插入排序(顺序结构) 233 ∷相关函数:P2_InsertSort函数 1.5.4 折半插入排序(链式结构) 235 范例1-80 折半插入排序(链式结构) 235 ∷相关函数:Arrange函数 1.5.5 2—路插入排序(链式结构) 238 范例1-81 2—路插入排序(链式结构) 238 ∷相关函数:Rearrange函数 1.5.6 希尔排序 241 范例1-82 希尔排序 241 ∷相关函数:ShellSort函数 1.5.7 冒泡排序 243 范例1-83 冒泡排序 243 ∷相关函数:bubble_sort函数 1.5.8 一趟快速排序 246 范例1-84 一趟快速排序 246 ∷相关函数:QSort函数 1.5.9 一趟快速排序的改进算法 248 范例1-85 一趟快速排序的改进算法 248 ∷相关函数:QuickSort函数 1.5.10 简单选择排序 250 范例1-86 简单选择排序 250 ∷相关函数:SelectSort函数 1.5.11 箱子排序 252 范例1-87 箱子排序 252 ∷相关函数:sort函数 1.5.12 树型选择排序 254 范例1-88 树型选择排序 254 ∷相关函数:TreeSort函数 1.5.13 堆排序 256 范例1-89 堆排序 256 ∷相关函数:HeapSort函数 1.5.14 归并排序 258 范例1-90 归并排序 258 ∷相关函数:MergeSort函数 1.5.15 多路平衡归并排序 260 范例1-91 多路平衡归并排序 260 ∷相关函数:K_Merge函数 1.5.16 置换—选择排序 265 范例1-92 置换—选择排序 265 ∷相关函数:Replace_Selection函数 1.5.17 文件的归并 269 范例1-93 文件的归并 269 ∷相关函数:K_Merge函数 1.6 查找 272 1.6.1 顺序表的查找 273 范例1-94 顺序表的查找 273 ∷相关函数:Search_Seq函数 1.6.2 静态树表的查找 276 范例1-95 静态树表的查找 276 ∷相关函数:Search_SOSTree函数 1.6.3 二叉排序树的基本操作 280 范例1-96 二叉排序树的基本操作 280 ∷相关函数:InsertBST函数 1.6.4 平衡二叉树的基本操作 285 范例1-97 平衡二叉树的基本操作 285 ∷相关函数:SearchBST函数 1.6.5 B树的基本操作 290 范例1-98 B树的基本操作 290 ∷相关函数:SearchBTree函数 1.6.6 按关键字符串的遍历双链键树 295 范例1-99 按关键字符串遍历双链键树 295 ∷相关函数:SearchDLTree函数 1.6.7 按关键字符串的遍历Trie树 301 范例1-100 按关键字符串遍历Trie树 301 ∷相关函数:SearchTrie函数 1.6.8 哈希表的基本操作 306 范例1-101 哈希表的基本操作 306 ∷相关函数:SearchHash函数 1.7 图 311 1.7.1 图的邻接矩阵存储表示 311 范例1-102 图的邻接矩阵存储表示 ∷相关函数:CreateFAG函数 CreateDG函数 1.7.2 图的邻接表存储表示 324 范例1-103 图的邻接表存储表示 324 ∷相关函数:CreateFAG函数 1.7.3 有向图的十字链表存储表示 335 范例1-104 有向图的十字链表存储表示 335 ∷相关函数:CreateDG函数 1.7.4 无向图的邻接多重表存储表示 344 范例1-105 无向图的邻接多重表存储表示 344 ∷相关函数:CreateGraph函数 1.7.5 最小生成树 355 范例1-106 最小生成树 355 ∷相关函数:MiniSpanTree_PRIM函数 1.7.6 关节点和重连通分量 359 范例1-107 关节点和重连通分量 359 ∷相关函数:FindArticul函数 1.7.7 拓扑排序 366 范例1-108 拓扑排序 366 ∷相关函数:TopologicalSort函数 1.7.8 关键路径 374 范例1-109 关键路径 374 ∷相关函数:CriticalPath函数 1.7.9 最短路径 383 范例1-110 最短路径 383 ∷相关函数:ShortestPath_DIJ函数 1.7.10 每一对顶点之间的最短路径 387 范例1-111 每一对顶点之间的最短路径 387 ∷相关函数:ShortestPath_FLOYD函数
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值