首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

请问:结构体数组的元素可以排序吗

2013-10-27 
请教:结构体数组的元素可以排序吗?请问可以将结构体数组的元素加以排序?例如,我想将学生信息按照期末考试

请教:结构体数组的元素可以排序吗?
    请问可以将结构体数组的元素加以排序?例如,我想将学生信息按照期末考试卷面成绩进行排序。先定义以下结构体并声明该结构体的数组,

#include <stdio.h>

#define LEN 21
#define MAX 10

struct stu_info
{
    char name[LEN];
    float marks;
};

int main(void)
{
    struct stu_info data[MAX];
    int cnt = 0,i,j;

   //假如学生的信息已经都输入好了,接下来应该如何根据学生的分数对数组元素进行从大到小的排序呢?
    puts("\nInput students' names (press Enter at the beginning of a line to stop)");
    while(cnt < MAX && gets(data[cnt].name) != NULL && data[cnt].name[0] != '\0')
   {
       printf("Enter students' marks: ");
       scanf("%d", &data[i].marks);
       cnt++;
   }
  
  // 请告知如何排序

   // ......
 
  //排序之后打印结果
     if(cnt != 0)
     {
       puts("\nStudents' info in the order of their marks:");
       for(i = 0; i < cnt; i++)
          printf("%s: %d\n", data[i].name, data[i].marks);
     }
     else
        puts("\nNo data input.");

    puts("\nBye!");
    
    return 0;

}


我自己试过用指针,但达不到效果。请问应该如何实现?谢谢! 结构 struct 指针 c
[解决办法]
引用:
    请问可以将结构体数组的元素加以排序?例如,我想将学生信息按照期末考试卷面成绩进行排序。先定义以下结构体并声明该结构体的数组,

#include <stdio.h>

#define LEN 21
#define MAX 10

struct stu_info
{
    char name[LEN];
    float marks;
};

int main(void)
{
    struct stu_info data[MAX];
    int cnt = 0,i,j;

   //假如学生的信息已经都输入好了,接下来应该如何根据学生的分数对数组元素进行从大到小的排序呢?
    puts("\nInput students' names (press Enter at the beginning of a line to stop)");
    while(cnt < MAX && gets(data[cnt].name) != NULL && data[cnt].name[0] != '\0')
   {
       printf("Enter students' marks: ");
       scanf("%d", &data[i].marks);
       cnt++;
   }
  
  // 请告知如何排序

   // ......
 
  //排序之后打印结果
     if(cnt != 0)
     {
       puts("\nStudents' info in the order of their marks:");
       for(i = 0; i < cnt; i++)
          printf("%s: %d\n", data[i].name, data[i].marks);
     }
     else
        puts("\nNo data input.");

    puts("\nBye!");
    
    return 0;

}


我自己试过用指针,但达不到效果。请问应该如何实现?谢谢!

当然可以了 参考我写的程序 不懂再问

#include <stdio.h>
#include <stdlib.h>

//【样例输入】
//4
//3 22 21
//3 21 22
//3 22 22
//3 21 21
//【样例输出】
//3 21 21
//3 21 22
//3 22 21
//3 22 22
#define MAX_SIZE 1024
struct get_time{
    int  Hour;
    int  Minute;
    int  Second;
};

void deal(struct get_time  *elem,int size)
{
  struct get_time tmp;
      int i, j;
    for (i = 0; i < size; i++) {


    for (j = size - 1; j > i; j--) {

        if (elem[j].Hour < elem[j-1].Hour 
[解决办法]
elem[j].Minute < elem[j-1].Minute
[解决办法]
elem[j].Second < elem[j-1].Second ) {
            tmp = elem[j-1];
                elem[j-1] =  elem[j];
                elem[j] = tmp;
                        }
            }
        }
}

int main()
{
    struct get_time answer[MAX_SIZE];
    int i;
    int num;
    scanf("%d",&num);
    for(i = 0 ; i < num ; i++)
    {
     scanf("%d %d %d",&answer[i].Hour,&answer[i].Minute,&answer[i].Second);
    }
    printf("\n");
    deal(answer,num);
     for(i = 0 ; i < num ; i++)
     printf("%d %d %d\n",answer[i].Hour,answer[i].Minute,answer[i].Second);
    return 0;
}


[解决办法]

利用库函数qsort,对指针排序:
int comparefloat(float a,float b)
{
    if(a == b)return 0;
    if(a > b )return 1;
    return -1;     
}

int cmpByPtr(const void* arg1,const void *arg2)
{
        return comparefloat( (*( struct stu_info **)arg1)->marks,
                    (*( struct stu_info **)arg2)->marks);
}
// 比较指针
int main(){
struct stu_info *pInfo[MAX];
for(int i=0;i<MAX;i++)pInfo[i] =data +i;
........
qsort(pInfo,MAX,sizeof(struct stu_info *),cmpByPtr);
.......
   for(i = 0; i < cnt; i++)
          printf("%s: %d\n", pInfo[i]->name, pInfo[i]->marks);
   rturn 0;
}

利用库函数qsort,对数据排序:

.....
int comparefloat(float a,float b)
{
    if(a == b)return 0;
    if(a > b )return 1;
    return -1;     
}

int cmpByData(const void* arg1,const void *arg2)
{
        return comparefloat( (( struct stu_info *)arg1)->marks,
                    (( struct stu_info *)arg2))->marks );
}

// 比较数据
int main(){

........
qsort(data,MAX,sizeof(struct stu_info *),cmpByData);
.......
   for(i = 0; i < cnt; i++)
          printf("%s: %d\n", data[i]->name, data[i]->marks);
   rturn 0;
}



PS:
如果需要自己学排序,仿此。
[解决办法]
你只需要定义规则  不申请额外空间的原地排序就是交换位置而已
[解决办法]
使用qsort系统函数即可。
首先定义自己的比较函数,例如:
int cmp(void* a ,void *b)
{
    return (((stu_info* )a)->marks - ((stu_info *)b)->marks);
}
然后调用qsort,调用过后数组data中的数组元素已经排好序了。
qsort(data ,MAX ,sizeof(stu_info) ,cmp);  // data:要处理的数组首地址;MAX:要处理的数组元素个数;sizeof(stu_info):数组单个元素大小;cmp:比较函数
[解决办法]
既然定义了结构体数组 我的想法是这样的 对stu_info这个结构体内的元素 data[i].marks比较大小 然后根据下标来改变整个数组的顺序 其他的就和一般的排序算法没区别了 注意 marks是float型的

热点排行