C语言实现简易通讯录(下)

简介: C语言实现简易通讯录(下)

显示所有联系人的信息


注意数据与表头的对齐

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. }

若有需要完整版的宝子或者在使用时出现了一些问题,都可以评论区评论或私信博主!!!


相关文章
|
4天前
|
C语言
用c语言实现一个通讯录
用c语言实现一个通讯录
12 0
|
4天前
|
存储 C语言
C语言详解【通讯录的实现】
C语言详解【通讯录的实现】
|
4天前
|
存储 XML JSON
【C语言-通讯录的分析与实现】
我们以手机里面的通讯录为例,说明通讯录主要有以下什么功能,我们先用一张简单的图来说明一下
24 0
|
5月前
|
C语言
C语言实现通讯录--动态版
C语言实现通讯录--动态版
35 0
|
4天前
|
C语言
【C语言】动态内存管理基础知识——动态通讯录,如何实现通讯录容量的动态化
动态内存管理的函数有:malloc,calloc,ralloc,free,本文讲解动态内存函数和使用,如何进行动态内存管理,实现通讯录联系人容量的动态化,对常见动态内存错误进行总结。
38 0
|
4天前
|
C语言
C语言进阶第八课 --------通讯录的实现
C语言进阶第八课 --------通讯录的实现
|
4天前
|
存储 算法 C语言
C语言进阶:顺序表(数据结构基础) (以通讯录项目为代码练习)
C语言进阶:顺序表(数据结构基础) (以通讯录项目为代码练习)
|
4天前
通讯录(C语言版)
通讯录(C语言版)
|
4天前
|
程序员 C语言
【C语言实战项目】通讯录(动态增容版)
【C语言实战项目】通讯录(动态增容版)
23 0
|
4天前
|
存储 编译器 C语言
【C语言实战项目】通讯录
【C语言实战项目】通讯录
29 0