为之不止 发表于 2019-6-8 16:17:21

如何用 单链表 做 选择排序

我想用单链表做学生成绩管理系统

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


其中,管理系统需要实现:按总评成绩高低排序 功能
我想在不改变原序列基础上排序
有人说可以用选择排序,把选出来的写入新的链表,最后新链表就是有序的,这个时候打印完新的链表,再将新链表销毁就可以了
但是我不懂怎么用单链表实现选择排序
特来求教

Seawolf 发表于 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);
   }

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

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

return(0);
}

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

scau_pdc 发表于 2019-6-8 22:04:21

666

Seawolf 发表于 2019-6-12 11:47:46

你可以参考这段代码,当学生名成绩不同时,按照成绩高低来排列,当学生成绩相同时,按照学生姓名的字母顺序来排列
typedef struct
{
      char last_name;
      int stu_id;
      char grade;
} student;

student input = {
{"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.last_name,input.stu_id,input.grade);
    }
    printf("\n----------------------------\n");
    qsort(input,5,sizeof(student),cmpstudents);
    for (i=0;i<5;i++)
    {
       printf("%s\t%d\t%c\n",input.last_name,input.stu_id,input.grade);
    }

    return 0;
}

为之不止 发表于 2019-6-13 00:06:54

Seawolf 发表于 2019-6-12 11:47
你可以参考这段代码,当学生名成绩不同时,按照成绩高低来排列,当学生成绩相同时,按照学生姓名的字母顺序 ...

非常感谢您的回答,可是,我没看懂::>_<::,第35行的qsort函数是从哪里来的?

为之不止 发表于 2019-6-13 00:40:48

Seawolf 发表于 2019-6-13 00:14
qsort是c语言内置的快速排序函数,来自于 C 标准库 -

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


{:5_106:}总算懂了,感激涕零无以言表,请受小弟一拜{:5_100:}

Seawolf 发表于 2019-6-20 03:55:14

为之不止 发表于 2019-6-13 00:40
总算懂了,感激涕零无以言表,请受小弟一拜

不客气
页: [1]
查看完整版本: 如何用 单链表 做 选择排序