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;//指向下一个节点
        }     
}

 

 

 

目录
相关文章
|
19天前
|
存储 算法 C语言
【C语言】深入浅出:C语言链表的全面解析
链表是一种重要的基础数据结构,适用于频繁的插入和删除操作。通过本篇详细讲解了单链表、双向链表和循环链表的概念和实现,以及各类常用操作的示例代码。掌握链表的使用对于理解更复杂的数据结构和算法具有重要意义。
144 6
|
19天前
|
传感器 算法 安全
【C语言】两个数组比较详解
比较两个数组在C语言中有多种实现方法,选择合适的方法取决于具体的应用场景和性能要求。从逐元素比较到使用`memcmp`函数,再到指针优化,每种方法都有其优点和适用范围。在嵌入式系统中,考虑性能和资源限制尤为重要。通过合理选择和优化,可以有效提高程序的运行效率和可靠性。
63 6
|
23天前
|
存储 缓存 算法
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式,强调了合理选择数据结构的重要性,并通过案例分析展示了其在实际项目中的应用,旨在帮助读者提升编程能力。
44 5
|
23天前
|
存储 程序员 编译器
C 语言数组与指针的深度剖析与应用
在C语言中,数组与指针是核心概念,二者既独立又紧密相连。数组是在连续内存中存储相同类型数据的结构,而指针则存储内存地址,二者结合可在数据处理、函数传参等方面发挥巨大作用。掌握它们的特性和关系,对于优化程序性能、灵活处理数据结构至关重要。
|
27天前
|
存储 C语言 计算机视觉
在C语言中指针数组和数组指针在动态内存分配中的应用
在C语言中,指针数组和数组指针均可用于动态内存分配。指针数组是数组的每个元素都是指针,可用于指向多个动态分配的内存块;数组指针则指向一个数组,可动态分配和管理大型数据结构。两者结合使用,灵活高效地管理内存。
|
27天前
|
存储 NoSQL 编译器
C 语言中指针数组与数组指针的辨析与应用
在C语言中,指针数组和数组指针是两个容易混淆但用途不同的概念。指针数组是一个数组,其元素是指针类型;而数组指针是指向数组的指针。两者在声明、使用及内存布局上各有特点,正确理解它们有助于更高效地编程。
|
1月前
|
存储 人工智能 算法
数据结构实验之C 语言的函数数组指针结构体知识
本实验旨在复习C语言中的函数、数组、指针、结构体与共用体等核心概念,并通过具体编程任务加深理解。任务包括输出100以内所有素数、逆序排列一维数组、查找二维数组中的鞍点、利用指针输出二维数组元素,以及使用结构体和共用体处理教师与学生信息。每个任务不仅强化了基本语法的应用,还涉及到了算法逻辑的设计与优化。实验结果显示,学生能够有效掌握并运用这些知识完成指定任务。
51 4
|
19天前
|
存储 C语言 开发者
【C语言】字符串操作函数详解
这些字符串操作函数在C语言中提供了强大的功能,帮助开发者有效地处理字符串数据。通过对每个函数的详细讲解、示例代码和表格说明,可以更好地理解如何使用这些函数进行各种字符串操作。如果在实际编程中遇到特定的字符串处理需求,可以参考这些函数和示例,灵活运用。
39 10
|
19天前
|
存储 程序员 C语言
【C语言】文件操作函数详解
C语言提供了一组标准库函数来处理文件操作,这些函数定义在 `<stdio.h>` 头文件中。文件操作包括文件的打开、读写、关闭以及文件属性的查询等。以下是常用文件操作函数的详细讲解,包括函数原型、参数说明、返回值说明、示例代码和表格汇总。
42 9
|
19天前
|
存储 Unix Serverless
【C语言】常用函数汇总表
本文总结了C语言中常用的函数,涵盖输入/输出、字符串操作、内存管理、数学运算、时间处理、文件操作及布尔类型等多个方面。每类函数均以表格形式列出其功能和使用示例,便于快速查阅和学习。通过综合示例代码,展示了这些函数的实际应用,帮助读者更好地理解和掌握C语言的基本功能和标准库函数的使用方法。感谢阅读,希望对你有所帮助!
31 8