#define _CRT_SECURE_NO_WARNINGS #include#include #include #include #include //通过结构体描述一个人的练习情况 typedef struct PersonInfo { char name[1024]; char phone[1024]; }PersonInfo; //这个结构体描述了一个通信录 //通信录的长度是1024 //还有一个size,表示当前有多少联系人 typedef struct AddressBook { PersonInfo persons[1024]; int size; }AddressBook; //此处全局变量,当前为了实现通讯录 //围绕Address AddressBook addressBook; void init(AddressBook* addressBook) { //把有效元素个数设置为0 addressBook->size = 0; //可有可无 } int menu() { printf("****************************n"); printf("*******欢迎使用通讯录*******n"); printf("****************************n"); printf(" n"); printf("****************************n"); printf("********1. 新增联系人*******n"); printf("********2. 删除联系人*******n"); printf("********3. 查看联系人*******n"); printf("********4. 修改联系人*******n"); printf("********0. 退出通讯录*******n"); printf("****************************n"); printf("请输入选项: "); int choice = 0; scanf("%d", &choice); return choice; } void insert(AddressBook* addressBook) { printf("新增n"); assert(addressBook != NULL); //最大为1024满了的话提示失败 if (addressBook->size >= 1024) { printf("失败n"); return; } PersonInfo person = { 0 }; printf("输入姓名: n"); scanf("%s", person.name); printf("输入电话: n"); scanf("%s", person.phone); //把person结构体放到AdderssBook中 //当数组为空的时候,size就是0,把新增的元素放到下标为0的位置 //插入完毕后,把size++ ==> 1 //下次再插入的时候,size为1,就是把心得元素放到size下标为1的位置 addressBook->persons[addressBook->size] = person; addressBook->size++; printf("完成nn"); } void drop(AddressBook* addressBook) { printf("删除n"); //让用户输入一个序号(数组下标)根据序号删除 printf("输入序号: n"); int id = 0; scanf("%d", &id); if (id < 0 || id >= addressBook->size) { printf("错误n"); return; } //思路 //如果是尾删就size-- //如果中间,就把最后一个元素粘过去,再sie-- if (id == addressBook->size - 1) { addressBook->size--; printf("成功n"); return; } PersonInfo* lastPerson = &addressBook->persons[addressBook->size - 1]; addressBook->persons[id] = *lastPerson; addressBook->size--; printf("成功n"); } void show(AddressBook* addressBook) { printf("查看"); //直接遍历数组 for (int i = 0; i < addressBook->size; i++) { //最好用指针变量表示这个元素 //不用指针会涉及到元素的拷贝,把PersonInfo的结构体拷贝了一遍 PersonInfo* p = &addressBook->persons[i]; printf("[%d] %st%sn", i, p->name, p->phone); } printf("查看联系人完毕n一共有 %d 个联系人nn", addressBook->size); } void update(AddressBook* addressBook) { printf("修改n"); printf("输入序号: n"); int id = 0; scanf("%d", &id); if (id < 0 || id >= addressBook->size) { printf("错误n"); return; } PersonInfo* p = &addressBook->persons[id]; char name[1024] = { 0 }; char phone[1024] = { 0 }; printf("输入 * 表示该选项不修改n"); printf("输入新用户名(旧: %s): n", p->name); scanf("%s", name); if (strcmp(name, "*") != 0) { strcpy(p->name, name); } printf("输入新电话(旧: %s): n", p->phone); scanf("%s", phone); if (strcmp(phone, "*") != 0) { strcpy(p->phone, phone); } printf("成功n"); } typedef void(*Func)(AddressBook*); int main() { //进行初始化 init(&addressBook); Func funcs[] = { NULL,//为了能让insert和choice对应上 insert, drop, show, update }; //和用户进行交互 while (1) { int choice = menu(); //if (choice == 1) { 新增 //}else if (choice == 2) { 删除 //}else if (choice == 3) { 查看 //}else if (choice == 4) { 修改 //}else if (choice == 0) { 退出 //}else { 错误输入 //} if (choice < 0 || choice >= sizeof(funcs) / sizeof(funcs[0])) { printf("输入有误"); continue; } if (choice == 0) { printf("再见"); break; } funcs[choice](&addressBook); //Func func = funcs[choice]; // func(addressBook); //Sleep(2000); system("pause"); system("cls"); } return 0; }



