#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_NAME_LEN 20
#define MAX_SEX_LEN 5
#define MAX_ADDRESS_LEN 50
#define MAX_TELEPHONE_LEN 20
#define INITIAL_CAPACITY 10
typedef struct people {
char name[MAX_NAME_LEN];
int age;
char sex[MAX_SEX_LEN];
char address[MAX_ADDRESS_LEN];
char telephone[MAX_TELEPHONE_LEN];
} people;
typedef struct contact {
people* data;
int size;
int capacity;
} contact;
void init_contact(contact* pc) {
pc->capacity = INITIAL_CAPACITY;
pc->size = 0;
pc->data = (people*)malloc(sizeof(people) * pc->capacity);
if (!pc->data) {
fprintf(stderr, "内存分配失败\n");
exit(EXIT_FAILURE);
}
}
void expand_contact(contact* pc) {
pc->capacity *= 2;
people* new_data = (people*)realloc(pc->data, sizeof(people) * pc->capacity);
if (!new_data) {
fprintf(stderr, "内存重新分配失败\n");
free(pc->data);
exit(EXIT_FAILURE);
}
pc->data = new_data;
}
void add_contact(contact* pc) {
if (pc->size == pc->capacity) {
expand_contact(pc);
}
printf("输入姓名: ");
scanf("%s", pc->data[pc->size].name);
printf("输入年龄: ");
scanf("%d", &pc->data[pc->size].age);
printf("输入性别: ");
scanf("%s", pc->data[pc->size].sex);
printf("输入住址: ");
scanf("%s", pc->data[pc->size].address);
printf("输入电话: ");
scanf("%s", pc->data[pc->size].telephone);
pc->size++;
}
int find_contact(contact* pc, const char* name) {
for (int i = 0; i < pc->size; i++) {
if (strcmp(pc->data[i].name, name) == 0) {
return i;
}
}
return -1;
}
void delete_contact(contact* pc, const char* name) {
int pos = find_contact(pc, name);
if (pos == -1) {
printf("未找到联系人。\n");
return;
}
for (int i = pos; i < pc->size - 1; i++) {
pc->data[i] = pc->data[i + 1];
}
pc->size--;
printf("联系人删除成功。\n");
}
void modify_contact(contact* pc, const char* name) {
int pos = find_contact(pc, name);
if (pos == -1) {
printf("未找到联系人。\n");
return;
}
printf("输入新的年龄: ");
scanf("%d", &pc->data[pos].age);
printf("输入新的性别: ");
scanf("%s", pc->data[pos].sex);
printf("输入新的住址: ");
scanf("%s", pc->data[pos].address);
printf("输入新的电话: ");
scanf("%s", pc->data[pos].telephone);
printf("联系人修改成功。\n");
}
void show_all_contacts(contact* pc) {
for (int i = 0; i < pc->size; i++) {
printf("姓名: %s, 年龄: %d, 性别: %s, 住址: %s, 电话: %s\n",
pc->data[i].name, pc->data[i].age, pc->data[i].sex,
pc->data[i].address, pc->data[i].telephone);
}
}
void delete_all_contacts(contact* pc) {
free(pc->data);
init_contact(pc);
printf("所有联系人删除成功。\n");
}
void sort_contacts(contact* pc) {
for (int i = 0; i < pc->size - 1; i++) {
for (int j = 0; j < pc->size - 1 - i; j++) {
if (strcmp(pc->data[j].name, pc->data[j + 1].name) > 0) {
people temp = pc->data[j];
pc->data[j] = pc->data[j + 1];
pc->data[j + 1] = temp;
}
}
}
printf("联系人排序成功。\n");
}
void menu()
{
printf("******** 1.添加联系人信息 ********\n");
printf("******** 2.删除指定联系人信息 ********\n");
printf("******** 3.查找指定联系人信息 ********\n");
printf("******** 4.修改指定联系人信息 ********\n");
printf("******** 5.显示所有联系人信息 ********\n");
printf("******** 6.清空所有联系人 ********\n");
printf("******** 7.以名字排序所有联系人 ********\n");
printf("******** 8.呼出菜单 ********\n");
printf("******** 0.退出通讯录 ********\n");
}
void contract() {
contact con;
init_contact(&con);
int choice;
do {
menu();
scanf("%d", &choice);
switch (choice) {
case 1:
add_contact(&con);
break;
case 2: {
char name[MAX_NAME_LEN];
printf("输入要删除的联系人姓名:");
scanf("%s", name);
delete_contact(&con, name);
break;
}
case 3: {
char name[MAX_NAME_LEN];
printf("输入要查找的联系人姓名:");
scanf("%s", name);
int pos = find_contact(&con, name);
if (pos != -1) {
printf("姓名: %s, 年龄: %d, 性别: %s, 住址: %s, 电话: %s\n",
con.data[pos].name, con.data[pos].age, con.data[pos].sex,
con.data[pos].address, con.data[pos].telephone);
}
else {
printf("未找到联系人。\n");
}
break;
}
case 4: {
char name[MAX_NAME_LEN];
printf("输入要修改的联系人姓名:");
scanf("%s", name);
modify_contact(&con, name);
break;
}
case 5:
show_all_contacts(&con);
break;
case 6:
delete_all_contacts(&con);
break;
case 7:
sort_contacts(&con);
break;
case 0:
printf("退出通讯录。\n");
break;
default:
printf("输入错误,请重新选择。\n");
break;
}
} while (choice != 0);
}
int main() {
contract();
return 0;
}
这是之前通讯录的改进,但是是朋友改的,我自己还没研究明白,好难啊(x.x)