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