单链表逆序与排序

2023-05-16

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct data{ /*链表节点*/
    int id;
    struct data *next;
}DATA;

void list_init(DATA *data) /*链表初始化*/
{
    data->id = 0;
    data->next = NULL;
}

void list_insert(DATA *head, DATA *node) /*malloc一个节点, 并拷贝数据插入到链表中*/
{
    DATA *e = (DATA *)malloc(sizeof(DATA));
    if (!e){
        perror("malloc");
        return ;
    }

    e->id = node->id;    //拷贝数据

    while (head->next)
        head = head->next;      //插入链表末尾

    head->next = e;
    e->next = NULL;
}

void list_reverse(DATA *head)  //链表逆序, 本例子中头节点不存数据, 故只逆序头节点以外的节点
{
    DATA *list1, *list2, *list3;
    list1 = head->next;
    list2 = list1->next;

    while (list2)
    {
        list3 = list2->next;
        list2->next= list1;
        list1 = list2;
        list2 = list3;
    }

    head->next->next = NULL;  //head的下一个及为遍历时的第一节点也即逆序后的最后一个数据节点,链表的尾巴, 故这个数据节点的next要为空。

    head->next = list1;  //此时, list2为空,list2的上一个节点为list1, 故list1为遍历时的最后一个数据节点也即逆序后的第一个节点,故设置head的下一个为list1
}

void list_sort(DATA *head) //链表排序, 排序头结点以外的数据节点
{
    DATA *phead = head;  //遍历单链表, 并将遍历的每个节点插入到新链表中, 新链表头和原链表头是同一个节点
    DATA *list = head->next; 
    DATA *tmp;   //暂存遍历原链表的数据节点的下一个节点
    phead->next = NULL;  //新链表头的下一节点初始化为空

    while (list){

        tmp = list->next; //保存原链表数据节点的下一节点
        while (phead->next){ //遍历新链表找到插入的位置
            if (phead->next->id > list->id)
                break;
            phead = phead->next;
        }

        list->next = phead->next; //将原链表数据节点插入到新链表中
        phead->next = list;

        list = tmp; //将下一个原链表数据节点取出来
        phead = head; //赋值新链表头位置, 便于下一次遍历新链表查找位置
    }

}

void list_display(DATA *head)
{
    DATA *plist = head->next;

    while (plist)
    {
        printf("%-3d    ", plist->id);
        plist = plist->next;
    }
    printf("\n");
}

void list_free(DATA *head)
{
    DATA *e;

    head = head->next;
    while (head){
        e = head;
        head = head->next;
        free(e);
    }
}

#ifdef TEST

DATA g_head;

int main(int c, char **v)
{
    DATA node;
    int i;

    list_init(&g_head);

    srand(10);

    for (i = 0; i < 10; i++){
        node.id = rand()%100;
        list_insert(&g_head, &node);
    }

    list_display(&g_head);

    list_reverse(&g_head);

    list_display(&g_head);

    list_sort(&g_head);

    list_display(&g_head);

    list_free(&g_head);

    return 0;
}

#endif

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

单链表逆序与排序 的相关文章

  • Apache httpd 目录列表禁用配置(options indexes)

    Apache httpd服务器在缺省的情况下 xff0c 开启了基于目录列表的访问 xff0c 这是一个存在安全隐患的问题 xff0c 因此可以关闭这个功能 在Apache 2 4的版本中 xff0c 不在支持使用 indexes来配置 x
  • cmake学习笔记6-catkin的CmakeList.txt讲解

    https www jianshu com p 551d6949b49d 引用 cmake学习笔记 cmakelist txt创建项目示例 cmake的介绍和使用 Cmake实践 推荐cmake手册详解 严重推荐CMake构建系统的骨架 c
  • ROS中使用Intel RealSense D455或L515深度相机

    目的 在ROS平台上 xff0c 使用深度相机作为传感器设计自主避障机器人 1 安装驱动 测试环境 软件 xff1a Ubuntu 16 04 ROS Kinetic 硬件 xff1a Intel RealSense D455 或 L515
  • ROS机器人操作系统底层原理及代码剖析

    0 目的 本文介绍ROS机器人操作系统 xff08 Robot Operating System xff09 的实现原理 xff0c 从最底层分析ROS代码是如何实现的 1 序列化 把通信的内容 xff08 也就是消息message xff
  • RS232,RS485波形分析

    通过观察波形可以确定以下情况 xff1a 是否有数据接收或发送 xff1b 数据是否正确 xff1b 波特率是否正确 xff1b 一 串行数据的格式 异步串行数据的一般格式是 xff1a 起始位 43 数据位 43 停止位 xff0c 其中
  • GPU渲染管线之旅|05 图元处理、Clip/Cull, 投影和视图变换

    上一篇中我们讨论了关于 纹理和采样 xff0c 这一篇我们回到3D管线的前端 在执行完顶点着色之后 xff0c 就可以实际的渲染东西了 xff0c 对吗 xff1f 暂时还不行 xff0c 因为在我们实际开始光栅化图元之前 xff0c 仍然
  • 谈谈OpenCV中的四边形

    首先抛出一个问题 xff0c 给定一系列二维平面上的的点 xff0c 这些点是可以组成一个封闭的二维图形 因为这些点是矩形区域拍摄图像后识别得到的图形的边界点 xff0c 所以我们要抽象出来这个矩形 xff0c 也就是我们要反映出这个矩形
  • GPU渲染管线之旅|07 深度处理、模板处理

    在这一篇中 xff0c 我们来讨论Z pipline的前端部分 简称它为early Z 以及它是在光栅化中怎么起作用的 和上一篇一样 xff0c 本篇也不会按实际的管道顺序进行讨论 xff1b 我将首先描述基础算法 xff0c 然后再补充管
  • GPU渲染管线之旅|08 Pixel Shader

    在这一部分中 xff0c 我们来谈谈像素处理的前半部分 dispatch和实际的像素着色 事实上 xff0c 这部分是大多数图形开发者在谈到PS stage时所关心的内容 有关alpha blend和Late Z的内容则会下一篇文章中去探讨
  • MFC基于CSplitterWnd类的多窗口分割

    使用平台 xff1a win7 64bit 使用环境 xff1a VS2012 1 CSplitterWnd介绍 上图是从MSDN中截取的类的继承图表 xff0c CSplitterWnd类继承自CWnd类 这个类主要就是提供窗口分割的功能
  • OpenCV - 区域生长算法

    1 理论基础 区域生长算法的基本思想是将有相似性质的像素点合并到一起 对每一个区域要先指定一个种子点作为生长的起点 xff0c 然后将种子点周围领域的像素点和种子点进行对比 xff0c 将具有相似性质的点合并起来继续向外生长 xff0c 直
  • 不规则Contours内部像素的操作

    在findContours函数使用了之后 xff0c 有时候就会面临对Contours内部区域的访问 由于contours不一定是凸图形 xff0c 所以使用循环操作的时候总感觉不那么方便 比如在下图中 xff0c 已经使用findCont
  • ros代码中添加使用opencv库,cv::Mat和ros image之间的相互转换

    https blog csdn net sunyoop article details 78630024 ros中很多时候要用到图形处理 xff0c 这时就需要使用opencv库 xff0c 本篇主要将怎么在ros现成node上使用open
  • Ubuntu 16.04 使用

    这篇博客用来专门记录尝试搬迁工作环境到Linux下的使用笔记 xff0c 主要包含有常用软件的安装 xff0c 配置 1 安装输入法 ubuntu 16 04中支持ibus输入系统 1 系统 gt 首选项 gt IBus设置 在弹出的IBu
  • 牛顿迭代法求解方程

    说明 xff1a 该篇博客源于博主的早些时候的一个csdn博客中的一篇 xff0c 由于近期使用到了 xff0c 所以再次作一总结 原文地址 概述 牛顿迭代法 xff08 Newton s method xff09 又称为牛顿 拉夫逊 xf
  • OpenCV - 均值迭代分割

    题外话 之前在博客中写过一篇 区域生长 的博客 xff0c 区域生长在平时经常用到 xff0c 也比较容易理解和代码实现 xff0c 所以在很多情况下大家会选择这种方法 但是区域生长有一个最致命的点就是需要选取一个生长的种子点 为了交流学习
  • IMU原理及姿态融合算法详解

    IMU原理及姿态融合算法详解 一 组成 IMU全称是惯性导航系统 xff0c 主要元件有陀螺仪 加速度计和磁力计 其中陀螺仪可以得到各个轴的加速度 xff0c 而加速度计能得到x xff0c y xff0c z方向的加速度 xff0c 而磁
  • FrankMocap win10安装指导

    本文是相当于将github上frankmocap的安装指导进行了翻译 xff0c 增加了一下windows下安装遇到的坑以及注意事项 如果是linux系统应该安装官方的安装指导安装就可以 xff0c 可以直接参考官方安装指导 安装所有模块
  • ADRC学习(1)系统在调节过程中安排过渡过程的作用

    1 二阶系统的调节过程 考虑对于如下所示的二阶系统 x
  • 笔记本更换SSD后卡顿、假死、失去响应问题探究

    某些笔记本电脑将HDD更换为SSD后 xff0c 系统运行过程中会随机产生半分钟到一分钟的卡顿 xff08 假死 xff09 期间鼠标指针可以运动 xff0c 但所有程序均失去响应 xff0c 也无法打开新的程序 HDD硬盘指示灯常亮 xf

随机推荐

  • 机器人 齐次变换矩阵 位姿变换矩阵(RT矩阵) Matlab参数公式计算

    对于齐次位姿变换 xff08 RT矩阵 xff09 xff0c 有的时候手动计算公式参数太多比较麻烦 xff0c 因此利用matlab参量syms xff0c 可以方便一些 xff0c 可以用于计算机器人正运动学位姿矩阵的参数表示 xff0
  • UART串口校验方式(无校验、奇偶校验、固定校验)

    UART串口校验方式 xff08 奇偶校验 固定校验 无校验 xff09 串口通信校验方式奇偶校验位固定校验位 Stick 无校验位 校验位 xff1a 串口通信中的检错方式 串口在接收数据时 xff0c 如果无检验位 xff0c 则只要检
  • 更改LXDE的语言为中文

    之前给旧笔记本安装了Debian8 43 LXDE嘛 xff0c 运行比较流畅 安装过程中本想选择中文的 xff0c 但是安装界面中旧有中文乱码 xff0c 所以还是选了英语 等装好了系统 xff0c 把apt update 43 upgr
  • 干掉Nouveau安装Linux Nvidia显卡驱动

    https blog csdn net misiter article details 7652731 干掉Nouveau安装Linux Nvidia显卡驱动 首先说明下什么是Nouveau xff0c 为什么有些系统安装N卡驱动的时候会提
  • 【C应用】红外遥控小车程序分析(上)——四轮马达方向控制程序分析

    目录 驱动原理分析 L293D功能分析 代码分析 驱动原理分析 小车采用两片L293D芯片控制四个车轮 xff0c 原理图如下 xff1a 因为L293D可分别控制两路电机 xff0c 为了方便理解L293D芯片的工作原理 xff0c 拿L
  • 【RTOS】RTOS实时操作系统随笔(结合UCOSII相关移植)

    目录 无操作系统下的程序结构及缺陷 有操作系统下的解决方案及CPU工作原理 操作系统调度策略及时间片轮转策略 操作系统TICK及进程切换 UCOSII介绍 UCOSII进程任务切换原理 xff1a UCOS进程的堆栈 xff1a 时钟TIC
  • 【STM32CobeMX】CubeMX建立基于STM32F1VBT6的FreeRTOS

    STM32F103VBT6 内部时钟源RCC 如果使用RTOS 使用了RTOS xff0c 默认使用SysTick xff1b 所以HAL库的时基就要用其他的定时器 当用了RTOS xff0c 就要设置HAL的timebase为其他Time
  • 【QT】手把手制作一个网络调试助手(UDP设计)

    TCP和UDP网络通信类的使用 Porn hub 1 程序框架搭建 接着上一篇文章 xff0c 这里就开始设计UDP的相关功能函数了 xff0c 首先将其UDP的相关配置进行隐藏 xff1b 1 1 构造函数讲解 MainWindow Ma
  • 【PADSVX2.7】PADSVX2.7

    目录 1 文件准备 xff1a 2 解压PADSVX 2 7 ESDM到Install 3 点击Setup 4 替换文件 5 有请馒头大师 6 开始享受VX2 7带来的爽快感觉 xff01 xff01 xff01 1 文件准备 xff1a
  • STM32 CAN的ID过滤配置

    过滤器的过滤模式 STM32提供两种过滤模式供用户设置 xff1a 屏蔽位模式和标识符列表模式 STM32总共提供14个过滤器组来处理CAN接收过滤问题 xff0c 每个过滤器组包含两个32位寄存器CAN FxR0和CAN FxR1组成 x
  • 基于STM32F407时钟配置学习

    STM32F4x系列时钟树如下 xff1a 1 系统时钟SYSCLK 在STM32F407中 xff0c 除了一些特定的时钟 xff08 例如 xff0c USB OTG FS时钟 xff0c I2S时钟 xff09 外 xff0c 系统所
  • WIN10不能访问共享文件夹的一般性问题

    WIN10不能访问共享文件夹的一般性问题 访问共享文件夹要确定双方在同一网段 xff0c 且自己可以ping通自己 如果都满足还是不能访问 xff0c 试试下面两个解决办法 报错0x8000405 win 43 r xff0c 在里面输入
  • Win10磁盘占用100%解决方法

    Win10磁盘占用100 解决方法 1 按住Ctrl 43 Shift 43 ESC打开任务管理器 xff0c 点击任意进程 xff0c 右键 资源值 磁盘 百分比 xff0c 如果是一般应用进程 xff0c 可以直接关掉 2 切换到 性能
  • WIN7不能访问共享文件夹

    WIN7不能访问共享文件夹 1 确定同一网段 2 开启被访问电脑的Guest用户 windows启用guest用户一般又3种方式 xff0c 通过图形化界面或cmd命令行 xff1a 1 打开运行输入cmd回车 xff0c 输入 xff1a
  • docker 容器更新镜像发布和保存操作步骤

    1 修改容器 安装软件等修改操作 2 docker commit 提交更新并生成新的image sudo docker commit m 34 cuda 9 0 install 34 a 34 chengde 34 23ecb489cf78
  • 嵌入式linux学习----Makefile基础知识

    一 嵌入式linux学习 Makefile基础知识 1 1 Makefile作用 makefile关系到了整个工程的编译规则 一个工程中的源文件不计数 xff0c 其按类型 功能 模块分别放在若干个目录中 xff0c makefile定义了
  • Expert C Lanuage 学习笔记----1、穿越时空的迷雾(1)

    Expert C Lanuage 学习笔记 1 穿越时空的迷雾 xff08 1 xff09 1 First Mistake 几乎每个C语言编程新手都犯过下面错误 xff1a if i 61 3 正确应该是 if i 61 61 3 这种错误
  • vscode 保存代码自动格式化(vue)

    1 根据项目配置的eslint规则保存代码后 xff0c 自动格式化代码 2 需要安装prettier 和 vetur settings json 34 codestream serverUrl 34 34 https api codest
  • 理解互斥量和信号量

    互斥量 Mutex 互斥量表现互斥现象的数据结构 xff0c 也被当作二元信号灯 一个互斥基本上是一个多任务敏感的二元信号 xff0c 它能用作同步多任务的行为 xff0c 它常用作保护从中断来的临界段代码并且在共享同步使用的资源 Mute
  • 单链表逆序与排序

    xfeff xfeff xfeff xfeff xfeff xfeff include lt stdio h gt include lt stdlib h gt include lt string h gt typedef struct d