用c语言对若干个学生的姓名(汉字)进行从小到大排序(即字典顺序,适合用字符串处理库函数处理),键盘接收输入的学生个数,假设学生姓名最长不超过20个汉字(一个汉字2个字节),依次输入所有姓名后,输出排序后的学生姓名。请编写程序实现上述功能,既要省时又要省空间
时间: 2024-02-21 22:01:54 浏览: 102
好的,我会为您提供一个基于选择排序的简单实现,使用了字符串处理库函数来比较字符串大小,同时利用指针来实现省空间。
```c
#include <stdio.h>
#include <string.h>
#define MAX_STUDENTS 100
#define MAX_NAME_LENGTH 21 // 包括字符串结束符
void sort_names(char *names[], int n);
int main() {
char *names[MAX_STUDENTS];
int n;
printf("请输入学生个数:");
scanf("%d", &n);
printf("请输入所有学生的姓名:\n");
for (int i = 0; i < n; i++) {
char *name = (char *) malloc(MAX_NAME_LENGTH * sizeof(char));
scanf("%s", name);
names[i] = name;
}
sort_names(names, n);
printf("排序后的学生姓名:\n");
for (int i = 0; i < n; i++) {
printf("%s\n", names[i]);
free(names[i]);
}
return 0;
}
void sort_names(char *names[], int n) {
for (int i = 0; i < n - 1; i++) {
int min_index = i;
for (int j = i + 1; j < n; j++) {
if (strcmp(names[j], names[min_index]) < 0) {
min_index = j;
}
}
if (min_index != i) {
char *temp = names[i];
names[i] = names[min_index];
names[min_index] = temp;
}
}
}
```
程序中首先定义了常量 `MAX_STUDENTS` 和 `MAX_NAME_LENGTH`,分别表示最大学生人数和最大姓名长度,这样可以方便地进行调整。
在 `main` 函数中,首先接收用户输入的学生个数 `n`,然后使用循环接收所有学生的姓名,将它们存储在 `names` 数组中。需要注意的是,由于每个姓名的长度未知,我们需要使用动态内存分配来为每个姓名分配足够的空间。在循环结束后,我们调用 `sort_names` 函数对这些姓名按字典顺序排序。
`sort_names` 函数则使用基于选择排序的算法来进行排序。具体地,我们从前往后依次找到最小的姓名,然后将它交换到当前位置。在比较大小时,我们使用 `strcmp` 函数来比较两个字符串是否相等或大小关系。
最后,我们在 `main` 函数中输出排序后的姓名,并释放每个姓名占用的空间,以免造成内存泄漏。
这个程序使用了动态内存分配和指针,因此可以在保证速度的同时节省空间。
阅读全文