c语言:设char countries[10][40],输入并储存10个国家名称。保持countries数组内容不变,针对该数组制作两张索引表,索引表用指针数组实现。其中每个指针指向一个字符串(国家名称),要求将一张索引表按照串长(从小到大)排序另一张索引表根据首字母排序。利用两张索引表输出两种排好序的国家名称
时间: 2024-02-19 09:59:02 浏览: 71
好的,以下是实现该功能的代码:
```c
#include <stdio.h>
#include <string.h>
int main() {
char countries[10][40]; // 存储国家名称的数组
char *p[10]; // 指针数组,用于存储按串长排序的索引表
char *q[10]; // 指针数组,用于存储按首字母排序的索引表
int i, j;
// 输入国家名称并存储到数组中
printf("请输入10个国家名称:\n");
for (i = 0; i < 10; i++) {
scanf("%s", countries[i]);
}
// 根据串长排序,生成索引表p
for (i = 0; i < 10; i++) {
p[i] = &countries[i][0]; // 指向每个国家名称的首地址
}
// 冒泡排序
for (i = 0; i < 9; i++) {
for (j = i + 1; j < 10; j++) {
if (strlen(p[i]) > strlen(p[j])) {
char *temp = p[i];
p[i] = p[j];
p[j] = temp;
}
}
}
// 根据首字母排序,生成索引表q
for (i = 0; i < 10; i++) {
q[i] = &countries[i][0]; // 指向每个国家名称的首地址
}
// 冒泡排序
for (i = 0; i < 9; i++) {
for (j = i + 1; j < 10; j++) {
if (strcmp(q[i], q[j]) > 0) {
char *temp = q[i];
q[i] = q[j];
q[j] = temp;
}
}
}
// 输出按串长排序的国家名称
printf("按串长排序的国家名称:\n");
for (i = 0; i < 10; i++) {
printf("%s\n", p[i]);
}
// 输出按首字母排序的国家名称
printf("按首字母排序的国家名称:\n");
for (i = 0; i < 10; i++) {
printf("%s\n", q[i]);
}
return 0;
}
```
以上代码中,我们先定义了一个二维字符数组 `countries` 来存储国家名称,然后定义了两个指针数组 `p` 和 `q`,分别用来存储按串长排序和按首字母排序的索引表。接下来,我们先输入国家名称并存储到数组中,然后遍历 `countries` 数组,将每个国家名称的首地址存储到 `p` 和 `q` 数组中。然后,我们分别对 `p` 和 `q` 数组进行冒泡排序,最后输出排序后的结果。
需要注意的是,这里我们是直接对指针数组进行排序,而不是对原始的字符串数组进行排序。这样做的好处是可以避免修改原始数据,同时也可以节省排序的时间和空间复杂度。
阅读全文