链表排序讲解:

head指针指向链表的头结点,是找到整个链表的唯一依据,如果head指针丢失,整个链表就找不到了。

head存储的是第一个节点的地址,head->next存储的是第二个节点的地址;  任意一个节点p的地址,只能通过它前一个节点的next来求得。

单向链表的选择排序图示: ---->[1]---->[3]---->[2]...---->[n]---->[NULL](原链表)

head   1->next  3->next  2->next   n->next

选择排序(Selection sort)是一种简单直观的排序算法。

首先在未排序序列中找到最小元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小元素,然后放到排序序列末尾。以此类推,直到所有元素均排序完毕。

动画演示:http://www.nowamagic.net/librarys/veda/detail/1849

选择排序

定义的结构体

struct student
{
]; //学生学号
];  //学生姓名

struct student *next;  //next 指针 指向 struct  student 类型的变量
}stu;

里面的变量均为数组

那怎么实现结构体中定义(有)数组变量,链表遍历结构体,按照结构体里面变量来排序呢?

其中对数组比较大小、比较两个字符串的大小来使用的函数是: strcmp()  也就是string compare字符串比较。

对数组之间的赋值函数是 strcpy()  ==="string copy"

升序:

/***************

函数功能:
升序排列出勤学生
返回:指向链表表头的指针

/***************/

struct student *sort_message_order(struct student* head) //升序  按照ID顺序

{
    struct student *Back,*pointer; //p指针指向新的节点 back指针指向链表的尾节点
    struct student  temp; // 定义结构体student别名,typedef也可以定义的结构体别名
    Back=head->next;
    pointer=head->next; //跳过头结点 指向下一个节点 头结点中没有学生信息
    while(Back!=NULL) //如果尾节点不为空 就一直遍历下去
    {
        while(pointer->next!=NULL) //如果指向新开辟的结点不为空就一直遍历下去
        {
            pointer=pointer->next; //指向下一个新开辟的结点
              )  //如果back->ID大于pointer->ID就返回大于0的值;后面大于前面的 往后放
            {
                strcpy(temp.ID,Back->ID);
                strcpy(temp.name,Back->name);  //把尾节点值赋值给临时temp结构体变量

                strcpy( Back->ID,pointer->ID);
                strcpy(Back->name,pointer->name); //把指向的新节点 跟尾节点交换 位置

                strcpy(pointer->ID,temp.ID);
                strcpy(pointer->name,temp.name);//将临时temp结构体变量赋值给指向的结构体变量

            }
        }
        Back=Back->next; //指向下一个尾节点
        pointer=Back;  //指向尾节点
    }
    return head;  //返回头结点

}

降序:

/***************

函数功能:
降序排列出勤学生
返回:指向链表表头的指针

/***************/

struct student * sort_message_Desc(struct student* head)//Descending降序
{
    struct student *Back,*pointer; //p总是指向新申请的结点  back总是指向链表的尾节点
    struct student  temp;
    Back=head->next;
    pointer=head->next;//跳过头结点,头结点中没有学生信息
    while(Back!=NULL)
    {
        while(pointer->next!=NULL)
        {
            pointer=pointer->next;

              ) // back->ID小于pointer->ID返回负数 把最小的 往后放  降序
            {
                strcpy(temp.ID,Back->ID);
                strcpy(temp.name,Back->name);     //把尾节点值赋值给临时temp结构体变量

                strcpy( Back->ID,pointer->ID);
                strcpy(Back->name,pointer->name); //指向的新节点 跟尾节点交换 位置

                strcpy(pointer->ID,temp.ID);
                strcpy(pointer->name,temp.name);  //将临时temp结构体变量赋值给指向的结构体变量
            }
        }
        Back=Back->next; //指向下一个尾节点
        pointer=Back;   //指向尾节点
    }
    return head;  //返回头结点
}

输出打印链表内容:

void Print_List(struct student *head)
{
    struct student* pointer;
    pointer=head->next; //跳过无数据的头结点
    while(pointer!=NULL)
        {
            printf(" ",pointer->ID);
            printf(" ",pointer->name);

            pointer=pointer->next;//指向下一个节点
        }
}

C语言链表中数组实现数据选择排序,升序、降序功能主要难点的更多相关文章

  1. 【java】实体类中 按照特定的字段 进行升序/降序 排序

    背景: 实际页面上  所有的分值都是按照JSON格式存储在一个字符串中 存储在同一个字段中: {"ownPTotal":"10>0","ownO ...

  2. java中的选择排序之降序排列

    import java.util.Arrays;//必须加载 class Demo{ public static void main(String []args){ int[] arr={3,54,4 ...

  3. HTML中实现Table表头点击升序/降序排序

    题目:如下图,请实现表格信息的排序功能,当点击表头的属性区域,将表格信息进行排序切换功能,即第一次点击为降序排序,再一次点击进行升序排序. 姓名 力量 敏捷 智力 德鲁伊王 17 24 13 月之骑士 ...

  4. C语言:将ss所指字符串中所有下标为奇数位上的字母转换成大写,若不是字母,则不转换。-删除指针p所指字符串中的所有空白字符(包括制表符,回车符,换行符)-在带头结点的单向链表中,查找数据域中值为ch的结点,找到后通过函数值返回该结点在链表中所处的顺序号,

    //将ss所指字符串中所有下标为奇数位上的字母转换成大写,若不是字母,则不转换. #include <stdio.h> #include <string.h> void fun ...

  5. sql 中实现打乱数据的排序

    sql 中实现打乱数据的排序    order by NEWID()就实现了数据的打乱 

  6. js学习篇--数组按升序降序排列

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  7. 现在输入 n 个数字, 以逗号, 分开; 然后可选择升或者 降序排序;

    /* 现在输入 n 个数字, 以逗号, 分开: 然后可选择升或者 降序排序: */ import java.util.*; public class bycomma{ public static St ...

  8. java面试题:已知一个数组[2,4,6,2,1,5],将该数组进行排序(降序,不能用工具类进行排序),创建两条线程交替输出排序后的数组,线程名自定义

    package com.swift; import java.util.Arrays; import java.util.Comparator; public class ArrayThread_Te ...

  9. c语言-链表VS数组

    数组和链表的区别   数组是将元素在内存中连续存放,由于每个元素占用内存相同,可以通过下标迅速访问数组中任何元素.但是如果要在数组中增加一个元素,需要移动大量元素,在内存中空出一个元素的空间,然后将要 ...

随机推荐

  1. java内存模型-volatile

    volatile 的特性 当我们声明共享变量为 volatile 后,对这个变量的读/写将会很特别.理解 volatile 特性的一个好方法是:把对 volatile 变量的单个读/写,看成是使用同一 ...

  2. JSON.stringify()和JOSN.parse()

    JSON.stringify()跟JSON.parse() 终于把这两个方法搞清楚了!!! JSON.tringify():把一个json数据转化成JSON string JSON.stringify ...

  3. Pop Easy – 轻松实现模态窗口的 jQuery 插件

    PopEasy 是一款轻量的 jQuery 插件,可以帮助开发人员容易的创建效果精美的模态窗口.PopEasy 在主流浏览器中都能够正常工作,同时兼容 IE 7 哦. 您可能感兴趣的相关文章 Metr ...

  4. MontageJS:构建现代 Web App 的 HTML5 框架

    MontageJS 可以帮助您构建高可扩展性和可维护性的 HTML5 应用.有了 MontageJS,开发人员可以创建可重用的用户界面组件和模块,组件和控制器之间的绑定属性,并且同步 DOM 查询和更 ...

  5. HTML中input标签的alt属性和title属性的比较

    经常用到这两个属性,但是一直没有总结他们的区别.现在我对他们两个的用法做一下总结: 相同点:他们都会飘出一个小浮层,显示文本内容. 不同点: 1.alt只能是元素的属性,而title即可以是元素的属性 ...

  6. 【小贴士】虚拟键盘与fixed带给移动端的痛!

    前言 今天来公司的主要目的就是研究虚拟键盘与fixed的问题,期间因为同事问起闭包与事件委托(阻止冒泡)相关问题,便穿插了一篇别的: [小贴士]工作中的”闭包“与事件委托的”阻止冒泡“,有兴趣的朋友可 ...

  7. Android高级模糊技术[转]

    今天我们来更深入了解一下Android开发上的模糊技术.我读过几篇有关的文章,也在StackOverFlow上看过一些相关教程的帖子,所以我想在这里总结一下学到的东西. 为什么学习这个模糊技术? 现在 ...

  8. mysql java Cannot find the driver in the classpath!

    确保你的mysql-connector-java有没有配置好, 如何配置: 从oracle上把mysql-connector-java下下来放到java_home里面的extensions里面,然后在 ...

  9. Unity3D 面试题汇总

    最先执行的方法是: 1.(激活时的初始化代码)Awake,2.Start.3.Update[FixUpdate.LateUpdate].4.(渲染模块)OnGUI.5.再向后,就是卸载模块(TearD ...

  10. gitlab+gerrit+jenkins持续集成框架

    1.持续集成之gitlab+gerrit+jenkins 1.1. GitLab 1.1.1. 简介 GitLab 是一个使用使用Ruby on Rails搭建的,用于仓库管理系统的开源项目.使用Gi ...