鱼C论坛

 找回密码
 立即注册
查看: 1696|回复: 6

[已解决]如何用 单链表 做 选择排序

[复制链接]
发表于 2019-6-8 16:17:21 | 显示全部楼层 |阅读模式
10鱼币
我想用单链表做学生成绩管理系统

下面是我的结构体
struct Student                                        //声明结构体类型
{
    char xuehao[8];     //学号
        char name[8];       //姓名
        char kecheng[8];    //课程
        int day_grade;      //平时成绩
        int shiyan_grade;   //实验成绩
        int kaoshi_grade;   //考试成绩
        int end_grade;                //总评成绩
        struct Student *next;
};

其中,管理系统需要实现:按总评成绩高低排序 功能
我想在不改变原序列基础上排序
有人说可以用选择排序,把选出来的写入新的链表,最后新链表就是有序的,这个时候打印完新的链表,再将新链表销毁就可以了
但是我不懂怎么用单链表实现选择排序
特来求教
最佳答案
2019-6-8 16:17:22
qsort是c语言内置的快速排序函数,来自于 C 标准库 - <stdlib.h>
void qsort(void *base, size_t nitems, size_t size, int (*compar)(const void *, const void*))
base -- 指向要排序的数组的第一个元素的指针。
nitems -- 由 base 指向的数组中元素的个数。
size -- 数组中每个元素的大小,以字节为单位。
compar -- 用来比较两个元素的函数。
这里有一个例子:
#include <stdio.h>
#include <stdlib.h>

int values[] = {34, 423, 545, 75, 7 };

int cmpfunc (const void * a, const void * b)
{
   return ( *(int*)a - *(int*)b );
}

int main()
{
   int n;

   printf("排序之前的列表:\n");
   for( n = 0 ; n < 5; n++ ) {
      printf("%d ", values[n]);
   }

   qsort(values, 5, sizeof(int), cmpfunc);

   printf("\n排序之后的列表:\n");
   for( n = 0 ; n < 5; n++ ) {
      printf("%d ", values[n]);
   }
  
  return(0);
}

运行结果:
排序之前的列表:
 34 423 545 75 7 
排序之后的列表:
 7 34 75 423 545 

最佳答案

查看完整内容

qsort是c语言内置的快速排序函数,来自于 C 标准库 - base -- 指向要排序的数组的第一个元素的指针。 nitems -- 由 base 指向的数组中元素的个数。 size -- 数组中每个元素的大小,以字节为单位。 compar -- 用来比较两个元素的函数。 这里有一个例子: 运行结果:
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-6-8 16:17:22 | 显示全部楼层    本楼为最佳答案   
qsort是c语言内置的快速排序函数,来自于 C 标准库 - <stdlib.h>
void qsort(void *base, size_t nitems, size_t size, int (*compar)(const void *, const void*))
base -- 指向要排序的数组的第一个元素的指针。
nitems -- 由 base 指向的数组中元素的个数。
size -- 数组中每个元素的大小,以字节为单位。
compar -- 用来比较两个元素的函数。
这里有一个例子:
#include <stdio.h>
#include <stdlib.h>

int values[] = {34, 423, 545, 75, 7 };

int cmpfunc (const void * a, const void * b)
{
   return ( *(int*)a - *(int*)b );
}

int main()
{
   int n;

   printf("排序之前的列表:\n");
   for( n = 0 ; n < 5; n++ ) {
      printf("%d ", values[n]);
   }

   qsort(values, 5, sizeof(int), cmpfunc);

   printf("\n排序之后的列表:\n");
   for( n = 0 ; n < 5; n++ ) {
      printf("%d ", values[n]);
   }
  
  return(0);
}

运行结果:
排序之前的列表:
 34 423 545 75 7 
排序之后的列表:
 7 34 75 423 545 
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-6-8 22:04:21 | 显示全部楼层
666
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-6-12 11:47:46 | 显示全部楼层
你可以参考这段代码,当学生名成绩不同时,按照成绩高低来排列,当学生成绩相同时,按照学生姓名的字母顺序来排列
typedef struct 
{
        char last_name[25];
        int stu_id;
        char grade;
} student;

student input[5] = {
 {"xiaoming",910017,'A'},
 {"xiaoli",934422,'C'},
 {"xiaozhang",878766,'B'},
 {"xiaowang",123456,'D'},
 {"xiaofang",989420,'A'}
};

static int cmpstudents(const void *p1, const void *p2)
{
    student *l = (student *)p1;
    student *r = (student *)p2;
    if (l->grade==r->grade)
    {
        return strcmp(l->last_name,r->last_name);
    }
    return (l->grade > r->grade)?(1):(-1);
}

int main ()
{
    int i;
    for (i=0;i<5;i++)
    {
       printf("%s\t%d\t%c\n",input[i].last_name,input[i].stu_id,input[i].grade);
    }
    printf("\n----------------------------\n");
    qsort(input,5,sizeof(student),cmpstudents);
    for (i=0;i<5;i++)
    {
       printf("%s\t%d\t%c\n",input[i].last_name,input[i].stu_id,input[i].grade);
    }

    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-6-13 00:06:54 | 显示全部楼层
Seawolf 发表于 2019-6-12 11:47
你可以参考这段代码,当学生名成绩不同时,按照成绩高低来排列,当学生成绩相同时,按照学生姓名的字母顺序 ...

非常感谢您的回答,可是,我没看懂::>_<::,第35行的qsort函数是从哪里来的?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-6-13 00:40:48 | 显示全部楼层
Seawolf 发表于 2019-6-13 00:14
qsort是c语言内置的快速排序函数,来自于 C 标准库 -

base -- 指向要排序的数组的第一个元素的指针。

总算懂了,感激涕零无以言表,请受小弟一拜
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-6-20 03:55:14 | 显示全部楼层
为之不止 发表于 2019-6-13 00:40
总算懂了,感激涕零无以言表,请受小弟一拜

不客气
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-3 21:23

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表