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

简介: 链表排序讲解: head指针指向链表的头结点,是找到整个链表的唯一依据,如果head指针丢失,整个链表就找不到了。  head存储的是第一个节点的地址,head->next存储的是第二个节点的地址;  任意一个节点p的地址,只能通过它前一个节点的next来求得。

 

链表排序讲解:

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()  也就是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; //指向下一个新开辟的结点
            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;//指向下一个节点
        }     
}

 

 

 

目录
相关文章
|
存储 程序员 编译器
C 语言中的数据类型转换:连接不同数据世界的桥梁
C语言中的数据类型转换是程序设计中不可或缺的一部分,它如同连接不同数据世界的桥梁,使得不同类型的变量之间能够互相传递和转换,确保了程序的灵活性与兼容性。通过强制类型转换或自动类型转换,C语言允许开发者在保证数据完整性的前提下,实现复杂的数据处理逻辑。
|
算法
【❤️算法笔记❤️】-每日一刷-23、合并 K 个升序链表
【❤️算法笔记❤️】-每日一刷-23、合并 K 个升序链表
220 0
|
算法 Go
【LeetCode 热题100】23:合并 K 个升序链表(详细解析)(Go语言版)
本文详细解析了 LeetCode 热题 23——合并 K 个升序链表的两种解法:优先队列(最小堆)和分治合并。题目要求将多个已排序链表合并为一个升序链表。最小堆方法通过维护节点优先级快速选择最小值,;分治合并则采用归并思想两两合并链表。文章提供了 Go 语言实现代码,并对比分析两种方法的适用场景,帮助读者深入理解链表操作与算法设计。
463 10
|
存储 监控 算法
公司监控上网软件架构:基于 C++ 链表算法的数据关联机制探讨
在数字化办公时代,公司监控上网软件成为企业管理网络资源和保障信息安全的关键工具。本文深入剖析C++中的链表数据结构及其在该软件中的应用。链表通过节点存储网络访问记录,具备高效插入、删除操作及节省内存的优势,助力企业实时追踪员工上网行为,提升运营效率并降低安全风险。示例代码展示了如何用C++实现链表记录上网行为,并模拟发送至服务器。链表为公司监控上网软件提供了灵活高效的数据管理方式,但实际开发还需考虑安全性、隐私保护等多方面因素。
302 0
公司监控上网软件架构:基于 C++ 链表算法的数据关联机制探讨
课时141:链表(数据删除)
1.数据删除的定义 2.在 ILink 接口里面追加新的删除方法 3.后续节点判断 4.完善 LinkImpl 子类中的 remove() 方法
280 0
|
存储
课时140:链表(判断数据是否存在)
在一个集合中往往会保存大量的数据,有时候会需要判断数据是否会存在。我们将使用对象比较的方式( Equals 方法)来实现这个功能。
240 0
|
索引
课时139:链表(修改指定索引数据)
现在已经可以通过索引来获取链表中的指定数据,既然可以获取数据,那么也就可以实现修改指定索引位置的数据这种常见功能。 本节将介绍如何实现这个功能。
262 0
|
存储 编译器 数据处理
C 语言结构体与位域:高效数据组织与内存优化
C语言中的结构体与位域是实现高效数据组织和内存优化的重要工具。结构体允许将不同类型的数据组合成一个整体,而位域则进一步允许对结构体成员的位进行精细控制,以节省内存空间。两者结合使用,可在嵌入式系统等资源受限环境中发挥巨大作用。
580 12
|
存储 数据管理 C语言
C 语言中的文件操作:数据持久化的关键桥梁
C语言中的文件操作是实现数据持久化的重要手段,通过 fopen、fclose、fread、fwrite 等函数,可以实现对文件的创建、读写和关闭,构建程序与外部数据存储之间的桥梁。
|
存储 数据建模 程序员
C 语言结构体 —— 数据封装的利器
C语言结构体是一种用户自定义的数据类型,用于将不同类型的数据组合在一起,形成一个整体。它支持数据封装,便于管理和传递复杂数据,是程序设计中的重要工具。