C语言通讯录排序:通信录的结构记录包括姓名、生日、电话号码,其中生日又包括年、月、日这三项。定义一个嵌套的结构类型,输入 n 个联系人的信息,再按他们的年龄从大到小的顺序依次输出其信息。试编写相应程
时间: 2024-02-03 12:14:05 浏览: 99
度:
```
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_NAME_LEN 20
#define MAX_PHONE_NUM_LEN 20
#define DATE_LEN 8
typedef struct {
int year;
int month;
int day;
} Date;
typedef struct {
char name[MAX_NAME_LEN];
Date birthday;
char phone_num[MAX_PHONE_NUM_LEN];
} Contact;
int compare_date(Date date1, Date date2) {
if (date1.year != date2.year) {
return date1.year - date2.year;
} else if (date1.month != date2.month) {
return date1.month - date2.month;
} else {
return date1.day - date2.day;
}
}
int compare_contact(const void* ptr1, const void* ptr2) {
Contact* contact1 = (Contact*)ptr1;
Contact* contact2 = (Contact*)ptr2;
return compare_date(contact2->birthday, contact1->birthday);
}
int main() {
int n;
printf("请输入联系人个数: ");
scanf("%d", &n);
Contact* contacts = (Contact*)malloc(n * sizeof(Contact));
for (int i = 0; i < n; i++) {
printf("\n请输入第 %d 个联系人的信息:\n", i + 1);
printf("姓名: ");
scanf("%s", contacts[i].name);
printf("生日(例如20201030): ");
scanf("%d", &contacts[i].birthday.year);
contacts[i].birthday.month = contacts[i].birthday.year % 10000 / 100;
contacts[i].birthday.day = contacts[i].birthday.year % 100;
contacts[i].birthday.year /= 10000;
printf("电话号码: ");
scanf("%s", contacts[i].phone_num);
}
qsort(contacts, n, sizeof(Contact), compare_contact);
printf("\n按年龄从大到小依次输出联系人信息:\n");
for (int i = 0; i < n; i++) {
printf("姓名: %s, 生日: %04d-%02d-%02d, 电话号码: %s\n",
contacts[i].name, contacts[i].birthday.year,
contacts[i].birthday.month, contacts[i].birthday.day,
contacts[i].phone_num);
}
free(contacts);
return 0;
}
```
代码中使用了两个结构体类型,一个是 Date 用于存储生日信息,另一个是 Contact 用于存储联系人信息。在输入生日信息时,为了方便用户输入,我们采用了八位数字表示日期的方式,然后将其转换成年、月、日三个整数。其中 compare_date 函数用于比较两个日期的大小,compare_contact 函数用于比较两个联系人的生日,并按照从大到小的顺序排序。最后,使用 qsort 函数对联系人数组进行排序,然后输出排好序后的联系人信息。
阅读全文