• 静态&动态&文件通讯录


    目录

    前言

    博客须知

    静态通讯录

    contact.h

    contact.c

    test.c

    动态通讯录

    contact.h

     contact.c

    test.c 

    文件通讯录

    contact.h

    contact.c

    test.c


    前言

      本篇博客主要介绍三个版本通讯录的实现。通讯录具有增删查改的功能,以及自己增加的另外的一些功能。

    • 静态通讯录

      一开始,静态通讯录开辟了能够存储一千个联系人的信息的数组。这样会导致几个问题:要么是数组开辟的空间过大,造成内存浪费;要么就是数组开辟的空间过小,无妨存储过多的联系人。所以静态通讯录就不够灵活。在静态通讯录的基础上,就引入了动态通讯录。

    • 动态通讯录

      动态通讯录的初始容量为三个联系人,当容量不够时,动态通讯录会自动增容,每次增加两个联系人的空间。相对于静态通讯录,动态通讯录显得更加灵活。

    • 文件通讯录

      不管是静态通讯录,还是动态通讯录,都有着一个缺点。那就是在程序结束的时候,我们所输入的数据都无妨保存下来。而文件通讯录能够很好地解决这个问题,文件通讯录能将我们所输入的数据都保存在一个文件中。当程序运行时,文件中的数据会加载到通讯录中。

    博客须知

      因为通讯录的代码量较大,只写在一个文件的话会影响我们的阅读,所以本博客的通讯录分三个模块来实现。

    • contact.h

        主要负责结构体声明、头文件引用、宏定义和函数声明等

    • contact.c

        负责实现头文件contact.h中的函数

    • test.c

        负责实现通讯录的增删查改的功能等

    静态通讯录

    contact.h

    1. #define _CRT_SECURE_NO_WARNINGS 1
    2. #include
    3. #include
    4. #include
    5. #define MAX_NAME 20
    6. #define MAX_SEX 20
    7. #define MAX_TELE 12
    8. #define MAX_ADDR 30
    9. #define MAX 1000 //联系人的最大容量
    10. //类型的定义
    11. typedef struct PeoInfo
    12. {
    13. char name[MAX_NAME];
    14. char sex[MAX_SEX];
    15. int age;
    16. char tele[MAX_TELE];
    17. char addr[MAX_ADDR];
    18. }PeoInfo;
    19. //通讯录
    20. typedef struct Contact
    21. {
    22. PeoInfo data[MAX];//存放添加进来人的信息
    23. int sz;//记录的是当前通讯录中有效信息的个数
    24. }Contact;
    25. //初始化通讯录
    26. void InitContact(Contact* pc);
    27. //增加联系人信息
    28. void AddContact(Contact* pc);
    29. //打印联系人信息
    30. void PrintContact(const Contact* pc);
    31. //删除联系人信息
    32. void DelContact(Contact* pc);
    33. //查找指定联系人
    34. void SearchContact(Contact* pc);
    35. //修改指定联系人
    36. void ModifyContact(Contact* pc);
    37. //按年龄排序
    38. void SortByAgeContatc(Contact* pc);

     分析:头文件contact.h主要负责结构体的声明、函数的声明以及头文件的引用。结构体中包含了联系人的姓名、性别、年龄、电话号码和住址。为了方便修改结构体内的数组的大小,我们借助#define来定义常量,如#define MAX_NAME 20等。

    contact.c

    1. #define _CRT_SECURE_NO_WARNINGS 1
    2. #include "contact.h"
    3. void InitContact(Contact* pc)
    4. {
    5. //联系人初始化
    6. pc->sz = 0;
    7. //memset(); -内存设置
    8. //pc->data为数组名
    9. //sizeof(数组名),数组名表示的是整个数组,计算的是整个数组的大小
    10. //&数组名,数组名表示的是整个数组,取出的是数组的地址
    11. //除此之外,数组名表示的都是数组首元素的地址
    12. memset(pc->data, 0, sizeof(pc->data));//将通讯录中的数据都设置为0
    13. }
    14. void AddContact(Contact* pc)
    15. {
    16. if (pc->sz == MAX)
    17. {
    18. printf("通讯录已满,无法添加!\n\n");
    19. return;
    20. }
    21. //增加一个人的信息
    22. printf("请输入名字:>");
    23. scanf("%s", pc->data[pc->sz].name);
    24. printf("请输入年龄:>");
    25. scanf("%d", &(pc->data[pc->sz].age));
    26. printf("请输入性别:>");
    27. scanf("%s", pc->data[pc->sz].sex);
    28. printf("请输入电话:>");
    29. scanf("%s", pc->data[pc->sz].tele);
    30. printf("请输入地址:>");
    31. scanf("%s", pc->data[pc->sz].addr);
    32. pc->sz++;
    33. printf("联系人信息增加成功\n\n");
    34. }
    35. void PrintContact(const Contact* pc)
    36. {
    37. int i = 0;
    38. //打印标题
    39. printf("%-20s\t%-5s\t%-5s\t%-12s\t%-20s\n", "名字", "年龄", "性别", "电话", "地址");//左对齐
    40. //打印数据
    41. if (pc->sz == 0)
    42. {
    43. printf("\n");
    44. }
    45. for (i = 0; i < pc->sz; i++)
    46. {
    47. printf("%-20s\t%-5d\t%-5s\t%-12s\t%-20s\n",
    48. pc->data[i].name,
    49. pc->data[i].age,
    50. pc->data[i].sex,
    51. pc->data[i].tele,
    52. pc->data[i].addr);
    53. if (i == pc->sz - 1)
    54. {
    55. printf("\n");
    56. }
    57. }
    58. }
    59. static int FindByName(Contact* pc, char name[])
    60. {
    61. int i = 0;
    62. for (i = 0; i < pc->sz; i++)
    63. {
    64. if (strcmp(pc->data[i].name, name) == 0)
    65. {
    66. return i;//找到了
    67. }
    68. }
    69. return -1;//找不到
    70. }
    71. void DelContact(Contact* pc)
    72. {
    73. char name[MAX_NAME] = { 0 };
    74. if (pc->sz == 0)
    75. {
    76. printf("通讯录为空,无需删除\n\n");
    77. return;
    78. }
    79. printf("请输入要删除联系人的名字:>");
    80. scanf("%s", name);
    81. //1.查找要删除的联系人
    82. //有或没有
    83. int pos = FindByName(pc, name);
    84. if (pos == -1)
    85. {
    86. printf("要删除的联系人不存在\n\n");
    87. return;
    88. }
    89. //2.删除联系人
    90. else
    91. {
    92. int i = 0;
    93. for (i = pos; i < pc->sz - 1; i++)
    94. {
    95. pc->data[i] = pc->data[i + 1];
    96. }
    97. pc->sz--;
    98. printf("删除成功\n\n");
    99. }
    100. }
    101. void SearchContact(Contact* pc)
    102. {
    103. char name[MAX_NAME] = { 0 };
    104. printf("请输入要查找联系人的名字:>");
    105. scanf("%s", name);
    106. int pos = FindByName(pc, name);
    107. if (pos == -1)
    108. {
    109. printf("要查找的联系人不存在\n\n");
    110. return;
    111. }
    112. else
    113. {
    114. printf("%-20s\t%-5s\t%-5s\t%-12s\t%-20s\n", "名字", "年龄", "性别", "电话", "地址");//左对齐
    115. //打印查找联系人的信息
    116. printf("%-20s\t%-5d\t%-5s\t%-12s\t%-20s\n\n",
    117. pc->data[pos].name,
    118. pc->data[pos].age,
    119. pc->data[pos].sex,
    120. pc->data[pos].tele,
    121. pc->data[pos].addr);
    122. }
    123. }
    124. void ModifyContact(Contact* pc)
    125. {
    126. char name[MAX_NAME] = { 0 };
    127. printf("请输入要修改联系人的名字:>");
    128. scanf("%s", name);
    129. int pos = FindByName(pc, name);
    130. if (pos == -1)
    131. {
    132. printf("要修改的联系人不存在\n\n");
    133. return;
    134. }
    135. else
    136. {
    137. printf("请输入名字:>");
    138. scanf("%s", pc->data[pos].name);
    139. printf("请输入年龄:>");
    140. scanf("%d", &(pc->data[pos].age));
    141. printf("请输入性别:>");
    142. scanf("%s", pc->data[pos].sex);
    143. printf("请输入电话:>");
    144. scanf("%s", pc->data[pos].tele);
    145. printf("请输入地址:>");
    146. scanf("%s", pc->data[pos].addr);
    147. printf("修改成功\n");
    148. }
    149. }
    150. void SortByAgeContatc(Contact* pc)
    151. {
    152. int i = 0, j = 0;
    153. //按照年龄来升序排序
    154. for (i = 0; i < pc->sz-1; i++)
    155. {
    156. for (j = 0; j < pc->sz - 1 - i; j++)
    157. {
    158. if (pc->data[j].age > pc->data[j + 1].age)
    159. {
    160. PeoInfo temp = pc->data[j];
    161. pc->data[j] = pc->data[j + 1];
    162. pc->data[j + 1] = temp;
    163. }
    164. }
    165. }
    166. printf("排序成功\n\n");
    167. }

    分析:源文件contact.c主要负责函数的实现,以及对通讯录进行初始化。

    test.c

    1. #define _CRT_SECURE_NO_WARNINGS 1
    2. //#include
    3. //通讯录
    4. //1.通讯录中能存放一千个人的信息
    5. //每个人的信息:
    6. //名字+年龄+性别+电话+地址
    7. //2.增加联系人信息
    8. //3.删除指定人的信息
    9. //4.修改指定人的信息
    10. //5.查找指定人的信息
    11. //6.排序通讯录的信息
    12. //test.测试通讯录的模块
    13. //contact.h放类型定义、函数声明
    14. //contact.c放函数的实现
    15. void menu()
    16. {
    17. printf("**************************************\n");
    18. printf("******** 1. add 2. del *******\n");
    19. printf("******** 3. search 4. modify *******\n");
    20. printf("******** 5. sort 6 print *******\n");
    21. printf("**********0. exit *******\n");
    22. printf("**************************************\n");
    23. }
    24. enum Option
    25. {
    26. EXIT,
    27. ADD,
    28. DEL,
    29. SEARCH,
    30. MODIFY,
    31. SORT,
    32. PRINT,
    33. };
    34. #include "contact.h"
    35. int main()
    36. {
    37. int input = 0;
    38. //创建通讯录
    39. Contact con;//通讯录
    40. //初始化通讯录
    41. InitContact(&con);
    42. do
    43. {
    44. menu();
    45. printf("请选择:>");
    46. scanf("%d", &input);
    47. switch(input)
    48. {
    49. case EXIT:
    50. printf("退出通讯录\n");
    51. break;
    52. case ADD:
    53. //增加人的信息
    54. AddContact(&con);
    55. break;
    56. case DEL:
    57. //删除人的信息
    58. DelContact(&con);
    59. break;
    60. case SEARCH:
    61. SearchContact(&con);
    62. break;
    63. case MODIFY:
    64. ModifyContact(&con);
    65. break;
    66. case SORT:
    67. SortByAgeContatc(&con);
    68. break;
    69. case PRINT:
    70. PrintContact(&con);
    71. break;
    72. default:
    73. printf("输入错误,请重新输入\n");
    74. break;
    75. }
    76. } while (input);
    77. return 0;
    78. }

    分析:源文件test.c主要是借助do-while语句和switch语句来实现我们对功能的选择,同时还利用了枚举的优势,达到见文思意的效果。

      以上就是静态通讯录的基本介绍了。 

    动态通讯录

      动态通讯录在静态通讯录的基础上,借助动态内存开辟的知识很好地解决了静态通讯录不够灵活的问题。相较于静态通讯录,动态通讯录的结构体多了变量capacity,来实时记录通讯录的最大容量。如果联系人的数量超过了最大容量,通讯录将会自动增容。值得注意的是,动态通讯录使用了动态内存开辟函数,所以在程序结束的时候,我们要利用free函数将动态开辟的内存释放掉。

    contact.h

    1. #define _CRT_SECURE_NO_WARNINGS 1
    2. #include
    3. #include
    4. #include
    5. #define MAX_NAME 20
    6. #define MAX_SEX 20
    7. #define MAX_TELE 12
    8. #define MAX_ADDR 30
    9. #define MAX 1000
    10. #define DEFAULT_SZ 3 //初始容量
    11. #define INC_SZ 2 //增量
    12. //类型的定义
    13. typedef struct PeoInfo
    14. {
    15. char name[MAX_NAME];
    16. char sex[MAX_SEX];
    17. int age;
    18. char tele[MAX_TELE];
    19. char addr[MAX_ADDR];
    20. }PeoInfo;
    21. //动态版本
    22. typedef struct Contact
    23. {
    24. PeoInfo* data;//指向动态申请的空间,用来存放联系人的信息
    25. int sz;//记录的是当前通讯录中有效信息的个数
    26. int capacity;//记录当前通讯录的最大容量
    27. }Contact;
    28. //初始化通讯录
    29. void InitContact(Contact* pc);
    30. //增加联系人信息
    31. void AddContact(Contact* pc);
    32. //打印联系人信息
    33. void PrintContact(const Contact* pc);
    34. //删除联系人信息
    35. void DelContact(Contact* pc);
    36. //查找指定联系人
    37. void SearchContact(Contact* pc);
    38. //修改指定联系人
    39. void ModifyContact(Contact* pc);
    40. //按年龄排序
    41. void SortByAgeContatc(Contact* pc);
    42. void DestoryContact(Contact* pc);

     contact.c

    1. #define _CRT_SECURE_NO_WARNINGS 1
    2. #include "contact.h"
    3. //动态版本初始化
    4. void InitContact(Contact* pc)
    5. {
    6. pc->data = (PeoInfo*)malloc(DEFAULT_SZ * sizeof(PeoInfo));
    7. if (pc->data == NULL)
    8. {
    9. perror("InitContact");
    10. return;
    11. }
    12. pc->sz = 0;//初始化后默认为0
    13. pc->capacity = DEFAULT_SZ;
    14. }
    15. //动态版本的增加联系人
    16. void AddContact(Contact* pc)
    17. {
    18. //考虑增容
    19. if (pc->sz == pc->capacity)
    20. {
    21. PeoInfo* ptr = (PeoInfo*)realloc(pc->data, (pc->capacity + INC_SZ) * sizeof(PeoInfo));
    22. if (ptr != NULL)
    23. {
    24. pc->data = ptr;
    25. pc->capacity += INC_SZ;
    26. printf("增容成功\n");
    27. }
    28. else
    29. {
    30. perror("AddContact");
    31. printf("增加联系人失败\n");
    32. return;
    33. }
    34. }
    35. //增加一个人的信息
    36. printf("请输入名字:>");
    37. scanf("%s", pc->data[pc->sz].name);
    38. printf("请输入年龄:>");
    39. scanf("%d", &(pc->data[pc->sz].age));
    40. printf("请输入性别:>");
    41. scanf("%s", pc->data[pc->sz].sex);
    42. printf("请输入电话:>");
    43. scanf("%s", pc->data[pc->sz].tele);
    44. printf("请输入地址:>");
    45. scanf("%s", pc->data[pc->sz].addr);
    46. pc->sz++;
    47. printf("联系人信息增加成功\n\n");
    48. }
    49. //销毁通讯录
    50. void DestoryContact(Contact* pc)
    51. {
    52. free(pc->data);
    53. pc->data = NULL;
    54. pc->sz = 0;
    55. pc->capacity = 0;
    56. }
    57. void PrintContact(const Contact* pc)
    58. {
    59. int i = 0;
    60. //打印标题
    61. printf("%-20s\t%-5s\t%-5s\t%-12s\t%-20s\n", "名字", "年龄", "性别", "电话", "地址");//左对齐
    62. //打印数据
    63. if (pc->sz == 0)
    64. {
    65. printf("\n");
    66. }
    67. for (i = 0; i < pc->sz; i++)
    68. {
    69. printf("%-20s\t%-5d\t%-5s\t%-12s\t%-20s\n",
    70. pc->data[i].name,
    71. pc->data[i].age,
    72. pc->data[i].sex,
    73. pc->data[i].tele,
    74. pc->data[i].addr);
    75. if (i == pc->sz - 1)
    76. {
    77. printf("\n");
    78. }
    79. }
    80. }
    81. static int FindByName(Contact* pc, char name[])
    82. {
    83. int i = 0;
    84. for (i = 0; i < pc->sz; i++)
    85. {
    86. if (strcmp(pc->data[i].name, name) == 0)
    87. {
    88. return i;//找到了
    89. }
    90. }
    91. return -1;//找不到
    92. }
    93. void DelContact(Contact* pc)
    94. {
    95. char name[MAX_NAME] = { 0 };
    96. if (pc->sz == 0)
    97. {
    98. printf("通讯录为空,无需删除\n\n");
    99. return;
    100. }
    101. printf("请输入要删除联系人的名字:>");
    102. scanf("%s", name);
    103. //1.查找要删除的联系人
    104. //有或没有
    105. int pos = FindByName(pc, name);
    106. if (pos == -1)
    107. {
    108. printf("要删除的联系人不存在\n\n");
    109. return;
    110. }
    111. //2.删除联系人
    112. else
    113. {
    114. int i = 0;
    115. for (i = pos; i < pc->sz - 1; i++)
    116. {
    117. pc->data[i] = pc->data[i + 1];
    118. }
    119. pc->sz--;
    120. printf("删除成功\n\n");
    121. }
    122. }
    123. void SearchContact(Contact* pc)
    124. {
    125. char name[MAX_NAME] = { 0 };
    126. printf("请输入要查找联系人的名字:>");
    127. scanf("%s", name);
    128. int pos = FindByName(pc, name);
    129. if (pos == -1)
    130. {
    131. printf("要查找的联系人不存在\n\n");
    132. return;
    133. }
    134. else
    135. {
    136. printf("%-20s\t%-5s\t%-5s\t%-12s\t%-20s\n", "名字", "年龄", "性别", "电话", "地址");//左对齐
    137. //打印查找联系人的信息
    138. printf("%-20s\t%-5d\t%-5s\t%-12s\t%-20s\n\n",
    139. pc->data[pos].name,
    140. pc->data[pos].age,
    141. pc->data[pos].sex,
    142. pc->data[pos].tele,
    143. pc->data[pos].addr);
    144. }
    145. }
    146. void ModifyContact(Contact* pc)
    147. {
    148. char name[MAX_NAME] = { 0 };
    149. printf("请输入要修改联系人的名字:>");
    150. scanf("%s", name);
    151. int pos = FindByName(pc, name);
    152. if (pos == -1)
    153. {
    154. printf("要修改的联系人不存在\n\n");
    155. return;
    156. }
    157. else
    158. {
    159. printf("请输入名字:>");
    160. scanf("%s", pc->data[pos].name);
    161. printf("请输入年龄:>");
    162. scanf("%d", &(pc->data[pos].age));
    163. printf("请输入性别:>");
    164. scanf("%s", pc->data[pos].sex);
    165. printf("请输入电话:>");
    166. scanf("%s", pc->data[pos].tele);
    167. printf("请输入地址:>");
    168. scanf("%s", pc->data[pos].addr);
    169. printf("修改成功\n");
    170. }
    171. }
    172. void SortByAgeContatc(Contact* pc)
    173. {
    174. int i = 0, j = 0;
    175. //按照年龄来升序排序
    176. for (i = 0; i < pc->sz - 1; i++)
    177. {
    178. for (j = 0; j < pc->sz - 1 - i; j++)
    179. {
    180. if (pc->data[j].age > pc->data[j + 1].age)
    181. {
    182. PeoInfo temp = pc->data[j];
    183. pc->data[j] = pc->data[j + 1];
    184. pc->data[j + 1] = temp;
    185. }
    186. }
    187. }
    188. printf("排序成功\n\n");
    189. }

    test.c 

    1. #define _CRT_SECURE_NO_WARNINGS 1
    2. //通讯录--静态版本
    3. //1.通讯录中能存放一千个人的信息
    4. //每个人的信息:
    5. //名字+年龄+性别+电话+地址
    6. //2.增加联系人信息
    7. //3.删除指定人的信息
    8. //4.修改指定人的信息
    9. //5.查找指定人的信息
    10. //6.排序通讯录的信息
    11. //test.测试通讯录的模块
    12. //contact.h放类型定义、函数声明
    13. //contact.c放函数的实现
    14. //
    15. //版本2:
    16. //动态增长的版本
    17. //1.通讯录初始化后,能存放3个人的信息
    18. //2.当我们空间的存放满的时候,我们增加2个人信息的空间
    19. //3+2+2+2+2....
    20. //
    21. void menu()
    22. {
    23. printf("**************************************\n");
    24. printf("******** 1. add 2. del *******\n");
    25. printf("******** 3. search 4. modify *******\n");
    26. printf("******** 5. sort 6 print *******\n");
    27. printf("**********0. exit *******\n");
    28. printf("**************************************\n\n");
    29. }
    30. enum Option
    31. {
    32. EXIT,
    33. ADD,
    34. DEL,
    35. SEARCH,
    36. MODIFY,
    37. SORT,
    38. PRINT,
    39. };
    40. #include "contact.h"
    41. int main()
    42. {
    43. int input = 0;
    44. //创建通讯录
    45. Contact con;//通讯录
    46. //初始化通讯录
    47. //给data在堆区上申请一块连续的空间
    48. //sz=0
    49. //capacity初始化为当前最大的容量
    50. InitContact(&con);
    51. do
    52. {
    53. menu();
    54. printf("请选择:>");
    55. scanf("%d", &input);
    56. switch (input)
    57. {
    58. case EXIT:
    59. //销毁通讯录
    60. DestoryContact(&con);
    61. printf("退出通讯录\n");
    62. break;
    63. case ADD:
    64. //增加人的信息
    65. AddContact(&con);
    66. break;
    67. case DEL:
    68. //删除人的信息
    69. DelContact(&con);
    70. break;
    71. case SEARCH:
    72. SearchContact(&con);
    73. break;
    74. case MODIFY:
    75. ModifyContact(&con);
    76. break;
    77. case SORT:
    78. SortByAgeContatc(&con);
    79. break;
    80. case PRINT:
    81. PrintContact(&con);
    82. break;
    83. default:
    84. printf("输入错误,请重新输入\n");
    85. break;
    86. }
    87. } while (input);
    88. return 0;
    89. }

    文件通讯录

      在动态通讯录的基础上,文件通讯录能将我们输入的数据保存在一个文件中,从而不会在出现程序结束,数据就会消失的情况了。

    contact.h

    1. #define _CRT_SECURE_NO_WARNINGS 1
    2. #include
    3. #include
    4. #include
    5. #define MAX_NAME 20
    6. #define MAX_SEX 20
    7. #define MAX_TELE 12
    8. #define MAX_ADDR 30
    9. #define MAX 1000
    10. #define DEFAULT_SZ 3 //初始容量
    11. #define INC_SZ 2 //增量
    12. //类型的定义
    13. typedef struct PeoInfo
    14. {
    15. char name[MAX_NAME];
    16. char sex[MAX_SEX];
    17. int age;
    18. char tele[MAX_TELE];
    19. char addr[MAX_ADDR];
    20. }PeoInfo;
    21. //通讯录-静态版本
    22. //typedef struct Contact
    23. //{
    24. // PeoInfo data[MAX];//存放添加进来人的信息
    25. // int sz;//记录的是当前通讯录中有效信息的个数
    26. //}Contact;
    27. //动态版本
    28. typedef struct Contact
    29. {
    30. PeoInfo* data;//指向动态申请的空间,用来存放联系人的信息
    31. int sz;//记录的是当前通讯录中有效信息的个数
    32. int capacity;//记录当前通讯录的最大容量
    33. }Contact;
    34. //初始化通讯录
    35. void InitContact(Contact* pc);
    36. //增加联系人信息
    37. void AddContact(Contact* pc);
    38. //打印联系人信息
    39. void PrintContact(const Contact* pc);
    40. //删除联系人信息
    41. void DelContact(Contact* pc);
    42. //查找指定联系人
    43. void SearchContact(Contact* pc);
    44. //修改指定联系人
    45. void ModifyContact(Contact* pc);
    46. //按年龄排序
    47. void SortByAgeContatc(Contact* pc);
    48. //销毁通讯录
    49. void DestoryContact(Contact* pc);
    50. //保存通讯录信息到文件
    51. void SaveContact(Contact* pc);
    52. //加载文件内容到通讯录
    53. void LoadContact(Contact* pc);
    54. //检测是否需要增容
    55. void CheckCapacity(Contact* pc);

    contact.c

    1. #define _CRT_SECURE_NO_WARNINGS 1
    2. #include "contact.h"
    3. //静态版本
    4. //void InitContact(Contact* pc)
    5. //{
    6. // pc->sz = 0;
    7. // //memset(); -内存设置
    8. // //pc->data为数组名
    9. // //sizeof(数组名),数组名表示的是整个数组,计算的是整个数组的大小
    10. // //&数组名,数组名表示的是整个数组,取出的是数组的地址
    11. // //除此之外,数组名表示的都是数组首元素的地址
    12. // memset(pc->data, 0, sizeof(pc->data));//将通讯录中的数据都设置为0
    13. //}
    14. //加载文件信息到通讯录中
    15. void LoadContact(Contact* pc)
    16. {
    17. FILE* pf = fopen("contact.txt", "r");
    18. if (pf == NULL)
    19. {
    20. perror("LoadContatc");
    21. return;
    22. }
    23. //读文件
    24. PeoInfo temp = { 0 };
    25. while (fread(&temp, sizeof(PeoInfo), 1, pf))
    26. {
    27. //是否需要增容
    28. CheckCapacity(pc);
    29. pc->data[pc->sz] = temp;
    30. pc->sz++;
    31. }
    32. //关闭文件
    33. fclose(pf);
    34. pf = NULL;
    35. }
    36. //动态版本
    37. void InitContact(Contact* pc)
    38. {
    39. pc->data = (PeoInfo*)malloc(DEFAULT_SZ * sizeof(PeoInfo));
    40. if (pc->data == NULL)
    41. {
    42. perror("InitContact");
    43. return;
    44. }
    45. pc->sz = 0;//初始化后默认为0
    46. pc->capacity = DEFAULT_SZ;
    47. //初始化将文件中的信息加载到通讯录中
    48. LoadContact(pc);
    49. }
    50. void 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. pc->data = ptr;
    58. pc->capacity += INC_SZ;
    59. printf("增容成功\n");
    60. }
    61. else
    62. {
    63. perror("AddContact");
    64. printf("增加联系人失败\n");
    65. return;
    66. }
    67. }
    68. }
    69. //动态版本的增加联系人
    70. void AddContact(Contact* pc)
    71. {
    72. //考虑增容
    73. CheckCapacity(pc);
    74. //增加一个人的信息
    75. printf("请输入名字:>");
    76. scanf("%s", pc->data[pc->sz].name);
    77. printf("请输入年龄:>");
    78. scanf("%d", &(pc->data[pc->sz].age));
    79. printf("请输入性别:>");
    80. scanf("%s", pc->data[pc->sz].sex);
    81. printf("请输入电话:>");
    82. scanf("%s", pc->data[pc->sz].tele);
    83. printf("请输入地址:>");
    84. scanf("%s", pc->data[pc->sz].addr);
    85. pc->sz++;
    86. printf("联系人信息增加成功\n\n");
    87. }
    88. //销毁通讯录
    89. void DestoryContact(Contact* pc)
    90. {
    91. free(pc->data);
    92. pc->data = NULL;
    93. pc->sz = 0;
    94. pc->capacity = 0;
    95. }
    96. void SaveContact(Contact* pc)
    97. {
    98. //打开文件
    99. FILE* pf = fopen("contact.txt", "w");
    100. if (pf == NULL)
    101. {
    102. perror("fopen");
    103. return;
    104. }
    105. //写文件
    106. int i = 0;
    107. for (i = 0; i < pc->sz; i++)
    108. {
    109. fwrite(pc->data + i, sizeof(PeoInfo), 1, pf);
    110. }
    111. //关闭文件
    112. fclose(pf);
    113. pf = NULL;
    114. }
    115. void PrintContact(const Contact* pc)
    116. {
    117. int i = 0;
    118. //打印标题
    119. printf("%-20s\t%-5s\t%-5s\t%-12s\t%-20s\n", "名字", "年龄", "性别", "电话", "地址");//左对齐
    120. //打印数据
    121. if (pc->sz == 0)
    122. {
    123. printf("\n");
    124. }
    125. for (i = 0; i < pc->sz; i++)
    126. {
    127. printf("%-20s\t%-5d\t%-5s\t%-12s\t%-20s\n",
    128. pc->data[i].name,
    129. pc->data[i].age,
    130. pc->data[i].sex,
    131. pc->data[i].tele,
    132. pc->data[i].addr);
    133. if (i == pc->sz - 1)
    134. {
    135. printf("\n");
    136. }
    137. }
    138. }
    139. static int FindByName(Contact* pc, char name[])
    140. {
    141. int i = 0;
    142. for (i = 0; i < pc->sz; i++)
    143. {
    144. if (strcmp(pc->data[i].name, name) == 0)
    145. {
    146. return i;//找到了
    147. }
    148. }
    149. return -1;//找不到
    150. }
    151. void DelContact(Contact* pc)
    152. {
    153. char name[MAX_NAME] = { 0 };
    154. if (pc->sz == 0)
    155. {
    156. printf("通讯录为空,无需删除\n\n");
    157. return;
    158. }
    159. printf("请输入要删除联系人的名字:>");
    160. scanf("%s", name);
    161. //1.查找要删除的联系人
    162. //有或没有
    163. int pos = FindByName(pc, name);
    164. if (pos == -1)
    165. {
    166. printf("要删除的联系人不存在\n\n");
    167. return;
    168. }
    169. //2.删除联系人
    170. else
    171. {
    172. int i = 0;
    173. for (i = pos; i < pc->sz - 1; i++)
    174. {
    175. pc->data[i] = pc->data[i + 1];
    176. }
    177. pc->sz--;
    178. printf("删除成功\n\n");
    179. }
    180. }
    181. void SearchContact(Contact* pc)
    182. {
    183. char name[MAX_NAME] = { 0 };
    184. printf("请输入要查找联系人的名字:>");
    185. scanf("%s", name);
    186. int pos = FindByName(pc, name);
    187. if (pos == -1)
    188. {
    189. printf("要查找的联系人不存在\n\n");
    190. return;
    191. }
    192. else
    193. {
    194. printf("%-20s\t%-5s\t%-5s\t%-12s\t%-20s\n", "名字", "年龄", "性别", "电话", "地址");//左对齐
    195. //打印查找联系人的信息
    196. printf("%-20s\t%-5d\t%-5s\t%-12s\t%-20s\n\n",
    197. pc->data[pos].name,
    198. pc->data[pos].age,
    199. pc->data[pos].sex,
    200. pc->data[pos].tele,
    201. pc->data[pos].addr);
    202. }
    203. }
    204. void ModifyContact(Contact* pc)
    205. {
    206. char name[MAX_NAME] = { 0 };
    207. printf("请输入要修改联系人的名字:>");
    208. scanf("%s", name);
    209. int pos = FindByName(pc, name);
    210. if (pos == -1)
    211. {
    212. printf("要修改的联系人不存在\n\n");
    213. return;
    214. }
    215. else
    216. {
    217. printf("请输入名字:>");
    218. scanf("%s", pc->data[pos].name);
    219. printf("请输入年龄:>");
    220. scanf("%d", &(pc->data[pos].age));
    221. printf("请输入性别:>");
    222. scanf("%s", pc->data[pos].sex);
    223. printf("请输入电话:>");
    224. scanf("%s", pc->data[pos].tele);
    225. printf("请输入地址:>");
    226. scanf("%s", pc->data[pos].addr);
    227. printf("修改成功\n");
    228. }
    229. }
    230. void SortByAgeContatc(Contact* pc)
    231. {
    232. int i = 0, j = 0;
    233. //按照年龄来升序排序
    234. for (i = 0; i < pc->sz - 1; i++)
    235. {
    236. for (j = 0; j < pc->sz - 1 - i; j++)
    237. {
    238. if (pc->data[j].age > pc->data[j + 1].age)
    239. {
    240. PeoInfo temp = pc->data[j];
    241. pc->data[j] = pc->data[j + 1];
    242. pc->data[j + 1] = temp;
    243. }
    244. }
    245. }
    246. printf("排序成功\n\n");
    247. }

    test.c

    1. #define _CRT_SECURE_NO_WARNINGS 1
    2. //通讯录--静态版本
    3. //1.通讯录中能存放一千个人的信息
    4. //每个人的信息:
    5. //名字+年龄+性别+电话+地址
    6. //2.增加联系人信息
    7. //3.删除指定人的信息
    8. //4.修改指定人的信息
    9. //5.查找指定人的信息
    10. //6.排序通讯录的信息
    11. //test.测试通讯录的模块
    12. //contact.h放类型定义、函数声明
    13. //contact.c放函数的实现
    14. //
    15. //版本2:
    16. //动态增长的版本
    17. //1.通讯录初始化后,能存放3个人的信息
    18. //2.当我们空间的存放满的时候,我们增加2个人信息的空间
    19. //3+2+2+2+2....
    20. //
    21. //版本3
    22. //当通讯录退出的时候,把信息写到文件
    23. //当通讯录初始化的时候,加载文件的信息到通讯录中
    24. void menu()
    25. {
    26. printf("**************************************\n");
    27. printf("******** 1. add 2. del *******\n");
    28. printf("******** 3. search 4. modify *******\n");
    29. printf("******** 5. sort 6 print *******\n");
    30. printf("**********0. exit *******\n");
    31. printf("**************************************\n\n");
    32. }
    33. enum Option
    34. {
    35. EXIT,
    36. ADD,
    37. DEL,
    38. SEARCH,
    39. MODIFY,
    40. SORT,
    41. PRINT,
    42. };
    43. #include "contact.h"
    44. int main()
    45. {
    46. int input = 0;
    47. //创建通讯录
    48. Contact con;//通讯录
    49. //初始化通讯录
    50. //给data在堆区上申请一块连续的空间
    51. //sz=0
    52. //capacity初始化为当前最大的容量
    53. InitContact(&con);
    54. do
    55. {
    56. menu();
    57. printf("请选择:>");
    58. scanf("%d", &input);
    59. switch (input)
    60. {
    61. case EXIT:
    62. //保存信息到文件
    63. SaveContact(&con);
    64. //销毁通讯录
    65. DestoryContact(&con);
    66. printf("退出通讯录\n");
    67. break;
    68. case ADD:
    69. //增加人的信息
    70. AddContact(&con);
    71. break;
    72. case DEL:
    73. //删除人的信息
    74. DelContact(&con);
    75. break;
    76. case SEARCH:
    77. SearchContact(&con);
    78. break;
    79. case MODIFY:
    80. ModifyContact(&con);
    81. break;
    82. case SORT:
    83. SortByAgeContatc(&con);
    84. break;
    85. case PRINT:
    86. PrintContact(&con);
    87. break;
    88. default:
    89. printf("输入错误,请重新输入\n");
    90. break;
    91. }
    92. } while (input);
    93. return 0;
    94. }

      以上就是本篇博客的全部内容了,如果大家觉得有收获的话,可以点个赞支持一下! 

  • 相关阅读:
    【python海洋专题二十五】给南海年平均海流+scale
    场景应用:100亿的数据你怎么排序?昂??你怎么排序啊?你别愣着啊,你说啊?!!!!
    关于GPIO你真的懂了吗?这篇文章都给你整理好了
    视频讲解|3014 含分布式电源的配电网优化重构
    Python确实比较慢,但我不在乎
    svg 学习记录之 viewBox 属性
    Java游戏项目之“超级玛丽”实战教程,终于可以制作属于自己的小游戏了
    OCP安装定制文件准备
    LiveMedia视频中间件如何与第三方系统实现事件录像关联
    阿里云Redis性能压力测试(二十)
  • 原文地址:https://blog.csdn.net/m0_63639164/article/details/125884735