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日

相关文章

  • 字符串算法–$\mathcal{KMP,Trie}$树

    \(\mathcal{KMP算法}\) 实际上,完全没必要从\(S\)的每一个字符开始,暴力穷举每一种情况,\(Knuth、Morris\)和\(Pratt\)对该算法进行了改进,称为 \(KMP\) 算法。 而\(KMP\)的精髓在于,对于每次失配之后,我都不会从头重新开始枚举,而是根据我已经得知的数据,从某个特定的位置开始匹配;而对于模式串的每一位,都有…

    算法与数据结构 2023年4月18日
    00
  • Lua中使用table实现的其它5种数据结构

    Lua中使用table可以实现多种数据结构,除了Lua原生支持的数组、哈希表之外,我们还可以用table来实现其他五种数据结构,这些数据结构包括集合(Set)、队列(Queue)、双端队列(deque)、堆栈(stack)以及链表(List)。 Set 集合数据结构中的元素是无序的、不重复的。使用table来实现集合数据结构,可以将元素作为table的key…

    数据结构 2023年5月17日
    00
  • Golang Mutex互斥锁源码分析

    Golang Mutex互斥锁源码分析 介绍 Golang的Mutex互斥锁机制是一种非常重要的并发控制方式,它可以保证在同一时刻,同一共享资源只能被一个goroutine访问,其他的goroutine必须等待当前访问者释放锁之后才能访问该共享资源。 在使用Mutex机制时,需要进行锁定、解锁等操作,而这一过程是由Mutex的底层实现——sync包来完成的。…

    数据结构 2023年5月17日
    00
  • qqwry.dat的数据结构图文解释第1/2页

    “qqwry.dat的数据结构图文解释第1/2页”的完整攻略 1. 什么是qqwry.dat? qqwry.dat是一个IP地址库,包含了全球的IP地址信息,例如:所属国家、所属地区、详细地址等信息。在大多数系统或应用程序中,都可以使用qqwry.dat来查询IP地址信息。 2. qqwry.dat的数据结构 qqwry.dat的数据结构可以通过两个文件来描…

    数据结构 2023年5月16日
    00
  • 如何配置git环境

    首先我们新建一个文件夹;    然后我们右键git Bash Here一下;在里面输入: cd ssh-keygen cd.ssh ls (注意,我们要是之前就生成过密钥,直接输入ls就好了) 输入ls之后,会显示出来我们的公钥,我们输入: cat id_rsa.pub 然后密钥就出来了,密钥出来之后,我们把密钥复制一下,打开github 选择设置; 中会有…

    算法与数据结构 2023年4月18日
    00
  • Redis数据结构之链表与字典的使用

    Redis是一个开源、基于内存的数据结构存储系统。Redis支持多种数据类型,包括字符串、整数、浮点数、列表、哈希表、集合、有序集合等。本文将详细介绍Redis数据结构之链表与字典的使用。 链表 链表是Redis中常用的数据结构之一,主要用于存储有序的元素列表。链表中的每个元素都包含了一个指向前驱元素和后继元素的指针,这种结构可以方便地实现链表的插入、删除和…

    数据结构 2023年5月17日
    00
  • 字典树的基本知识及使用C语言的相关实现

    字典树的基本知识 字典树,英文名为Trie树,又称单词查找树或键树,是一种树形数据结构,用于表示关联数组或映射。它的优点是,可以大大减少无谓的字符串比较,查询效率比哈希表高。 字典树的核心概念是节点,每个节点包含一个字符和指向子节点的指针。根节点为空字符,每个字符串以一个独立的路径插入节点。如果一个字符串是另一个字符串的前缀,那么这个字符串的节点是另一个字符…

    数据结构 2023年5月17日
    00
  • Go 数据结构之堆排序示例详解

    Go 数据结构之堆排序示例详解 什么是堆? 堆(Heap)是一种特殊的树形数据结构,它满足下列性质: 堆中每个节点的关键字都不大于(或不小于)其子节点的关键字。 堆中,根节点(顶端)是最小或最大元素。 堆实际上是一个完全二叉树,因此可以用数组实现。对于下标为i的节点,其左子节点为2i,右子节点为2i+1,父节点为i/2。 堆分为最大堆和最小堆。在最大堆中,父…

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