c语言读取一组电话号码簿(由姓名和手机号码组成),将重复出现的项删除(姓名和电话号码都相同的项为重复项,只保留第一次出现的项),并对姓名相同手机号码不同的项进行如下整理:首次出现的项不作处理,第一次重复的姓名后面加英文下划线字符_和字母a,第二次重复的姓名后面加英文下划线字符_和字母b,依次类推。号码簿中姓名相同的项数最多不超过10个。最后对整理后的电话号码簿按照姓名从小到大进行排序。若输入没有指定排序算法,则只输出排序后的电话号码簿;若输入指定了快速排序算法,则按指定算法按排序键值先输出进行第一趟快速排序后的结果(即只输出姓名),然后输出排序后的电话号码簿
时间: 2024-01-22 15:18:36 浏览: 45
以下是一个可能的解决方案:
```c
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAX_ENTRIES 100 // 最多100个电话号码簿条目
#define MAX_NAME_LEN 20 // 姓名最大长度
#define MAX_PHONE_LEN 12 // 电话号码最大长度
typedef struct {
char name[MAX_NAME_LEN+1];
char phone[MAX_PHONE_LEN+1];
} phonebook_entry;
int compare_entries(const void* a, const void* b) {
phonebook_entry* entry_a = (phonebook_entry*)a;
phonebook_entry* entry_b = (phonebook_entry*)b;
return strcmp(entry_a->name, entry_b->name);
}
int main() {
phonebook_entry entries[MAX_ENTRIES];
int num_entries = 0;
char buffer[MAX_NAME_LEN+MAX_PHONE_LEN+3];
char* name;
char* phone;
int i, j;
// 读取电话号码簿
while (fgets(buffer, sizeof(buffer), stdin) != NULL) {
// 解析姓名和电话号码
name = strtok(buffer, " \t");
phone = strtok(NULL, " \t\n");
// 查找是否有重复项
for (i = 0; i < num_entries; i++) {
if (strcmp(entries[i].name, name) == 0 &&
strcmp(entries[i].phone, phone) == 0) {
break;
}
}
// 如果没有重复项,则添加新条目
if (i == num_entries) {
strncpy(entries[num_entries].name, name, MAX_NAME_LEN);
strncpy(entries[num_entries].phone, phone, MAX_PHONE_LEN);
num_entries++;
}
}
// 对姓名相同但电话号码不同的项进行整理
for (i = 0; i < num_entries; i++) {
int count = 1;
for (j = i+1; j < num_entries; j++) {
if (strcmp(entries[i].name, entries[j].name) == 0) {
count++;
if (count > 1) {
char suffix = 'a' + (count-2);
entries[j].name[MAX_NAME_LEN-2] = '_';
entries[j].name[MAX_NAME_LEN-1] = suffix;
entries[j].name[MAX_NAME_LEN] = '\0';
}
}
}
}
// 按姓名排序
qsort(entries, num_entries, sizeof(phonebook_entry), compare_entries);
// 输出电话号码簿
for (i = 0; i < num_entries; i++) {
printf("%s %s\n", entries[i].name, entries[i].phone);
}
return 0;
}
```
该程序先读取电话号码簿,删除重复项,并对姓名相同但电话号码不同的项进行整理。然后按姓名排序,并输出整理后的电话号码簿。
该程序使用了标准库函数 `fgets`、`strtok`、`strcmp`、`strncpy`、`qsort` 等,需要注意的是,`strncpy` 不会自动为目标字符串添加结尾的空字符,因此需要手动添加。
相关推荐
![c](https://img-home.csdnimg.cn/images/20210720083646.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)