显示所有联系人的信息
注意数据与表头的对齐
1. void ShowContact(const Contact* pc) 2. { 3. assert(pc); 4. int i = 0; 5. //打印列标题 6. printf("%-10s\t%-4s\t%-5s\t%-12s\t%-30s\n", "名字", "年龄", "性别", "电话", "地址"); 7. //打印数据 8. for (i = 0; i < pc->sz; i++) 9. { 10. printf("%-10s\t%-4d\t%-5s\t%-12s\t%-30s\n", 11. pc->data[i].name, 12. pc->data[i].age, 13. pc->data[i].sex, 14. pc->data[i].tele, 15. pc->data[i].addr); 16. } 17. }
查找函数
查找函数存在的意义:我们发现我们发现在删除、查找、修改函数实现中我们都会有查找这一项功能,而我们在这里进行统一实现,后续使用起来就会很方便
1. static int FindByName(const Contact* pc, char name[]) 2. { 3. int i = 0; 4. for (i = 0; i < pc->sz; i++) 5. { 6. if (strcmp(pc->data[i].name, name) == 0) 7. { 8. return i;//找到了 9. } 10. } 11. return -1;//找不到 12. }
删除指定联系人
这里的删除其实是后面的数据对前面的数据的覆盖
实现如下
1. void DelContact(Contact* pc) 2. { 3. if (pc->sz == 0) 4. { 5. printf("通讯录为空,无法删除\n"); 6. return; 7. } 8. char name[MAX_NAME] = { 0 }; 9. assert(pc); 10. //删除 11. printf("请输入要删除的人名字:>"); 12. scanf("%s", name); 13. 14. //找到要删除的人 15. int del = FindByName(pc, name); 16. if (del == -1) 17. { 18. printf("要删除的人不存在\n"); 19. return; 20. } 21. int i = 0; 22. //删除坐标位del的联系人 23. for (i = del; i < pc->sz - 1; i++) 24. { 25. pc->data[i] = pc->data[i + 1]; 26. } 27. pc->sz--; 28. 29. printf("成功删除联系人\n"); 30. }
查找指定联系人
只需要按名字进行查找,最后进行输出就好,实现如下
1. void SearchContact(const Contact* pc) 2. { 3. assert(pc); 4. if (pc->sz == 0) 5. { 6. printf("通讯录为空,无法查找\n"); 7. return; 8. } 9. char name[MAX_NAME] = { 0 }; 10. printf("请输入要查找人的名字:>"); 11. scanf("%s", name); 12. int pos = FindByName(pc, name); 13. if (pos == -1) 14. printf("要查找的人不存在\n"); 15. else 16. { 17. printf("%-10s\t%-4s\t%-5s\t%-12s\t%-30s\n", "名字", "年龄", "性别", "电话", "地址"); 18. //打印数据 19. printf("%-10s\t%-4d\t%-5s\t%-12s\t%-30s\n", 20. pc->data[pos].name, 21. pc->data[pos].age, 22. pc->data[pos].sex, 23. pc->data[pos].tele, 24. pc->data[pos].addr); 25. } 26. }
修改指定联系人
1. void ModifyContact(Contact* pc) 2. { 3. assert(pc); 4. if (pc->sz == 0) 5. { 6. printf("通讯录为空,无法修改\n"); 7. return; 8. } 9. char name[MAX_NAME] = { 0 }; 10. printf("请输入要修改人的名字:>"); 11. scanf("%s", name); 12. int pos = FindByName(pc, name); 13. if (pos == -1) 14. printf("要修改的人不存在\n"); 15. else 16. { 17. printf("请输入名字:>"); 18. scanf("%s", pc->data[pos].name); 19. printf("请输入年龄:>"); 20. scanf("%d", &(pc->data[pos].age)); 21. printf("请输入性别:>"); 22. scanf("%s", pc->data[pos].sex); 23. printf("请输入电话:>"); 24. scanf("%s", pc->data[pos].tele); 25. printf("请输入地址:>"); 26. scanf("%s", pc->data[pos].addr); 27. 28. printf("修改成功\n"); 29. } 30. } 31.
进阶版通讯录(动态存储)
进阶版通讯录实现与普通版通讯录区别在于,普通版通讯录的存储是有限,是提前规定好的,而进阶版则是可以根据用户的实际需求进行扩容。具体实现同样分为三个模块
模块一test.c
此模块没有什么变化
1. #include "Contact.h" 2. 3. void menu() 4. { 5. printf("*********** 通讯录 *************\n"); 6. printf("******* 1 添加联系人 2 删除联系人 ******\n"); 7. printf("******* 3 查找联系人 4 修改联系人 ******\n"); 8. printf("******* 5 显示通讯录 0 退出通讯录 ******\n"); 9. printf("*****************************************\n"); 10. } 11. 12. void test() 13. { 14. int input = 0; 15. Contact con;//创建通讯录 16. InitContact(&con); 17. do 18. { 19. menu(); 20. printf("请选择:"); 21. scanf("%d", &input); 22. switch (input) 23. { 24. case ADD : 25. AddContact(&con); 26. break; 27. case DEL : 28. DelContact(&con); 29. break; 30. case SEARCH : 31. SearchContact(&con); 32. break; 33. case MODIFY : 34. ModifyContact(&con); 35. break; 36. case SHOW : 37. ShowContact(&con); 38. break; 39. case EXIT : 40. printf("退出通讯录\n"); 41. break; 42. default: printf("输入错误,重新输入\n"); 43. break; 44. } 45. } while (input); 46. 47. } 48. 49. int main() 50. { 51. test(); 52. return 0; 53. }
模块二Contact.h
由于变为了动态存储所以这里的结构的声明有一些变化
1. #include <stdlib.h> 2. 3. #include <string.h> 4. #include <assert.h> 5. #include <stdio.h> 6. 7. 8. #define DEFAULT_SZ 3 9. #define INC_SZ 2 10. #define MAX_NAME 20 11. #define MAX_SEX 5 12. #define MAX_TELE 12 13. #define MAX_ADDR 30 14. 15. enum OPTION//枚举 16. { 17. EXIT,//0 18. ADD, 19. DEL, 20. SEARCH, 21. MODIFY, 22. SHOW 23. }; 24. 25. 26. //类型的声明 27. 28. typedef struct PeoInfo 29. { 30. char name[MAX_NAME]; 31. int age; 32. char sex[MAX_SEX]; 33. char tele[MAX_TELE]; 34. char addr[MAX_ADDR]; 35. }PeoInfo; 36. 37. //通讯录 38. //修改后 39. typedef struct Contact 40. { 41. PeoInfo* data;//指向了存放数据的空间 42. int sz;//记录的当前放的有效元素的个数 43. int capacity;//通讯录当前的最大容量 44. }Contact; 45. //函数声明 46. 47. //初始化通讯录 48. void InitContact(Contact* pc); 49. 50. //增加联系人 51. void AddContact(Contact* pc); 52. 53. //显示所有联系人的信息 54. void ShowContact(const Contact* pc); 55. 56. //删除指定联系人 57. void DelContact(Contact* pc); 58. 59. //查找指定联系人 60. void SearchContact(const Contact* pc); 61. 62. //修改指定联系人 63. void ModifyContact(Contact* pc);
模块三Contact.c
修改如下
1. //静态版本 2. //void InitContact(Contact* pc) 3. //{ 4. // assert(pc); 5. // memset(pc->data, 0, sizeof(pc->data)); 6. // pc->sz = 0; 7. //} 8. 9. //动态的版本 10. void InitContact(Contact* pc) 11. { 12. assert(pc); 13. memset(pc->data, 0, sizeof(pc->data)); 14. pc->data = (PeoInfo*)malloc(DEFAULT_SZ * sizeof(PeoInfo)); 15. if (pc->data == NULL) 16. { 17. perror("InitContact"); 18. return; 19. } 20. pc->sz = 0; 21. pc->capacity = DEFAULT_SZ; 22. } 23. 24. //静态版本 25. // 26. //void AddContact(Contact* pc) 27. //{ 28. // assert(pc); 29. // if (pc->sz == MAX) 30. // { 31. // printf("通讯录已满,无法添加\n"); 32. // return; 33. // } 34. // 35. // printf("请输入名字:>"); 36. // scanf("%s", pc->data[pc->sz].name); 37. // printf("请输入年龄:>"); 38. // scanf("%d", &(pc->data[pc->sz].age)); 39. // printf("请输入性别:>"); 40. // scanf("%s", pc->data[pc->sz].sex); 41. // printf("请输入电话:>"); 42. // scanf("%s", pc->data[pc->sz].tele); 43. // printf("请输入地址:>"); 44. // scanf("%s", pc->data[pc->sz].addr); 45. // 46. // pc->sz++; 47. // printf("成功增加联系人\n"); 48. //} 49. 50. int CheckCapacity(Contact* pc) 51. { 52. if (pc->sz == pc->capacity) 53. { 54. PeoInfo* ptr = (PeoInfo*)realloc(pc->data, (pc->capacity + INC_SZ)*sizeof(PeoInfo)); 55. if (ptr == NULL) 56. { 57. perror("CheckCapacity"); 58. return 0; 59. } 60. else 61. { 62. pc->data = ptr; 63. pc->capacity += INC_SZ; 64. printf("增容成功\n"); 65. return 1; 66. } 67. } 68. return 1; 69. } 70. 71. //动态的版本 72. void AddContact(Contact* pc) 73. { 74. assert(pc); 75. if (pc->sz == MAX) 76. 77. if (0 == CheckCapacity(pc)) 78. { 79. printf("通讯录已满,无法添加\n"); 80. return; 81. } 82. 83. void AddContact(Contact* pc) 84. printf("成功增加联系人\n"); 85. } 86. 87. 88. void ShowContact(const Contact* pc) 89. { 90. assert(pc); 91. void ModifyContact(Contact* pc) 92. } 93. } 94. 95. //释放空间 96. void DestroyContact(Contact* pc) 97. { 98. free(pc->data); 99. pc->data = NULL; 100. pc->capacity = 0; 101. pc->sz = 0; 102. }
若有需要完整版的宝子或者在使用时出现了一些问题,都可以评论区评论或私信博主!!!