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语言数据结构之复杂链表的拷贝

    C语言数据结构之复杂链表的拷贝 什么是复杂链表 在了解如何拷贝复杂链表之前,首先需要知道什么是复杂链表。复杂链表是由多个节点组成的链表,每个节点除了包含普通链表节点的值和指向下一个节点的指针外,还包含一个指向链表中的任意一个节点的指针。因此,每个节点有两个指针:一个指向下一个节点,一个指向任意一个节点。 复杂链表示意图如下: +—+ +—+ +—…

    数据结构 2023年5月17日
    00
  • Leetcode Practice — 字符串

    目录 14. 最长公共前缀 思路解析 151. 反转字符串中的单词 思路解析 125. 验证回文串 思路解析 415. 字符串相加 思路解析 3. 无重复字符的最长子串 思路解析 8. 字符串转换整数 (atoi) 思路解析 14. 最长公共前缀 编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀,返回空字符串 “”。 输入:strs = […

    算法与数据结构 2023年4月18日
    00
  • Lua教程(七):数据结构详解

    Lua教程(七):数据结构详解 Lua 中的数据结构广泛应用于各种计算机程序中。本文将详细介绍 Lua 中的数组、列表、栈、队列、集合和字典等数据结构的使用以及相关的函数。 数组 数组是存储在连续内存位置上的相同数据类型的元素集合。Lua 中的数组索引默认从 1 开始。下面是一些常用的 Lua 数组函数: table.concat(arr[, sep[, i…

    数据结构 2023年5月17日
    00
  • 数据结构 栈的操作实例详解

    数据结构 栈的操作实例详解 什么是栈? 栈(stack)是一种具有特殊限制的线性数据结构。它只允许在表的一端进行插入和删除操作,另一端是固定的,称为栈底;相反的另一端称为栈顶。栈底用于存放最早进入的元素,栈顶用于存放最近进入的元素,所以栈又称为后进先出的数据结构。 栈的操作 栈的主要操作包括入栈(push)、出栈(pop)、获取栈顶元素(top)和判断栈是否…

    数据结构 2023年5月17日
    00
  • C语言实现带头结点的链表的创建、查找、插入、删除操作

    C语言实现带头结点的链表的创建、查找、插入、删除操作攻略 一、链表基本概念 链表是一种动态的数据结构,它可以在运行时动态地分配内存,支持数据的插入、删除等操作。链表(Linked List)由多个节点(Node)组成,每个节点包含两部分,一个是数据部分(Data),另一个是指向下一个节点的指针(Next)。 二、带头结点的链表 带头结点的链表是一种特殊的链表…

    数据结构 2023年5月17日
    00
  • C语言单链队列的表示与实现实例详解

    C语言单链队列的表示与实现实例详解 什么是队列? 在计算机科学中,队列(Queue)是一种特殊的数据结构,它只允许在一端进行插入操作,在另一端进行删除操作。将新元素插入队列的过程可以称之为入队,而将元素从队列中删除的过程则可以称之为出队。队列的核心思想是“先进先出”(First In First Out,FIFO),即先入队的元素先出队。 单链队列的表示方式…

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

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

    数据结构 2023年5月17日
    00
  • C语言线性表全面梳理操作方法

    C语言线性表全面梳理操作方法 线性表概述 线性表是一种常用的数据结构,是指数据元素之间存在一定逻辑顺序,每个元素都有唯一的前驱和后继。 线性表有两种存储方式: 顺序存储结构 和 链式存储结构。 顺序存储结构 顺序存储结构是指采用顺序存储方式存储线性表,即将线性表的元素依次存储在一段连续的存储空间内。 代码示例:创建顺序存储线性表 #define MaxSiz…

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