首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

以升序将数字插入链表的C函数

可以使用以下方式实现:

代码语言:txt
复制
#include <stdio.h>
#include <stdlib.h>

// 定义链表节点结构体
struct ListNode {
    int val;
    struct ListNode *next;
};

// 创建新节点
struct ListNode* createNode(int val) {
    struct ListNode* newNode = (struct ListNode*)malloc(sizeof(struct ListNode));
    newNode->val = val;
    newNode->next = NULL;
    return newNode;
}

// 插入数字到链表
struct ListNode* insert(struct ListNode* head, int val) {
    struct ListNode* newNode = createNode(val);
    
    // 头节点为空,直接将新节点作为头节点
    if (head == NULL) {
        head = newNode;
        return head;
    }
    
    // 头节点大于新节点,将新节点作为头节点
    if (head->val > val) {
        newNode->next = head;
        head = newNode;
        return head;
    }
    
    struct ListNode* curr = head;
    
    // 遍历链表找到合适的位置插入新节点
    while (curr->next != NULL && curr->next->val < val) {
        curr = curr->next;
    }
    
    newNode->next = curr->next;
    curr->next = newNode;
    
    return head;
}

// 打印链表
void printList(struct ListNode* head) {
    struct ListNode* curr = head;
    
    while (curr != NULL) {
        printf("%d ", curr->val);
        curr = curr->next;
    }
    
    printf("\n");
}

int main() {
    struct ListNode* head = NULL;
    
    // 插入数字到链表
    head = insert(head, 5);
    head = insert(head, 2);
    head = insert(head, 7);
    head = insert(head, 1);
    head = insert(head, 9);
    
    // 打印链表
    printList(head);
    
    return 0;
}

这个C函数实现了将数字按升序插入链表的功能。首先定义了链表节点的结构体,包含一个整数值和指向下一个节点的指针。然后定义了创建新节点的函数createNode,用于动态分配内存并初始化节点的值和指针。接下来是插入数字到链表的函数insert,它接收链表的头节点和要插入的数字作为参数。函数首先创建一个新节点,然后根据不同情况进行插入操作。如果头节点为空,直接将新节点作为头节点;如果头节点的值大于新节点的值,将新节点作为头节点;否则,遍历链表找到合适的位置插入新节点。最后,定义了打印链表的函数printList,用于遍历链表并打印节点的值。在main函数中,演示了将数字5、2、7、1、9按升序插入链表,并打印链表的结果。

这个函数的优势是可以方便地将数字按升序插入链表,时间复杂度为O(n),其中n是链表的长度。它适用于需要维护有序链表的场景,比如对一系列数字进行排序或者实现优先级队列等。对应的腾讯云相关产品和产品介绍链接地址暂时无法提供,因为问题中要求不能提及特定的云计算品牌商。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • C++】STL 容器 - list 双向链表容器 ③ ( list 常用 api 简介 | 中间位置 插入 删除 元素 | insert 函数 | clear 函数 | erase 函数 )

    一、list 双向链表容器 中间位置 插入 元素 1、在指定位置插入 1 个元素 - insert 函数 下面的 std::list#insert 函数原型作用是 在 指定 迭代器位置 position...n 个相同元素 - insert 函数 下面的 std::list#insert 函数原型作用是 在 指定 迭代器位置 position 上 , 插入 n 个 value 值元素 ; void insert...函数 在 list 双向链表容器 中间位置 插入 另一个容器指定范围内 元素 ; 下面的函数原型中 , 接受两个迭代器 first 和 last , 表示一个输入范围 ; 该函数范围 [first...二、list 双向链表容器 中间位置 删除 元素 1、删除容器中所有元素 - clear 函数 调用 std::list 双向链表容器 clear 函数 , 可以删除 容器中所有元素 , 容器变成了一个空...(3); 3、删除容器中指定 迭代器位置 元素 - erase 函数 调用 std::list 双向链表容器 erase 函数 , 传入 单个 指向某 position 位置迭代器 , 则会删除位于

    25210

    C语言学生成绩管理系统详解

    pw:尾节点 // 声明函数 // 从数据文件中逐行读取学生信息生成学生链表,返回头指针 struct StuLink *ReadFromFile(); // 先将学生链表按学号升序排序,再将学生链表数据逐行保存到数据文件...void SaveToFile(struct StuLink *head); // SortLink函数:按指定数据项顺序【1:学号(升序)】或者【2:成绩(降序)】对学生链表进行排序 struct...新结点学号是链表中最大学号加1,姓名和成绩从键盘输入 // (注意:成绩必须在[0,100]区间整数),根据成绩计算等级。 // 注意:插入结点会导致链表中各结点名次变化。...学生按成绩降序排序,再计算链表中每个结 点名次,最后保存(学号升序)到文件中。...pw:尾节点 // 声明函数 // 从数据文件中逐行读取学生信息生成学生链表,返回头指针 struct StuLink *ReadFromFile(); // 先将学生链表按学号升序排序,再将学生链表数据逐行保存到数据文件

    2.9K20

    如何在 C# 中编程方式 CSV 转为 Excel XLSX 文件

    在本文中,小编将为大家介绍如何在Java中编程方式【比特币-美元】市场数据CSV文件转化为XLSX 文件。...创建项目 (1)使用 Visual Studio 2022,创建一个新项目 ( CTRL+SHIFT+N ) 并 在下拉列表中 选择 C#、 所有平台和 WebAPI ,快速找到项目类型ASP.NET...,并重新排列列 Volume 列放在 Date 和 Open列之间。...然后,代码在整个表格范围内添加一个StockVOHLC 类型工作表 (成交量-开盘-高-低-收盘)新图表,设置图表标题,系列添加到图表中,类别轴单位更改为“月”,更新类别轴刻度标签方向和数字格式,...中编程方式 CSV 转为 Excel XLSX 文件全过程,如果您想了解更多信息,欢迎点击这篇参考资料访问。

    23010

    问与答90:如何随机函数生成数字固定下来?

    学习Excel技术,关注微信公众号: excelperfect Q:我有一个工作表,其中含有随机函数生成数字,然而每当我修改工作表单元格或者重新打开工作簿或者保存工作簿时,这些数字都会发生变化,我想要随机函数生成这些数字后不再变化...尝试工作表计算选项改为手动,如下图1所示,但是每当修改工作表单元格后保存时生成数字仍会变化。 ? 图1 A:只能使用VBA代码来解决。...示例工作表如下图2所示,在单元格区域B2:B4中由RAND函数生成数字。 ?...图2 可以使用代码: Range("B2:B4").Copy Range("B2:B4").PasteSpecial xlPasteValues 如果还需要使用随机函数生成随机数,可以工作簿另存并使用上述代码随机数变成固定数字

    1.6K20

    STL-->list

    list list类似于C语言中双向链表,它通过指针来进行数据访问,因此维护内存空间可以不连续,这也非常有利于数据随机存取,因而它没有提供 [] 操作符重载。...push_back push_back()val连接到链表最后 push_front push_front()函数val连接到链表头部 remove void remove( const...remove_if remove_if()一元谓词pr为判断元素依据,遍历整个链表。如果pr返回true则删除该元素。 reverse reverse()函数把list所有元素倒转。...sort void sort(); void sort( Comp compfunction ); sort()函数链表排序,默认是升序。...如果指定其他参数,则插入lst中del所指元素到现链表pos上,或者用start和end指定范围。 swap swap()函数交换lst和现链表元素。

    43040

    大疆2023秋招笔试真题解析

    题目描述 现在有一个链表数组,每个链表内都已经是升序排序现在请你所有的链表进行合并,返回合并后升序链表。...合并K个升序链表完全一致。...由于采用ACM模式输入,本题输入直接用数组代替链表,故可以有两种方式进行处理: 直接对K个升序数组进行K路归并 数组转化为链表,再对K个升序链表进行K路归并 在熟练度较高情况下,建议使用第二种方法...考虑优先队列中元素不超过k个,那么插入和删除时间代价为O(log⁡k),这里最多有 kN个点,对于每个点都被插入删除各一次,故总时间代价即渐进时间复杂度为 O(kn×log⁡k) 空间复杂度:O(...K个升序数组进行K路归并函数 def mergeKLists(lists): # 构建小根堆,内层元素为二元元组,由每个数组nums首元素值nums[0]和其在lists中索引i构成

    23620

    C++中list用法详解

    list容器完成功能实际上和数据结构中双向链表是极其相似的,list中数据元素是通过链表指针串连成逻辑意义上线性表,也就是list也具有链表主要优点,即:在链表任一位置进行元素插入、删除操作都是快速...但由于链表特点,它可以很好效率支持任意地方删除和插入。...---- 2.5 resize(): 如果调用resize(n)list长度改为只容纳n个元素,超出元素将被删除,如果需要扩展那么调用默认构造函数T()元素加到list末端。...---- 2.12 merge():合并两个链表并使之默认升序(也可改),l1.merge(l2,greater()); 调用结束后l2变为空,l1中元素包含原来l1 和 l2中元素,并且排好序...其实默认是升序,greater()可以省略,另外greater()是可以变,也可以不按升序排列。

    1.8K30

    LeetCode算法

    14.最长公共前缀 编写一个函数来查找字符串数组中最长公共前缀。 如果不存在公共前缀,返回空字符串 “”。...有效字符串需满足: 左括号必须用相同类型右括号闭合。 左括号必须正确顺序闭合。 每个右括号都有一个对应相同类型左括号。...有效括号 ---- 21.合并两个有序链表 两个升序链表合并为一个新 升序 链表并返回。新链表是通过拼接给定两个链表所有节点组成。...---- LeetCode地址—>21.合并两个有序链表 ---- 26.删除有序数组中重复项 给你一个 升序排列 数组 nums ,请你 原地 删除重复出现元素,使每个元素 只出现一次 ,返回删除后数组新长度...更规范地说,如果在删除重复项之后有 k 个元素,那么 nums 前 k 个元素应该保存最终结果。 最终结果插入 nums 前 k 个位置后返回 k 。

    31040

    redis基本数据类型

    一:redis是一个开源,使用C语言编写,支持网络,可基于内存亦可持久化日志型,key-value方式存储nosql数据库。...,取出数据顺序和进栈顺序刚好相反, rpush表示从最右边开始进行压栈操作,取出数据顺序和插入数据顺序一致 集合中一个key可以对应多个value值,是基于链表存储 lrange key 0...(3)set无序集合 set集合不允许有重复元素,如果有重复,自动重复数据删除 存值:sadd key values   例子: sadd list2 a b c  取值:smembers key...(4)zset集合:有顺序,不能重复 会将插入数据时数字作为排序依据,默认进行升序排列 存值:获默认按照score进行升序排列 zset   key score1 value1 score2 value2...score3 value3  取值;取出数据是经过升序排列没有重复有序集合 zrange key 0 -1 升序输出 zrevrange key 0 -1 降序输出  删除:zrem key value

    99170

    教你用链表秒杀约瑟夫

    合并 K 个升序链表 给定一个链表数组,每个链表都已经按升序排列。 请将所有链表合并到一个升序链表中,返回合并后链表。...我们需要以升序顺序返回合并后链表。 解题思路: 为了解决这个问题,我们可以使用优先队列来维护所有的头节点,并依次弹出最小头节点,并将其对应链表下一个节点插入到队列中。...1.2 学习双链表基本操作:插入、删除、查找等 接下来,让我们一起学习双链表基本操作,包括插入、删除和查找。 插入操作 在双链表中,插入操作可用于在任意位置插入一个新节点。...下面是一个用 C 语言实现链表插入操作示例代码: #include #include struct Node { int data; struct...insert 函数用于向双链表插入一个新节点。如果双链表为空,则将新节点作为头节点;否则,遍历双链表至末尾,新节点插入到最后一个节点之后。 删除操作 删除操作允许我们从双链表中移除指定节点。

    19310

    FreeRTOS(八):列表和列表项

    与列表相关全部东西都在文件 list.c 和 list.h 中。...6、列表项插入 列表项插入操作通过函数 vListInsert() 来完成,列表项是按照升序方式插入。...插入过程和数据结构中双向链表插入类似,像 FreeRTOS 这种 RTOS 系统和一些协议栈都会大量用到数据结构知识,所以建议大家没事时候多看看数据结构方面的书籍,否则的话看源码会很吃力。...上面再讲解函数 vListInsert()时候说过了列表项是按照升序方式插入,所以 ListItem2 肯定是插入到 ListItem1 后面、xListEnd 前面。...按照升序排列方式,ListItem3 应该放到 ListItem1 和 ListItem2 中间,大家最好通过对照这三幅图片来阅读函数 vListInsert()源码,这样就会对函数有一个直观认识

    2.1K40

    【数据结构初阶】直接插入排序和希尔排序&链表排序

    哈哈,有点突兀,怎么就到排序了,那是今天做到一题链表排序题目,特地学了插入排序  目录  1.直接插入排序  2.希尔排序 3.性能测试代码 4.链表直接插入排序OJ ----  1.直接插入排序...直接插入排序基本思想就是:把第一个元素看成有序,然后待排序数组元素一个一个插入到有序序列中,直到所有元素都插完为止,从而形成新有序序列....,所以选择在堆上开辟一块大空间 通过记录排序前后clock()时钟打点记录时间(毫秒),end-bigin即是排序消耗时间 //C 语言中clock()函数头文件是time.h int main...OJ 力扣.链表排序 由上面我们知道,如果和数组排序从后往前比较的话,由于链表只能顺序遍历特点,这是不可取,所以我们只能从前往后比进行插入,加之链表插入元素时不用大量移动元素,真是完美!...第一步:建立新链表,从原链表中取出结点,记为cur 第二步:从前往后遍历新链表,比较newcur->val和cur->val大小,选择合适位置插入 以下是带头结点链表排序,如果不带头结点,要注意头插

    30020

    DS链表—学生宿舍管理(双向列表容器List)

    用两个链表(已用宿舍链表和可用宿舍链表)维护宿舍管理,实现宿舍分配、宿舍交回。 约定已用宿舍链表按宿舍号升序链接。初始可用宿舍链表也按宿舍号升序链接。..., //按宿舍号升序挂在已用宿舍链表中。...先讲解决思路,用两个结构体链表操作,一个used存用过,一个access存可用,一上来先给access编上号,然后已用插入used,并从access里面删掉,这里必须要注意,删完一定要break...分配宿舍就插入used,access弹掉前面的,退宿舍就删uesd,插入access,记得删完一定要break。...排序直接调用list自己排序函数,不过要自己写排序规则函数,用算法库里面的sort会报错

    18520
    领券