C语言链表中数组实现数据选择排序,升序、降序功能主要难点

链表排序讲解:

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
{
char ID[11]; //学生学号
char name[20];  //学生姓名

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

里面的变量均为数组

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

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

对数组之间的赋值函数是 strcpy()

升序:

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

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

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

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; //指向下一个新开辟的结点
            if ( strcmp( Back->ID,pointer->ID)>0  )  //如果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;

            if ( strcmp( Back->ID,pointer->ID)<0  ) // 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;//指向下一个节点
        }
}
时间: 2024-10-09 19:52:08

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

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

1 import java.util.Arrays;//必须加载 2 class Demo{ 3 public static void main(String []args){ 4 int[] arr={3,54,456,342,2798}; 5 System.out.println(Arrays.toString(arr));//java打印数组,排序前[3, 54, 456, 342, 2798] 6 arrSort(arr); 7 System.out.println(Arrays.toS

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

1 题目:如下图,请实现表格信息的排序功能,当点击表头的属性区域,将表格信息进行排序切换功能,即第一次点击为降序排序,再一次点击进行升序排序. 2 姓名 力量 敏捷 智力 3 德鲁伊王 17 24 13 4 月之骑士 15 22 16 5 众神之王 19 15 20 6 流浪剑客 23 15 14 7 基本思路: 8 点击将各列数值存入数组第一次点击?(className=="as"?)升序排序(className="desc")按新排列的数组的顺序,将各列赋予新值

[华为机试练习题]24.删除链表中的反复节点、剩余节点逆序输出

题目 描写叙述: 题目描写叙述: 输入一个不带头节点的单向链表(链表的节点数小于100),删除链表中内容反复的节点(反复的节点所有删除),剩余的节点逆序倒排. 要求实现函数: void vChanProcess(strNode * pstrIn,strNode * pstrOut); [输入] pstrIn:输入一个不带头节点的单向链表 [输出] pstrOut:删除内容反复的节点(反复的节点所有删除).剩余节点逆序输出(不带头节点,链表第一个节点的内存已经申请). [注意]仅仅须要完毕该函数功

[华为机试练习题]24.删除链表中的重复节点、剩余节点逆序输出

题目 描述: 题目描述: 输入一个不带头节点的单向链表(链表的节点数小于100),删除链表中内容重复的节点(重复的节点全部删除),剩余的节点逆序倒排. 要求实现函数: void vChanProcess(strNode * pstrIn,strNode * pstrOut); [输入] pstrIn:输入一个不带头节点的单向链表 [输出] pstrOut:删除内容重复的节点(重复的节点全部删除),剩余节点逆序输出(不带头节点,链表第一个节点的内存已经申请). [注意]只需要完成该函数功能算法,中

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

/* 现在输入 n 个数字, 以逗号, 分开: 然后可选择升或者 降序排序: */ import java.util.*; public class bycomma{ public static String[] splitStringByComma(String source){ if(source==null||source.trim().equals("")){ return null; } StringTokenizer commaToker = new StringToken

C语言之实现函数返回一个数组,以及选择排序,还有折半查找。这是同学的一个作业。。。

作业的具体要求如下: 编写一个完整的程序,实现如下功能.(1)    输入10个无序的整数.(2)    用选择排序法将以上接收的10个无序整数按从大到小的顺序排序.(3)    要求任意输入一个整数,用折半查找法从排好序的10个数中找出该数,若存在,在主函数中输出其所处的位置,否则,提示未找到.提示:可定义input函数完成10个整数的输入,sort函数完成输入数的排序,search函数完成输入数的査找功能. 下面是具体代码:(本人懒,没写注释,不过仔细看代码,还是很简单的) 1 #inclu

类模板,链表,直接插入排序,选择排序,起泡排序

类模板:使用户可以为类声明一种模式,使类中某些数据成员,某些成员函数的参数,某些成员函数的返回值,能取任意类型. 类模板中,类名后必须跟<模板参数标识符列表> 在主程序中定义对象时,类需说明对象是什么类型,同样用<>括号,在<>尖括号中指定所需类模板的类型. 类模板: template<模板参数表> class 类名 { 类成员声明} 在类模板以外定义成员函数,都要带上template<模板参数表>,指定成员函数属于哪个类时,模板类名后必须跟&l

JS中的冒泡排序与选择排序

1.冒泡排序 作为最简单的排序算法之一,冒泡排序的思想是,从左到右依次比较两个存储数据的大小,如果第一个数大于第二个数,就交换两个数据,这样一轮比较之后,最大的数会放在后面,这样,每次循环比较,本轮中的最大值都会排到最后,直到循环结束,实现数组升序. 动图演示如下: 代码如下: 首先定义外层循环,如果有n个数据进行循环比较,最后一次循环排序,最后两个值的大小已经确定,所以最后一个数值不需要参与循环,即n-1次,这里就是(arr.length-1) -1次: 定义内层循环,当前位i和i+1进行比较

JavaScript中的冒泡排序和选择排序

一.冒泡排序: 相邻单位数据比较,从大到小排列,多次执行,完成排序 1 var arr = [3,44,38,5,47,25,36,2,79,8,1]; 2 //定义循环次数,之前比较出的数值,不参与下一次的比较 3 for(var j = 0; j <= (arr.lenght-1) - 1 ;j++){ 4 //上一次比较出的数值,不参与下一次循环 5 for(var i = 0;i<= (arr.lenght-1) - 1;i++){ 6 //内层循环,每次循环比较一个最大值,然后交换位