/**
*    实验题目:
*        实现学生信息的多关键字排序
*    实验目的:
*        掌握基数排序算法设计及其应用
*    实验内容:
*        假设有很多学生记录,每个学生记录包含姓名、性别和班号,
*    设计一个算法,按班号、性别有序输出,即先按班号输出,同一个
*    班的学生按性别输出。班号为1001~1030。编写程序,实现上述功能。
*/

#include <stdio.h>
#include <malloc.h>
#include <string.h>

#define MAXR        10
#define MAX_SIZE    10

typedef struct node
{
    char xm[10];                            //  姓名
    char xb;                                //  性别  m:男 f:女
    char bh[6];                             //  班号
    struct node *next;                      //  指向下一个结点的指针
}stud_node;                                 //  学生单链表结点类型

typedef struct
{
    char xm[10];                            //  姓名
    char xb;                                //  性别  m:男 f:女
    char bh[6];                             //  班号
}stud_type;                                 //  学生记录类型

/**
*   功能:
*       由学生记录数组students创建单链表p
*
*/
static void create_link(stud_node *&p, stud_type students[], int n)     //  指针的引用
{
    int i;
    stud_node *s, *t;

p = NULL;
    for(i = 0; i < n; i++)
    {
        s = (stud_node *)malloc(sizeof(stud_node));                     //  动态分配存储空间(新创建的结点)
        strcpy(s->xm, students[i].xm);
        s->xb = students[i].xb;
        strcpy(s->bh, students[i].bh);
        if(p == NULL)
        {
            p = s;                                                      //  p和t指向新创建的结点
            t = s;
        }
        else
        {
            t->next = s;                                                //  采用尾插法建立单链表
            t = s;                                                      //  t指向新创建的结点
        }
    }
    t->next = NULL;                                                     //  尾结点的next域置为NULL
}

/*------------输出学生单链表p--------------*/
static void disp_link(stud_node *p)
{
    int i = 0;

while(p != NULL)
    {
        printf(" %s(%s,%c)", p->xm, p->bh, p->xb);
        p = p->next;
        if((i + 1) % 5 == 0)            // 显示5个数据为一行
            printf("\n");
        i++;
    }
    printf("\n");
}

/*------------销毁学生单链表p--------------*/
static void destroy_link(stud_node *p)
{
    stud_node *pre = p, *q = pre->next;

while(q != NULL)
    {
        free(pre);
        pre = q;
        q = q->next;
    }
    free(pre);
}

/**
*   功能:
*       对性别进行排序,只需进行一趟
*   @param: p为待排序序列链表指针
*   @param: r为基数
*   @param: d为关键字位数
*/
static void sort_by_xb(stud_node *&p, int r, int d)     //  指针的引用
{
    stud_node *head[MAXR], *tail[MAXR], *t;             //  定义各链队的首尾指针
    int j;                                              //  循环变量
    int k;                                              //  区分链队    女:k=0,男:k=1

printf("按性别排序\n");
    for(j = 0; j < r; j++)                              //  初始化各链队首、尾指针
    {
        head[j] = tail[j] = NULL;
    }

while(p != NULL)                                    //  对于原链表中每个结点循环
    {
        if(p->xb == 'f')                                //  找第k个链队
        {
            k = 0;
        }
        else
        {
            k = 1;
        }

if(head[k] == NULL)                             //  进行分配,即采用尾插法建立单链表
        {
            head[k] = p;
            tail[k] = p;
        }
        else
        {
            tail[k]->next = p;
            tail[k] = p;
        }
        p = p->next;                                    //  取下一个待排序的元素
    }

p = NULL;
    for(j = 0; j < r; j++)                              //  对每一个链队循环
    {
        if(head[j] != NULL)
        {
            if(p == NULL)
            {
                p = head[j];
                t = head[j];
            }
            else
            {
                t->next = head[j];
                t = tail[j];
            }
        }
    }
    t->next = NULL;                                     //  最后一个结点的next域置为NULL
    disp_link(p);                                       //  输出单链表
}

/**
*   功能:
*       对班号进行排序
*   @param: p为待排序序列链表指针
*   @param: r为基数
*   @param: d为关键字位数
*/
static void sort_by_bh(stud_node *&p, int r, int d)         //  指针的引用
{
    stud_node *head[MAXR], *tail[MAXR], *t;                 //  定义各链队的首尾指针
    int i, j;                                               //  循环变量
    int k;                                                  //  k区分链队

printf("按班号排序\n");
    for(i = 3; i >= 2; i--)                                 //  从低位到高位做d趟排序
    {
        for(j = 0; j < r; j++)                              //  初始化各链队首尾指针
        {
            head[j] = tail[j] = NULL;
        }
        while(p != NULL)                                    //  对于原链表中每个结点循环
        {
            k = p->bh[i] - '0';                             //  找第k个链队
            if(head[k] == NULL)                             //  进行分配,即采用尾插法建立单链表
            {
                head[k] = p;
                tail[k] = p;
            }
            else
            {
                tail[k]->next = p;
                tail[k] = p;
            }

p = p->next;                                    //  取下一个待排序的元素
        }
        p = NULL;
        for(j = 0; j < r; j++)                              //  对每一个链队循环
        {
            if(head[j] != NULL)
            {
                if(p == NULL)
                {
                    p = head[j];
                    t = tail[j];
                }
                else
                {
                    t->next = head[j];
                    t = tail[j];
                }
            }
        }
        t->next = NULL;                                     //  最后一个结点的next域置为NULL
        printf(" 第%d趟:\n", d - i + 2);
        disp_link(p);                                       //  输出单链表
    }
}

/**
*   功能:
*       按班号和性别排序
*       在班号和性别中,班号优先,性别次之,所以先按
*   性别排序,然后再按班号排序。由于班号4位中只有后
*   两位不同,故d=2,从低位到高位排序。
*/
static void sort_stus(stud_type students[], int n)
{
    stud_node *p;

create_link(p, students, n);
    printf("排序前:\n");
    disp_link(p);
    sort_by_xb(p, 2, 1);                    //  按照性别排序
    sort_by_bh(p, 10, 2);                   //  按照班号的后两位排序
    printf("排序后:\n");
    disp_link(p);
    destroy_link(p);
}

int main(void)
{
    int n = 10;
    //  定义结构体数组并初始化
    stud_type students[MAX_SIZE] = {
        {"王华", 'm', "1003"}, {"陈兵", 'm', "1020"},
        {"许可", 'f', "1022"}, {"李英", 'f', "1003"},
        {"张冠", 'm', "1021"}, {"陈强", 'm', "1002"},
        {"李真", 'f', "1002"}, {"章华", 'm', "1001"},
        {"刘丽", 'f', "1021"}, {"王强", 'm', "1022"},
    };

sort_stus(students, n);

return 0;
}

实现学生信息的多关键字排序相关推荐

  1. python循环输入若干学生信息保存到字典、并按学号排序,Python实现按学生年龄排序的实际问题详解...

    怎样用python进行年龄分段并且分享和排序?小编努力地向远方,站在高处,曾经是为了让你一眼看见小编,后来为了可以看见更多的人. ,怎样用最简单的Python语言将具体的年纪进行分段并且统计各年龄段d ...

  2. 定义一个学生信息结构体,包含姓名,学号,语文成绩、数学成绩,和英语成绩,定义结构体数组存放不同学生的信息,可以在终端录入学生的信息,在基础上添加一个计算平均值和按照平均值排序以及删除指定学号的学生信息

    1. 代码如下: 头文件  chx.h #include<stdio.h> #include<string.h>struct chx{char name[128];int sn ...

  3. 一夜之间就能肝完的学生信息管理系统

    只要一个晚上?信息管理系统?对滴,你没有看错.就是一个晚上.如果你很闲的话,如果你还在无所事事的话,如果你还不懂基于MFC编程的话,请花一个晚上的时间(也可以花更多的时间),认真阅读这篇博客,并肝它. ...

  4. c语言mysql 学生信息管理系统_学生信息管理系统学生时代小作品源码(C语言版)...

    /*****************************************************************************/ /* 制作一个学籍管理系统:要求包含以下 ...

  5. 学生信息管理系统实习报告(java版数据结构)

    一. 问题分析 1.1 什么是学生信息管理系统以及研究意义 学生信息管理系统是校园网络中一个重要的应用系统,它大大改善了学校教学.科研与管理的基础环境,在一定程度上反映出学校管理现代化的水平.信息管理 ...

  6. C语言——学生信息管理系统

    目录 功能展示 界面展示 所有功能模块: 功能1:菜单模块(显示功能菜单) 功能2:增加学生信息 功能3:输出学生信息(查看所有学习信息) 功能4:修改学生信息 功能5:删除学生信息 功能6:查询单个 ...

  7. 赶紧进来看看--用C语言实现学生信息管理系统(1.0静态版)

    本文介绍了用C语言实现学生信息管理系统设计,主要包括对学生信息增删查改.分类统计.排序等功能,文章最后有全部源码展示- C语言实现学生信息管理系统--1.0静态版 一.学生信息管理系统介绍 二.实现学 ...

  8. 基于JAVA实现的简易学生信息管理系统(附源码)

    一.前言 最近在学习JAVA,这几天跟着网上的视频学完基础知识之后,做了一个学生信息管理系统,写的比较普通,没太大亮点,希望可以给初学者一些参考经验,另外,如有不恰当的地方还请各位指正! 学生信息管理 ...

  9. 赶紧进来看看---C语言实现学生信息管理系统(3.0文件存储版)

    本文主要介绍了将学生信息管理系统改造为文件存储版本- 主要涉及文件操作函数–将学生信息导入文件和从文件读取学生信息到程序中,从而达到数据持久化的效果 文章最后有源码展示 学生信息管理系统1.0静态版- ...

最新文章

  1. HTML中的link的简单介绍和用法
  2. 温度对结构光深度的影响
  3. php 正则去除script,javascript正则实现php中的加入和去除反斜杠函数效果
  4. python使用elasticsearch_python中使用ElasticSearch(二)
  5. vue移动端html5页面根据屏幕适配的四种解决方法
  6. 【java】java AQS AbstractQueuedSynchronizer 实现自定义锁以及相关简介
  7. 【hive】如何设置hive以及MapReduce的压缩方式?
  8. linux内核编译,内核参数修改
  9. Fedora Linux虚拟机常用开发工具
  10. 最新消息:苹果M1芯片为何如此之快?
  11. bat 设置变量带中文
  12. 在C#中列出进程,杀掉进程。
  13. nms网关服务器日常维护,ZXB10-NMS网管解决方案
  14. windows已经阻止此应用 如何解决(非专业版系统)
  15. 原来勾股定理可以这样证!
  16. 华清远见重庆中心学习-受控组件,非受控组件
  17. 做跨境电商需要哪些准备?
  18. SDIO Host层驱动
  19. 外设测试 - FAN 接口测试
  20. 机器学习第四课:SVM前置知识点(凸优化问题)

热门文章

  1. WebStorm设置编辑器背景图片
  2. 提升树(Boosting tree)算法总结
  3. Html+JavaScript+Css 二手车价格评估系统设计开发
  4. which java 找不到jdk_一、查看Jdk的安装路径:whereis javawhich java (java执行路径)echo $JAVA_HOMEecho $PATH备注:如...
  5. Matlab中regress函数各参数解释
  6. 服务器真实ip怎么隐藏?
  7. VMware用技术浇灌生态之花
  8. python 请假审批系统_菜鸟也要懂点设计模式|用Python设计一个请假模式
  9. ps教程:教你如何制作一种漂亮的银色金属字体
  10. python3 规则引擎_Ilog、Drools、Jess规则引擎的Rule Language 对比