面试题答案
一键面试#include <stdio.h>
#include <string.h>
// 定义学生结构体
typedef struct {
char name[50];
int score;
} Student;
// 插入排序函数,按成绩从高到低排序
void insertionSort(Student arr[], int n) {
int i, j;
Student key;
for (i = 1; i < n; i++) {
key = arr[i];
j = i - 1;
// 将成绩比key小的元素后移
while (j >= 0 && arr[j].score < key.score) {
arr[j + 1] = arr[j];
j = j - 1;
}
arr[j + 1] = key;
}
}
// 打印学生信息函数
void printStudents(Student arr[], int n) {
int i;
for (i = 0; i < n; i++) {
printf("Name: %s, Score: %d\n", arr[i].name, arr[i].score);
}
}
int main() {
Student students[] = {
{"Alice", 85},
{"Bob", 90},
{"Charlie", 80},
{"David", 95}
};
int n = sizeof(students) / sizeof(students[0]);
printf("Before sorting:\n");
printStudents(students, n);
insertionSort(students, n);
printf("\nAfter sorting:\n");
printStudents(students, n);
return 0;
}
字符串比较情况处理说明
在本题中,排序主要依据成绩进行,并未涉及字符串比较。但如果要对结构体数组按字符串(如姓名)进行排序,在C语言中可使用strcmp
函数。strcmp
函数用于比较两个字符串,其原型为int strcmp(const char *s1, const char *s2)
,如果s1
小于s2
,返回一个负整数;如果s1
等于s2
,返回0;如果s1
大于s2
,返回一个正整数。例如在插入排序中,将比较成绩的部分替换为比较字符串,修改后的代码片段如下:
while (j >= 0 && strcmp(arr[j].name, key.name) < 0) {
arr[j + 1] = arr[j];
j = j - 1;
}
这样就可以实现按字符串从大到小排序(因为这里是从高到低排序逻辑)。如果要按从小到大排序,只需将<
改为>
即可。