当前位置: 首页 > news >正文

单链表的排序+手机通讯录源码

   (程序都是针对有头结点的链表进行排序)

1.插入排序

    需要用两个指针对链表进行遍历,一个指针用于标记待插入的节点(外循环),另一个指针用于寻找插入位置(内循环)。因为需要进行节点的删除与插入,因此对用于遍历的两个指针,还需要再添加两个前驱指针。

Node *InsertSortList( Node *L )
{

  Node *p1, *p2, *temp, *prep1, *prep2;
  if( L->next->next == NULL )
    return L;
  for( p1 = L->next->next, prep1 = L->next; p1 != NULL; p1 = p1->next, prep1 = prep1->next )
  {
    temp = p1;    /*保存待插入节点*/
    for( p2 = L->next, prep2 = L; p2 != p1; p2 = p2->next, prep2 = prep2->next )
    {
      if( p2->data > p1->data )
      {
        p1 = p1->next;
        prep1->next = temp->next;    /*删除待插入节点*/
        prep2->next = temp;              /*将其插入对应位置*/
        temp->next = p2;
        break;
      }
    }
  }
  return L;
}

 

2.冒泡排序

比较相邻节点,选出未排序元素中的最大数,需要用一个尾指针由后向前遍历链表。这里不改变链表结构,而是交换节点存储的数据。

Node *BubbleSort( Node *L )
{
  Node *p, *tail, *next;
  int temp;
  if( L->next->next == NULL )
    return L;
  for( p = L->next; p->next != NULL; p = p->next )    /*尾指针初始化*/
    ;
  tail = p;
  while( tail != L->next->next )
  {
    for( p = L->next; p->next != tail; p = p->next )
    {
      next = p->next;
      if( p->data > next->data )    /*相邻节点比较,数据交换*/
      {
        temp = p->data;
        p->data = next->data;
        next->data = temp;
      }
    }
    tail = p;    /*p->next == tail,即把tail往前移动一位*/
  }
  return L;
}

 

3.选择排序

遍历链表,每次找出一个最小的节点,将其值与未排序节点的首个节点交换,这里需要一个指针标记值最小的节点。

Node *SelectSort( Node *L )
{
  Node *p, *q, *small;
  int temp;

  for( p = L->next; p->next != NULL; p = p->next )    /*每次循环都找出一个最小值,将最小值交换到第一位,然后将指针向后移动一位*/
  {
    small = p;
    for( q = p->next; q; q = q->next )    /*由前向后遍历,找出最小的节点*/
    {
      if( q->data < small->data )
      small = q;
    }
    if( small != p )
    {
      temp = p->data;
      p->data = small->data;
      small->data = temp;
    }
  }
  return L;
}

相关文章:

  • QT模式对话框
  • Qlable显示文本和图片
  • 工具按钮QToolButton
  • 组合框
  • 单行文本框+按钮实现用户登录
  • 勾选复选框后执行某一个操作
  • 点击按钮显示hello world
  • 文件对话框---做一个简单的文本编译器(1)
  • 系统调用与用户接口API
  • 完美解决QT+VS2013中文显示乱码
  • 字符串,QT字符串类,c++字符串类之间的转换
  • 文件对话框---做一个简单的文本编译器(2)
  • 文件对话框---做一个简单的文本编译器(3)
  • 缓冲文件系统和非缓冲文件系统
  • 利用线程读取文件(带有进度条)
  • Asm.js的简单介绍
  • iOS 系统授权开发
  • JavaScript/HTML5图表开发工具JavaScript Charts v3.19.6发布【附下载】
  • leetcode讲解--894. All Possible Full Binary Trees
  • MySQL常见的两种存储引擎:MyISAM与InnoDB的爱恨情仇
  • 对象引论
  • 简单易用的leetcode开发测试工具(npm)
  • 使用putty远程连接linux
  • 手机端车牌号码键盘的vue组件
  • 手写双向链表LinkedList的几个常用功能
  • Spring Batch JSON 支持
  • 阿里云重庆大学大数据训练营落地分享
  • ​水经微图Web1.5.0版即将上线
  • ​学习一下,什么是预包装食品?​
  • #WEB前端(HTML属性)
  • #我与Java虚拟机的故事#连载03:面试过的百度,滴滴,快手都问了这些问题
  • $().each和$.each的区别
  • (1)SpringCloud 整合Python
  • (13)Latex:基于ΤΕΧ的自动排版系统——写论文必备
  • (iPhone/iPad开发)在UIWebView中自定义菜单栏
  • (NO.00004)iOS实现打砖块游戏(九):游戏中小球与反弹棒的碰撞
  • (力扣)1314.矩阵区域和
  • .net core 连接数据库,通过数据库生成Modell
  • .net 提取注释生成API文档 帮助文档
  • .NET 中 GetHashCode 的哈希值有多大概率会相同(哈希碰撞)
  • .sh文件怎么运行_创建优化的Go镜像文件以及踩过的坑
  • /etc/sudoers (root权限管理)
  • :如何用SQL脚本保存存储过程返回的结果集
  • [2021ICPC济南 L] Strange Series (Bell 数 多项式exp)
  • [⑧ADRV902x]: Digital Pre-Distortion (DPD)学习笔记
  • [Asp.net MVC]Bundle合并,压缩js、css文件
  • [autojs]autojs开关按钮的简单使用
  • [BPU部署教程] 教你搞定YOLOV5部署 (版本: 6.2)
  • [BZOJ2850]巧克力王国
  • [cocos creator]EditBox,editing-return事件,清空输入框
  • [EULAR文摘] 利用蛋白组学技术开发一项蛋白评分用于预测TNFi疗效
  • [Flex][问题笔记]TextArea滚动条问题
  • [Fri 26 Jun 2015 ~ Thu 2 Jul 2015] Deep Learning in arxiv
  • [Invalid postback or callback argument]昨晚调试程序时出现的问题,MARK一下
  • [iOS]-网络请求总结