C语言数据结构 链表与归并排序实例详解

C语言数据结构 链表与归并排序实例详解

链表介绍

链表是一种数据结构,它对于存储数据是动态而灵活的。它可以根据我们的需要动态的分配内存空间。链表是由先后相连的数据单元(结点)组成,每个结点都包含了下一结点的地址信息,最后一个结点的地址信息为NULL。链表按照操作方式可以分为单向链表、双向链表与循环链表等几种类型。

归并排序原理

归并排序是一种分治思想的算法,基本步骤依次是分割、排序和合并。分割:将数组分成左右两个部分,再将左右两边分别继续重复分割,直到分不出为止;排序:利用递归对子数组进行排序;合并:将排好序的两个子数组进行有序合并,从而使整个数组有序。

链表的归并排序实现

以下代码演示了链表的归并排序实现:

typedef struct ListNode {
    int val;
    struct ListNode *next;
} ListNode;

ListNode* merge2Lists(ListNode *l1, ListNode *l2) {
    if (l1 == NULL) return l2;
    if (l2 == NULL) return l1;
    if (l1->val < l2->val) {
        l1->next = merge2Lists(l1->next, l2);
        return l1;
    } else {
        l2->next = merge2Lists(l1, l2->next);
        return l2;
    }
}

ListNode* mergeSort(ListNode* head) {
    if (head == NULL || head->next == NULL) return head;
    ListNode *fast = head, *slow = head, *prev = NULL;
    while (fast != NULL && fast->next != NULL) {
        prev = slow;
        slow = slow->next;
        fast = fast->next->next;
    }
    prev->next = NULL;
    ListNode *left = mergeSort(head);
    ListNode *right = mergeSort(slow);
    return merge2Lists(left, right);
}

其中,merge2Lists 函数是用来合并两个子链表的算法,mergeSort 函数利用递归来对子链表进行归并排序。

示例

以下两个示例分别展示了空链表和非空链表进行归并排序的过程。

空链表示例

ListNode* head = NULL;
head = mergeSort(head);

输出结果为:NULL,即空链表不需要进行归并排序。

非空链表示例

ListNode l5 = { 4, NULL };
ListNode l4 = { 2, &l5 };
ListNode l3 = { 5, &l4 };
ListNode l2 = { 1, &l3 };
ListNode l1 = { 3, &l2 };
ListNode *head = &l1;
head = mergeSort(head);

输出结果为:1->2->3->4->5,即原链表经过归并排序后变成了升序排列的链表。

以上就是关于C语言数据结构 链表与归并排序实例的详细攻略,希望对您有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言数据结构 链表与归并排序实例详解 - Python技术站

(0)
上一篇 2023年5月16日
下一篇 2023年5月16日

相关文章

  • C++数据结构之AVL树的实现

    C++数据结构之AVL树的实现 什么是AVL树 AVL树是一种自平衡二叉查找树,也就是说它通过旋转操作来保持树的平衡。 在AVL树中,任何节点的两个子树高度差不超过1。如果高度差大于1,则需要通过旋转操作来调整树的平衡。 AVL树提供了比红黑树更快的插入和删除操作,但是在读取数据时红黑树更快。 AVL树的实现 结构体定义 我们可以先定义一个结构体来表示AVL…

    数据结构 2023年5月17日
    00
  • C语言结构体详细图解分析

    针对C语言结构体详细图解分析的攻略,我来详细讲解一下。 一、什么是结构体? 结构体是C语言中一种自定义数据结构类型,是将不同类型的变量组合在一起的方式,形成了新的数据类型。结构体成员可以是任意类型的数据,包括基本类型、数组、指针、函数等,可以理解为一个包含多个变量的大变量。 二、结构体的定义和使用 定义结构体的方式为: struct name { type1…

    数据结构 2023年5月17日
    00
  • 「学习笔记」BSGS

    「学习笔记」BSGS 点击查看目录 目录 「学习笔记」BSGS Baby-step Giant-step 问题 算法 例题 Discrete Logging 代码 P3306 [SDOI2013] 随机数生成器 思路 P2485 [SDOI2011]计算器 思路 Matrix 思路 代码 Baby-step Giant-step 问题 在 \(O(\sqrt…

    算法与数据结构 2023年4月17日
    00
  • JavaScript数据结构之广义表的定义与表示方法详解

    JavaScript数据结构之广义表的定义与表示方法详解 什么是广义表 广义表是一种包含了无数元素的数据结构,可以是元素或者嵌套的子表。广义表可以表示为: $\quad\quad\quad GL = (a_0,a_1,…,a_n)$ 其中$a_i$可以是元素或者一个子表,如果$a_i$为一个子表,那么$a_i$本身也是一个广义表。广义表中,第一个元素$a…

    数据结构 2023年5月17日
    00
  • JavaScript数据结构之链表的实现

    JavaScript数据结构之链表的实现 什么是链表 链表是一种线性数据结构,其中的元素在内存中不连续地存储,每个元素通常由一个存储元素本身的节点和一个指向下一个元素的引用组成。相比较于数组,链表具有如下优缺点: 优点:动态地添加或删除元素时,无需移动其它元素。(数组则需要移动其它元素) 缺点:不能随机地访问某个元素,必须从头开始顺序遍历。(而数组可以通过索…

    数据结构 2023年5月17日
    00
  • JavaScript数据结构yocto queue队列链表代码分析

    JavaScript数据结构yocto queue队列链表代码分析 什么是队列? 队列(Queue)是一种基础的数据结构,属于线性结构,它的特点是在队列尾插入元素,同时在队列头删除元素,遵循先进先出(FIFO)的原则。队列可以简单的理解为排队,先到达的先被服务,而后到达的则等在队列尾排队等待。队列的应用非常广泛,例如排队系统、消息队列等。 队列的实现方式 队…

    数据结构 2023年5月17日
    00
  • C数据结构中串简单实例

    下面我将为您详细讲解C语言中串的简单实例。 1. 什么是串 在C语言中,串(String)是由一系列字符组成的序列,是一种常见的数据类型。在C语言中,串通常是以字符数组(Char Array)的方式进行存储的。 2. 定义和初始化串 在C语言中,定义和初始化串可以通过以下方式进行: #include <stdio.h> #include <…

    数据结构 2023年5月17日
    00
  • C++数据结构的队列详解

    C++数据结构的队列详解 队列是什么? 队列是一种先进先出(First In First Out, FIFO)的数据结构,类似于现实生活中的排队等待服务。 队列中的数据按照先进先出的原则被处理。新的元素只能被插入在队列的末尾,而旧的元素只能从队列的开头被删除。因此,队列的末尾称为队尾,队列的开头被称为队头。 队列的实现方式 数组实现方式 队列可以使用数组实现…

    数据结构 2023年5月17日
    00
合作推广
合作推广
分享本页
返回顶部