• 【C语言实现】----动态/文件/静态通讯录


    ced485cbb11e458d81a746890b32cf3f.gif

     🎈🎈 作者 whispar
    🎈🎈专栏 : C语言从无到有

    ✨放低姿态,空杯心态✨

    7abc9c8906564477a6679bb15d368e37.gif

    目录

    一、代码展示

    🌊test.c

    🌊contact.c

    🌊contact.h

    二、效果展示

    ✅静态版本基本功能的实现

    ✅动态版本扩容功能的实现 

    ✅文件版本保存本地功能实现


    一、代码展示

    🌊test.c

    ✅使用枚举类型,使得菜单部分的代码可读性更强,便于理解

    1. #define _CRT_SECURE_NO_WARNINGS
    2. #include"contact.h"
    3. enum Option
    4. {
    5. EXIT,
    6. ADD,
    7. DEL,
    8. SEARCH,
    9. MODIFY,
    10. SHOW,
    11. SORT
    12. };
    13. void menu() {
    14. printf("*******\ 1.add     2.del   /*******\n");
    15. printf("*******\ 3.search 4.modify /*******\n");
    16. printf("*******\ 5.show   6.sort   /*******\n");
    17. }
    18. int main(){
    19. int input = 0;
    20. Contact con; //通讯录
    21. //结构体传参
    22. InitContact(&con); //结构体传参
    23. do
    24. {
    25. menu();
    26. printf("请选择:> ");
    27. scanf("%d", &input);
    28. switch (input)
    29. {
    30. case ADD:
    31. AddContact(&con);
    32. break;
    33. case DEL:
    34. DelContact(&con);
    35. break;
    36. case SEARCH:
    37. SearchContact(&con);
    38. break;
    39. case MODIFY:
    40. ModifyContact(&con);
    41. break;
    42. case SHOW:
    43. ShowContact(&con);
    44. break;
    45. case SORT:
    46. SortContact(&con);
    47. break;
    48. case EXIT:
    49. SaveContact(&con);
    50. DestroyContact(&con);
    51. printf("退出通讯录\n");
    52. break;
    53. default:
    54. printf("选择错误\n");
    55. break;
    56. }
    57. } while (input);
    58. return 0;
    59. }

    🌊contact.c

    ✅在contact.c中静态的版本无法满足我们的需求,因此我们在动态的版本当中使用realloc函数就可以做到对动态开辟内存大小,我们可以封装一个函数来判断容量是否足够,不够的话进行扩容。

    ✅在contact.c中文件的版本可以将创建的数据存储在本地,当程序退出时,数据依然存在,使用文件我们可以将数据直接存放在电脑的硬盘上,做到了数据的持久化。
     

    1. #define _CRT_SECURE_NO_WARNINGS 1
    2. #include "contact.h"
    3. //静态的版本
    4. //void InitContact(Contact* pc)
    5. //{
    6. // assert(pc);
    7. // pc->count = 0;
    8. // memset(pc->data, 0, sizeof(pc->data));
    9. //}
    10. void CheckCapacity(Contact* pc)
    11. {
    12. if (pc->count == pc->capacity)
    13. {
    14. PeoInfo* ptr = (PeoInfo*)realloc(pc->data, (pc->capacity + INC_SZ) * sizeof(PeoInfo));
    15. if (ptr == NULL)
    16. {
    17. printf("AddContact::%s\n", strerror(errno));
    18. return;
    19. }
    20. else
    21. {
    22. pc->data = ptr;
    23. pc->capacity += INC_SZ;
    24. printf("增容成功\n");
    25. }
    26. }
    27. }
    28. void LoadContact(Contact* pc)
    29. {
    30. FILE* pfRead = fopen("contact.txt", "rb");
    31. if (pfRead == NULL)
    32. {
    33. perror("LoadContact");
    34. return;
    35. }
    36. PeoInfo tmp = { 0 };
    37. while (fread(&tmp, sizeof(PeoInfo), 1, pfRead) == 1)
    38. {
    39. CheckCapacity(pc);
    40. pc->data[pc->count] = tmp;
    41. pc->count++;
    42. }
    43. fclose(pfRead);
    44. pfRead = NULL;
    45. }
    46. //动态的版本
    47. int InitContact(Contact* pc)
    48. {
    49. assert(pc);
    50. pc->count = 0;
    51. pc->data = (PeoInfo*)calloc(DEFAULT_SZ, sizeof(PeoInfo));
    52. if (pc->data == NULL)
    53. {
    54. printf("InitContact::%s\n", strerror(errno));
    55. return 1;
    56. }
    57. pc->capacity = DEFAULT_SZ;
    58. //加载文件的信息到通讯录中
    59. LoadContact(pc);
    60. return 0;
    61. }
    62. void DestroyContact(Contact* pc)
    63. {
    64. assert(pc);
    65. free(pc->data);
    66. pc->data = NULL;
    67. }
    68. //静态的版本
    69. //void AddContact(Contact* pc)
    70. //{
    71. // assert(pc);
    72. // if (pc->count == MAX)
    73. // {
    74. // printf("通讯录已满,无法添加\n");
    75. // return;
    76. // }
    77. // //
    78. // printf("请输入名字:>");
    79. // scanf("%s", pc->data[pc->count].name);
    80. // printf("请输入年龄:>");
    81. // scanf("%d", &(pc->data[pc->count].age));
    82. // printf("请输入性别:>");
    83. // scanf("%s", pc->data[pc->count].sex);
    84. // printf("请输入电话:>");
    85. // scanf("%s", pc->data[pc->count].tele);
    86. // printf("请输入地址:>");
    87. // scanf("%s", pc->data[pc->count].addr);
    88. //
    89. // pc->count++;
    90. // printf("增加成功\n");
    91. //}
    92. //动态的版本
    93. void AddContact(Contact* pc)
    94. {
    95. assert(pc);
    96. //增容
    97. CheckCapacity(pc);
    98. //
    99. printf("请输入名字:>");
    100. scanf("%s", pc->data[pc->count].name);
    101. printf("请输入年龄:>");
    102. scanf("%d", &(pc->data[pc->count].age));
    103. printf("请输入性别:>");
    104. scanf("%s", pc->data[pc->count].sex);
    105. printf("请输入电话:>");
    106. scanf("%s", pc->data[pc->count].tele);
    107. printf("请输入地址:>");
    108. scanf("%s", pc->data[pc->count].addr);
    109. pc->count++;
    110. printf("增加成功\n");
    111. }
    112. void ShowContact(const Contact* pc)
    113. {
    114. assert(pc);
    115. int i = 0;
    116. printf("%-20s\t%-5s\t%-5s\t%-12s\t%-30s\n", "名字", "年龄", "性别", "电话", "地址");
    117. for (i = 0; i < pc->count; i++)
    118. {
    119. printf("%-20s\t%-5d\t%-5s\t%-12s\t%-30s\n", pc->data[i].name,
    120. pc->data[i].age,
    121. pc->data[i].sex,
    122. pc->data[i].tele,
    123. pc->data[i].addr);
    124. }
    125. }
    126. static int FindByName(Contact* pc, char name[])
    127. {
    128. assert(pc);
    129. int i = 0;
    130. for (i = 0; i < pc->count; i++)
    131. {
    132. if (0 == strcmp(pc->data[i].name, name))
    133. {
    134. return i;
    135. }
    136. }
    137. return -1;
    138. }
    139. void DelContact(Contact* pc)
    140. {
    141. char name[MAX_NAME] = { 0 };
    142. assert(pc);
    143. int i = 0;
    144. if (pc->count == 0)
    145. {
    146. printf("通讯录为空,没有信息可以删除\n");
    147. return;
    148. }
    149. printf("请输入要删除人的名字:>");
    150. scanf("%s", name);
    151. //删除
    152. //1. 查找
    153. int pos = FindByName(pc, name);
    154. if (pos == -1)
    155. {
    156. printf("要删除的人不存在\n");
    157. return;
    158. }
    159. //2. 删除
    160. for (i = pos; i < pc->count - 1; i++)
    161. {
    162. pc->data[i] = pc->data[i + 1];
    163. }
    164. pc->count--;
    165. printf("删除成功\n");
    166. }
    167. void SearchContact(Contact* pc)
    168. {
    169. assert(pc);
    170. char name[MAX_NAME] = { 0 };
    171. printf("请输入要查找人的名字:>");
    172. scanf("%s", name);
    173. //1. 查找
    174. int pos = FindByName(pc, name);
    175. if (pos == -1)
    176. {
    177. printf("要查找的人不存在\n");
    178. return;
    179. }
    180. //2. 打印
    181. printf("%-20s\t%-5s\t%-5s\t%-12s\t%-30s\n", "名字", "年龄", "性别", "电话", "地址");
    182. printf("%-20s\t%-5d\t%-5s\t%-12s\t%-30s\n", pc->data[pos].name,
    183. pc->data[pos].age,
    184. pc->data[pos].sex,
    185. pc->data[pos].tele,
    186. pc->data[pos].addr);
    187. }
    188. void ModifyContact(Contact* pc)
    189. {
    190. assert(pc);
    191. char name[MAX_NAME] = { 0 };
    192. printf("请输入要修改人的名字:>");
    193. scanf("%s", name);
    194. //1. 查找
    195. int pos = FindByName(pc, name);
    196. if (pos == -1)
    197. {
    198. printf("要修改的人不存在\n");
    199. return;
    200. }
    201. printf("要修改的人的信息已经查找到,接下来开始修改\n");
    202. //2. 修改
    203. printf("请输入名字:>");
    204. scanf("%s", pc->data[pos].name);
    205. printf("请输入年龄:>");
    206. scanf("%d", &(pc->data[pos].age));
    207. printf("请输入性别:>");
    208. scanf("%s", pc->data[pos].sex);
    209. printf("请输入电话:>");
    210. scanf("%s", pc->data[pos].tele);
    211. printf("请输入地址:>");
    212. scanf("%s", pc->data[pos].addr);
    213. printf("修改成功\n");
    214. }
    215. int cmp_peo_by_name(const void* e1, const void* e2)
    216. {
    217. return strcmp(((PeoInfo*)e1)->name, ((PeoInfo*)e2)->name);
    218. }
    219. //按照名字来排序
    220. void SortContact(Contact* pc)
    221. {
    222. assert(pc);
    223. qsort(pc->data, pc->count, sizeof(PeoInfo), cmp_peo_by_name);
    224. printf("排序成功\n");
    225. }
    226. void SaveContact(const Contact* pc)
    227. {
    228. assert(pc);
    229. FILE* pfWrite = fopen("contact.txt", "wb");
    230. if (pfWrite == NULL)
    231. {
    232. perror("SaveContact");
    233. return;
    234. }
    235. //写文件-二进制的形式
    236. int i = 0;
    237. for (i = 0; i < pc->count; i++)
    238. {
    239. fwrite(pc->data + i, sizeof(PeoInfo), 1, pfWrite);
    240. }
    241. fclose(pfWrite);
    242. pfWrite = NULL;
    243. }

    🌊contact.h

    1. #pragma once
    2. #include
    3. #include
    4. #include
    5. #include
    6. #define DEFAULT_SZ 3
    7. #define INC_SZ 2
    8. #define MAX 100
    9. #define MAX_NAME 20
    10. #define MAX_SEX 10
    11. #define MAX_TELE 12
    12. #define MAX_ADDR 30
    13. //类型的声明
    14. //
    15. //人的信息
    16. typedef struct PeoInfo
    17. {
    18. char name[MAX_NAME];
    19. int age;
    20. char sex[MAX_SEX];
    21. char tele[MAX_TELE];
    22. char addr[MAX_ADDR];
    23. } PeoInfo;
    24. //通讯录
    25. //静态版本
    26. //typedef struct Contact
    27. //{
    28. // PeoInfo data[MAX];//存放人的信息
    29. // int count;//记录当前通讯录中实际人的个数
    30. //}Contact;
    31. //动态的版本
    32. typedef struct Contact
    33. {
    34. PeoInfo* data;//存放人的信息
    35. int count;//记录当前通讯录中实际人的个数
    36. int capacity;//当前通讯录的容量
    37. }Contact;
    38. //初始化通讯录
    39. int InitContact(Contact* pc);
    40. //销毁通讯录
    41. void DestroyContact(Contact* pc);
    42. //增加联系人都通讯录
    43. void AddContact(Contact* pc);
    44. //打印通讯中的信息
    45. void ShowContact(const Contact* pc);
    46. //删除指定联系人
    47. void DelContact(Contact* pc);
    48. //查找指定联系人
    49. void SearchContact(Contact* pc);
    50. //修改指定联系人
    51. void ModifyContact(Contact* pc);
    52. //排序通讯录中内容
    53. //按照名字来排序
    54. //按照年龄来排序
    55. //...
    56. void SortContact(Contact* pc);
    57. //保存通讯录的信息到文件
    58. void SaveContact(const Contact* pc);
    59. //加载文件的信息到通讯录
    60. void LoadContact(Contact* pc);

    二、效果展示

    ✅静态版本基本功能的实现

    ✅动态版本扩容功能的实现 

    ✅文件版本保存本地功能实现

       💖如果文章对你有帮助,请多多点赞、收藏、评论、关注支持!!💖             

    ced485cbb11e458d81a746890b32cf3f.gif

  • 相关阅读:
    Java——数据类型转换:自动类型转换&强制类型转换
    【量子学习笔记】纯态、混合态、直积态及纠缠态的概念区分及理解
    机器学习入门详解(一):理解监督学习中的最大似然估计
    1. JavaScript有哪些数据类型, 它们的区别?
    保障效率与可用,分析Kafka的消费者组与Rebalance机制
    66:第五章:开发admin管理服务:19:开发【查看用户详情,接口】;
    Nacos服务发现原理分析
    水果音乐制作软件FL Studio21.2中文版新功能介绍
    JSP科研处管理信息系统免费源代码+LW
    【深度学习2】反向传播BP算法
  • 原文地址:https://blog.csdn.net/m0_56361048/article/details/125969392