经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C 语言 » 查看文章
C语言实现可排序通讯录的示例代码
来源:jb51  时间:2021/11/29 10:50:39  对本文有异议

1.目的

写一个实用型通讯录,它有如下功能:

显示目录

  1. void ShowMenu()
  2. {
  3. printf("#######################\n");
  4. printf("#1.Add 2.Del 3.Search #\n");
  5. printf("#4.Mod 5.Show 6.Clear #\n");
  6. printf("#7.Sort 0.Exit #\n");
  7. printf("#######################\n");
  8. printf("please select#");
  9. }

1.添加联系人
2.删除联系人
3.查找联系人
4.修改联系人
5.显示通讯录
6.清除通讯录
7.排序通讯录

2.分部流程

1.初始化通讯录

  1. void InitContact(contact_t **ct)
  2. {
  3. *ct = (contact_t *)malloc(sizeof(contact_t) + INIT_NUM*sizeof(person_t));
  4. if (*ct == NULL){
  5. perror("malloc");
  6. exit(1);
  7. }
  8. (*ct)->size = 0;
  9. (*ct)->cap = INIT_NUM;
  10. printf("Using Default Init!\n");
  11. }

2.添加联系人

添加联系人人时要考虑几个问题
1.新加的联系人是否已经存在了
2.通讯录是否已经添加满了 : a.没有满,继续添加 b.满了,实现自动扩容

  1. void AddFriend(contact_t **ct)
  2. {
  3. assert(ct);
  4. //通讯录已经满了呢?自动扩容
  5. if (!IsFull(*ct) || Inc(ct))//如果没有满,则执行后续插入,如果满了,自动扩容&&扩容成功
  6. {
  7. person_t p;
  8. printf("请输入新增用户的姓名:");
  9. scanf("%s", p.name);//name是一个数组
  10. printf("请输入新增用户的性别:");
  11. scanf("%s", p.sex);
  12. printf("请输入新增用户的年纪:");
  13. scanf("%d", &(p.age));
  14. printf("请输入新增用户的电话:");
  15. scanf("%s", p.telphone);
  16. printf("请输入新增用户的地址:");
  17. scanf("%s", p.address);
  18.  
  19. //判定当前用户是否已经存在
  20. if (IsExist(*ct, &p)){
  21. printf("%s 已经存在,请不要重复插入\n", p.name);
  22. return;
  23. }
  24. //(*ct)->friend[(*ct)->size] = p;
  25. memcpy((*ct)->friends + (*ct)->size, &p, sizeof(p));
  26. (*ct)->size += 1;
  27. printf("新增用户%s成功\n", p.name);
  28. }
  29. else{
  30. printf("扩容失败\n");
  31. }
  32. }

在这里插入图片描述

3.判断联系人是否存在

  1. static int IsExist(contact_t *ct, person_t *p){
  2. assert(ct);
  3. assert(p);
  4.  
  5. int i = 0;
  6. for (; i < ct->size; i++){
  7. if (strcmp(ct->friends[i].name, p->name) == 0){
  8. return 1;
  9. }
  10. }
  11. return 0;
  12. }

4.判断通讯录是否已满

  1. static int IsFull(contact_t *ct)
  2. {
  3. return ct->cap == ct->size;
  4. }

5.判断通讯录是否为空

  1. static int IsEmpty(contact_t *ct)
  2. {
  3. return ct->size == 0;
  4. }

6.通讯录扩容

  1. static int Inc(contact_t **ct)
  2. {
  3. assert(ct);
  4. contact_t *ct_temp = (contact_t *)realloc(*ct, sizeof(contact_t) + ((*ct)->cap + INC_SIZE)*sizeof(person_t));
  5. if (ct_temp == NULL){
  6. return 0;
  7. }
  8. *ct = ct_temp;
  9. (*ct)->cap += INC_SIZE;
  10. printf("自动扩容成功\n");
  11. return 1;
  12. }

7.核心函数

实现在通讯录里找到目标联系人,如果有此人,返回这个联系人所在数组中的索引

  1. static int SearchCore(contact_t *ct, const char *name)
  2. {
  3. assert(ct);
  4. assert(name);
  5. int i = 0;
  6. for (; i < ct->size; i++)
  7. {
  8. person_t *p = ct->friends + i;
  9. if (strcmp(name, p->name) == 0){
  10. return i;
  11. }
  12. }
  13. return -1;
  14. }

8.查找联系人

1.先判断是否存在这个联系人
2.存在,输出这个联系人的信息
3.不存在,数组不存此联系人

  1. void SearchFriend(contact_t *ct)
  2. {
  3. assert(ct);
  4. printf("请输入你要查找的人的姓名#");
  5. char name[NAME_SIZE];
  6. scanf("%s", name);
  7. int i = SearchCore(ct, name);
  8. printf("|%-10s|%-10s|%-10s|%-10s|%10s|\n", "姓名", "性别", "年纪", "电话", "地址");
  9. if (i >= 0){
  10. person_t *p = ct->friends + i;
  11. printf("| %-10s | %-10s | %-10d | %-10s | % 10s | \n", p->name, p->sex, p->age, p->telphone, p->address);
  12. }
  13. else{
  14.  
  15. printf("你要查找的人%s不存在\n", name);
  16. }
  17. return;
  18. }

在这里插入图片描述

9.修改联系人

1.在输入想修改的联系人姓名之后,先判断这个联系人是否存在于通讯录中
2.如果存在,定义一个指针指向该联系人存在的位置

  1. void ModFriend(contact_t *ct)
  2. {
  3. assert(ct);
  4. printf("请输入你要修改的人的姓名#");
  5. char name[NAME_SIZE];
  6. scanf("%s", name);
  7. int i = SearchCore(ct, name);
  8. if (i >= 0){
  9. //person_t p;
  10. person_t *p= (ct->friends + i);
  11. printf("请输入修改用户的姓名:");
  12. scanf("%s", p->name);//name是一个数组
  13. printf("请输入修改用户的性别:");
  14. scanf("%s", p->sex);
  15. printf("请输入修改 用户的年纪:");
  16. scanf("%d", &(p->age));
  17. printf("请输入修改用户的电话:");
  18. scanf("%s", p->telphone);
  19. printf("请输入修改用户的地址:");
  20. scanf("%s", p->address);
  21. //(*ct)->friend[(*ct)->size] = p;
  22. memcpy((ct)->friends + (ct)->size, &p, sizeof(p));
  23. printf("修改用户%s成功\n", p->name);
  24. }
  25. else{
  26. printf("你要修改的联系人%s不存在\n",name);
  27. }
  28. }

在这里插入图片描述

10.清空通讯录

只要令size=0,就清空了

  1. void ClearContact(contact_t *ct)
  2. {
  3. assert(ct);
  4. ct->size = 0;
  5. }

11.删除联系人

不考虑顺序问题,可直接让最后一个联系人的信息覆盖此要删除的联系人

  1. void DelFriend(contact_t *ct)
  2. {
  3. assert(ct);
  4. printf("请输入你要删除的人的姓名#");
  5. char name[NAME_SIZE];
  6. scanf("%s", name);
  7. int i = SearchCore(ct, name);
  8. if (i >= 0){
  9. //将最后的人的信息直接覆盖到当前位置
  10. ct->friends[i] = ct->friends[ct->size - 1];
  11. ct->size -= 1;
  12. printf("删除成功\n");
  13. }
  14. else
  15. {
  16. printf("你要删除的人%s不存在\n", name);
  17. }
  18. }

在这里插入图片描述

12.显示通讯录

  1. void ShowContact(contact_t *ct){
  2. assert(ct);
  3. int i = 0;
  4. printf("|cap:%d|size:%d|\n", ct->cap, ct->size);
  5. printf("|%-10s|%-10s|%-10s|%-10s|%10s|\n", "姓名", "性别", "年纪", "电话", "地址");
  6. for (; i < ct->size; i++){
  7. person_t *p = ct->friends + i;
  8. printf("|%-10s|%-10s|%-10d|%-10s|%10s|\n", p->name, p->sex, p->age, p->telphone, p->address);
  9. }
  10. }

在这里插入图片描述

13.比较联系人

  1. static int CmpPerson(const void *p1,const void *p2)
  2. {
  3. assert(p1);
  4. assert(p2);
  5. person_t *_p1 = (person_t *)p1;
  6. person_t *_p2 = (person_t *)p2;
  7.  
  8. return strcmp(_p1->name, _p2->name);
  9. }

14.通讯录排序

  1. void SortContact(contact *ct)
  2. {
  3. assert(ct);
  4. if (!IsEmpty(ct)){
  5. qsort(ct->friends, ct->size, sizeof(person_t), CmpPerson);
  6. }
  7. }

3.总代码展示

main.c

  1. #include "contact.h"
  2.  
  3. void ShowMenu()
  4. {
  5. printf("#######################\n");
  6. printf("#1.Add 2.Del 3.Search #\n");
  7. printf("#4.Mod 5.Show 6.Clear #\n");
  8. printf("#7.Sort 0.Exit #\n");
  9. printf("#######################\n");
  10. printf("please select#");
  11. }
  12. int main(){
  13. contact_t *ct = NULL;
  14. InitContact(&ct);
  15. int quit = 0;
  16. while (!quit){
  17. int select = 0;
  18. ShowMenu();
  19. scanf("%d", &select);
  20.  
  21. switch (select){
  22. case 1:
  23. AddFriend(&ct);//添加用户是要进行自动扩容的
  24. break;
  25. case 2:
  26. DelFriend(ct);
  27. break;
  28. case 3:
  29. SearchFriend(ct);
  30. break;
  31. case 4:
  32. ModFriend(ct);
  33. break;
  34. case 5:
  35. ShowContact(ct);
  36. break;
  37. case 6:
  38. ClearContact(ct);
  39. break;
  40. case 7:
  41. SortContact(ct);
  42. break;
  43. case 0:
  44. //SaveContact(ct);
  45. //break;
  46. return 0;
  47. default:
  48. break;
  49. }
  50. }
  51. //free(ct);
  52. system("pause");
  53. return 0;
  54. }

contact.c

  1. #include "contact.h"
  2.  
  3. //初始化通讯录
  4. void InitContact(contact_t **ct)
  5. {
  6. *ct = (contact_t *)malloc(sizeof(contact_t) + INIT_NUM*sizeof(person_t));
  7. if (*ct == NULL){
  8. perror("malloc");
  9. exit(1);
  10. }
  11. (*ct)->size = 0;
  12. (*ct)->cap = INIT_NUM;
  13. }
  14.  
  15. //判断联系人是否存在
  16. static int IsExist(contact_t *ct, person_t *p){
  17. assert(ct);
  18. assert(p);
  19.  
  20. int i = 0;
  21. for (; i < ct->size; i++){
  22. if (strcmp(ct->friends[i].name, p->name) == 0){
  23. return 1;
  24. }
  25. }
  26. return 0;
  27. }
  28. //
  29. //判断通讯录是否已满
  30. static int IsFull(contact_t *ct)
  31. {
  32. return ct->cap == ct->size;
  33. }
  34. //
  35. //判断通讯录是否为空
  36. static int IsEmpty(contact_t *ct)
  37. {
  38. return ct->size == 0;
  39. }
  40. /
  41. //通讯录扩容
  42. static int Inc(contact_t **ct)
  43. {
  44. assert(ct);
  45. contact_t *ct_temp = (contact_t *)realloc(*ct, sizeof(contact_t) + ((*ct)->cap + INC_SIZE)*sizeof(person_t));
  46. if (ct_temp == NULL){
  47. return 0;
  48. }
  49. *ct = ct_temp;
  50. (*ct)->cap += INC_SIZE;
  51. printf("自动扩容成功\n");
  52. return 1;
  53. }
  54.  
  55. //添加新的联系人
  56. void AddFriend(contact_t **ct)
  57. {
  58. assert(ct);
  59. //通讯录已经满了呢?自动扩容
  60. if (!IsFull(*ct) || Inc(ct))//如果没有满,则执行后续插入,如果满了,自动扩容&&扩容成功
  61. {
  62. person_t p;
  63. printf("请输入新增用户的姓名:");
  64. scanf("%s", p.name);//name是一个数组
  65. printf("请输入新增用户的性别:");
  66. scanf("%s", p.sex);
  67. printf("请输入新增用户的年纪:");
  68. scanf("%d", &(p.age));
  69. printf("请输入新增用户的电话:");
  70. scanf("%s", p.telphone);
  71. printf("请输入新增用户的地址:");
  72. scanf("%s", p.address);
  73.  
  74. //判定当前用户是否已经存在
  75. if (IsExist(*ct, &p)){
  76. printf("%s 已经存在,请不要重复插入\n", p.name);
  77. return;
  78. }
  79. //(*ct)->friend[(*ct)->size] = p;
  80. memcpy((*ct)->friends + (*ct)->size, &p, sizeof(p));
  81. (*ct)->size += 1;
  82. printf("新增用户%s成功\n", p.name);
  83. }
  84. else{
  85. printf("扩容失败\n");
  86. }
  87. }
  88. /
  89. //核心函数
  90. static int SearchCore(contact_t *ct, const char *name)
  91. {
  92. assert(ct);
  93. assert(name);
  94. int i = 0;
  95. for (; i < ct->size; i++)
  96. {
  97. person_t *p = ct->friends + i;
  98. if (strcmp(name, p->name) == 0){
  99. return i;
  100. }
  101. }
  102. return -1;
  103. }
  104. //
  105. //查找联系人
  106. void SearchFriend(contact_t *ct)
  107. {
  108. assert(ct);
  109. printf("请输入你要查找的人的姓名#");
  110. char name[NAME_SIZE];
  111. scanf("%s", name);
  112. int i = SearchCore(ct, name);
  113. printf("|%-10s|%-10s|%-10s|%-10s|%10s|\n", "姓名", "性别", "年纪", "电话", "地址");
  114. if (i >= 0){
  115. person_t *p = ct->friends + i;
  116. printf("| %-10s | %-10s | %-10d | %-10s | % 10s | \n", p->name, p->sex, p->age, p->telphone, p->address);
  117. }
  118. else{
  119.  
  120. printf("你要查找的人%s不存在\n", name);
  121. }
  122. return;
  123. }
  124. //
  125. //修改联系人
  126. void ModFriend(contact_t *ct)
  127. {
  128. assert(ct);
  129. printf("请输入你要修改的人的姓名#");
  130. char name[NAME_SIZE];
  131. scanf("%s", name);
  132. int i = SearchCore(ct, name);
  133. if (i >= 0){
  134. //person_t p;
  135. person_t *p= (ct->friends + i);
  136. printf("请输入修改用户的姓名:");
  137. scanf("%s", p->name);//name是一个数组
  138. printf("请输入修改用户的性别:");
  139. scanf("%s", p->sex);
  140. printf("请输入修改 用户的年纪:");
  141. scanf("%d", &(p->age));
  142. printf("请输入修改用户的电话:");
  143. scanf("%s", p->telphone);
  144. printf("请输入修改用户的地址:");
  145. scanf("%s", p->address);
  146. //(*ct)->friend[(*ct)->size] = p;
  147. memcpy((ct)->friends + (ct)->size, &p, sizeof(p));
  148. printf("修改用户%s成功\n", p->name);
  149. }
  150. else{
  151. printf("你要修改的联系人%s不存在\n",name);
  152. }
  153. }
  154.  
  155. //清空通讯录
  156. void ClearContact(contact_t *ct)
  157. {
  158. assert(ct);
  159. ct->size = 0;
  160. }
  161. ///
  162. //删除好友
  163. void DelFriend(contact_t *ct)
  164. {
  165. assert(ct);
  166. printf("请输入你要删除的人的姓名#");
  167. char name[NAME_SIZE];
  168. scanf("%s", name);
  169. int i = SearchCore(ct, name);
  170. if (i >= 0){
  171. //将最后的人的信息直接覆盖到当前位置
  172. ct->friends[i] = ct->friends[ct->size - 1];
  173. ct->size -= 1;
  174. printf("删除成功\n");
  175. }
  176. else
  177. {
  178. printf("你要删除的人%s不存在\n", name);
  179. }
  180. }
  181. //
  182. //显示通讯录
  183. void ShowContact(contact_t *ct){
  184. assert(ct);
  185. int i = 0;
  186. printf("|cap:%d|size:%d|\n", ct->cap, ct->size);
  187. printf("|%-10s|%-10s|%-10d|%-10s|%10s|\n", "姓名", "性别", "年纪", "电话", "地址");
  188. for (; i < ct->size; i++){
  189. person_t *p = ct->friends + i;
  190. printf("|%-10s|%-10s|%-10d|%-10s|%10s|\n", p->name, p->sex, p->age, p->telphone, p->address);
  191. }
  192. }
  193.  
  194. //比较联系人
  195. static int CmpPerson(const void *p1,const void *p2)
  196. {
  197. assert(p1);
  198. assert(p2);
  199. person_t *_p1 = (person_t *)p1;
  200. person_t *_p2 = (person_t *)p2;
  201.  
  202. return strcmp(_p1->name, _p2->name);
  203. }
  204. /
  205. //通讯录排序
  206. void SortContact(contact *ct)
  207. {
  208. assert(ct);
  209. if (!IsEmpty(ct)){
  210. qsort(ct->friends, ct->size, sizeof(person_t), CmpPerson);
  211. }
  212. }

contact.h

  1. #ifndef _CINTACT_H_
  2. #define _CONTACT_H_
  3.  
  4. //person 内部的元素的大小
  5. #define NAME_SIZE 32
  6. #define SEX_SIZE 8
  7. #define TELPHONE_SIZE 16
  8. #define ADDRESS_SIZE 128
  9.  
  10. #include <stdio.h>
  11. #include <Windows.h>
  12. #include <assert.h>
  13. #pragma warning(disable:4996)
  14.  
  15. //通讯的初始信息
  16. #define INIT_NUM 1000//通讯录初始大小
  17. #define INC_SIZE 5//每次扩容扩5个
  18.  
  19. //文件信息
  20. #define SAVE_FILE "save.txt"
  21.  
  22. typedef struct person{
  23. char name[NAME_SIZE];
  24. char sex[SEX_SIZE];
  25. int age;
  26. char telphone[TELPHONE_SIZE];
  27. char address[ADDRESS_SIZE];
  28. //int ok;
  29. }person_t;
  30.  
  31. typedef struct contact{
  32. FILE *save;
  33. int cap; //容量
  34. int size; //当前有效好友
  35. person_t friends[0];//柔性数组
  36. }contact_t;
  37.  
  38.  
  39. void InitContact(contact_t **ct);
  40. void AddFriend(contact_t **ct);
  41. void ShowContact(contact_t *ct);
  42. void ModFriend(contact_t *ct);
  43. void SearchFriend(contact_t *ct);
  44. void ClearContact(contact_t *ct);
  45. void DelFriend(contact_t *ct);
  46. void SortContact(contact_t *ct);
  47. #endif

到此这篇关于C语言实现可排序通讯录的示例代码的文章就介绍到这了,更多相关C语言 可排序通讯录内容请搜索w3xue以前的文章或继续浏览下面的相关文章希望大家以后多多支持w3xue!

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号