开发者社区> 小波linux> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

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

 

 

 

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
【数据结构】链表 (4000+字超级详细 图文结合)C语言
链表是多个节点通过结构体的next指针实现逻辑结构的链接次序的,我们通常表示链表是用一个指针进行表示的,这个指针指向的就是链表的头结点。通过这个头结点地址,我们可以实现对链表的遍历等其它操作。
0 0
《C语言程序入门——链表基础知识》单、双向链表概念、链表与数组优缺点1.1.6
{Type data;}Node;此处的Type data;是数据部分,用于保存该节点的实际数据。是地址部分,保存的是下一个节点的地址。
0 0
《C语言数据结构》———链表进阶之双向链表
《C语言数据结构》———链表进阶之双向链表
0 0
[C语言 / 数据结构初阶]链表初阶
[C语言 / 数据结构初阶]链表初阶
0 0
【C语言数据结构4】-- 链表的实现
链表是线性表的一种,同顺序表一样,都是最基础的线性表。与顺序表的区别在于使用了不同存储结构实现,顺序表使用顺序存储结构,而链表使用链式存储结构。
0 0
《数据结构》c语言版学习笔记——其他链表(线性表的链式存储结构Part2)
《数据结构》c语言版学习笔记——其他链表(线性表的链式存储结构Part2)
0 0
C语言——约瑟夫环问题(链表解决)
问题描述:编号为 1-N 的 N 个士兵围坐在一起形成一个圆圈,从编号为 1 的士兵开始依次报数(1,2,3…这样依次报),数到 m 的 士兵会被杀死出列,之后的士兵再从 1 开始报数。直到最后剩下一士兵,求这个士兵的编号。
0 0
最最容易实现的链表结构——双向链表(数据结构C语言实现4)
最最容易实现的链表结构——双向链表(数据结构C语言实现4)
0 0
手把手教你实现链表—单链表(数据结构C语言实现3)
手把手教你实现链表—单链表(数据结构C语言实现3)
0 0
+关注
小波linux
嵌入式系统软件/硬件工程师
文章
问答
文章排行榜
最热
最新
相关课程
更多
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载