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
{
]; //学生学号
]; //学生姓名
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语言链表中数组实现数据选择排序,升序、降序功能主要难点的更多相关文章
- 【java】实体类中 按照特定的字段 进行升序/降序 排序
背景: 实际页面上 所有的分值都是按照JSON格式存储在一个字符串中 存储在同一个字段中: {"ownPTotal":"10>0","ownO ...
- java中的选择排序之降序排列
import java.util.Arrays;//必须加载 class Demo{ public static void main(String []args){ int[] arr={3,54,4 ...
- HTML中实现Table表头点击升序/降序排序
题目:如下图,请实现表格信息的排序功能,当点击表头的属性区域,将表格信息进行排序切换功能,即第一次点击为降序排序,再一次点击进行升序排序. 姓名 力量 敏捷 智力 德鲁伊王 17 24 13 月之骑士 ...
- C语言:将ss所指字符串中所有下标为奇数位上的字母转换成大写,若不是字母,则不转换。-删除指针p所指字符串中的所有空白字符(包括制表符,回车符,换行符)-在带头结点的单向链表中,查找数据域中值为ch的结点,找到后通过函数值返回该结点在链表中所处的顺序号,
//将ss所指字符串中所有下标为奇数位上的字母转换成大写,若不是字母,则不转换. #include <stdio.h> #include <string.h> void fun ...
- sql 中实现打乱数据的排序
sql 中实现打乱数据的排序 order by NEWID()就实现了数据的打乱
- js学习篇--数组按升序降序排列
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 现在输入 n 个数字, 以逗号, 分开; 然后可选择升或者 降序排序;
/* 现在输入 n 个数字, 以逗号, 分开: 然后可选择升或者 降序排序: */ import java.util.*; public class bycomma{ public static St ...
- java面试题:已知一个数组[2,4,6,2,1,5],将该数组进行排序(降序,不能用工具类进行排序),创建两条线程交替输出排序后的数组,线程名自定义
package com.swift; import java.util.Arrays; import java.util.Comparator; public class ArrayThread_Te ...
- c语言-链表VS数组
数组和链表的区别 数组是将元素在内存中连续存放,由于每个元素占用内存相同,可以通过下标迅速访问数组中任何元素.但是如果要在数组中增加一个元素,需要移动大量元素,在内存中空出一个元素的空间,然后将要 ...
随机推荐
- iOS安全笔记
这一篇文章, 加上里面链接的几篇文章(一个百度的, 两个阮一峰的), 全看完应该了解得差不多了 如何打造一个安全的App?这是每一个移动开发者必须面对的问题.在移动App开发领域,开发工程师对于安全方 ...
- 自己总结的web前端知识体系大全【欢迎补充】
1. 前言 大约在几个月之前,让我看完了<webkit技术内幕>这本书的时候,突然有了一个想法.想把整个web前端开发所需要的知识都之中在一个视图中,形成一个完整的web前端知识体系,目的 ...
- 钉钉客户端JS-API权限签名算法.NET版
前段时间写了一篇博文<钉钉如何进行PC端开发>,在里面并未解决本地生成签名的问题,需要到官网进行生成,由于钉钉门票等认证信息会超期,因此,必须能本地用代码自动更新相关参数信息,来换取签名. ...
- Quartz.NET开源作业调度框架系列(二):CronTrigger
CronTriggers比SimpleTrigger更加的灵活和有用,对于比较复杂的任务触发规则,例如"每个星期天的晚上12:00"进行备份任务,SimpleTrigger就不能胜 ...
- 20款免费响应式的 HTML5 网站模板下载
今天这篇文章给大家带来的是20款免费响应式的 HTML5 网站模板,大家可以借助这些优秀的网站模板创建自己的优秀网站.响应式(Responsive Design)设计的目标是要让产品界面能够响应用户的 ...
- Trianglify - 生成五彩缤纷的 SVG 背景图案
Trianglify 是一个能够生成五颜六色的三角形图案的 JavaScript 库,可以用来作为 SVG 图像和 CSS 背景.它的灵感来自于 Btmills 的 Geopattern,并使用 d3 ...
- ae 打开地图文档
if (openMxdDialog.ShowDialog() == DialogResult.OK) { pathMXD = openMxdDialog.FileName; if (pathMXD ! ...
- 数据连接到 Web 服务 InfoPath 2010 窗体中的 SharePoint 服务器上运行时的错误消息:"401-未经授权"解决方案
症状: 请考虑以下情形: Web 窗体发布到 SharePoint 服务器. 您创建 Microsoft InfoPath 2010 表单所在的 SharePoint 服务器上使用到位于数据的数据连接 ...
- 关于web软件信息安全问题防护资料的整理(二)
想要做好软件的安全防护,首先就得了解web系统的安全威胁,那么web系统都存在哪些威胁呢? 应用层攻击.网络层攻击和混合攻击. 传统被动.单点以及彼此孤立的防护手段已不能应对越来越严峻的安全威胁. 改 ...
- [SQL] SQL Server 触发器
触发器是一种特殊类型的存储过程,它不同于之前的我们介绍的存储过程.触发器主要是通过事件进行触发被自动调用执行的.而存储过程可以通过存储过程的名称被调用. Ø 什么是触发器 触发器对表进行插入.更新.删 ...