用结构体实现通讯录

简介: 🌸通讯录的需求通讯录的功能🐰 通讯录的原码🌸主函数🌸头文件🌸函数实现文件

🚀🚀🚀大家觉不错的话,就恳求大家点点关注,点点小爱心,指点指点🚀🚀🚀

目录

🌸通讯录的需求

通讯录的功能

🐰 通讯录的原码

🌸主函数

🌸头文件

🌸函数实现文件


🌸通讯录的需求

1.人员的姓名

2.人员的年龄

3.人员的性别

4.人员的电话号码

5.人员的地址

实现方法:通讯录初始设置100个人的空间,开辟100个人的空间,创建100个人的结构体数组。我们设置两个结构体,一个保存通讯录的需求,一个保存结构体结构体数组和通讯录的人数。

注意:通讯录初始的存储值是100(结构体数组有100成员),就是说可以存储100个人的信息,有效个数也是从0开始的(pc->sz最开始为0)

通讯录的功能

初始化通讯录:

1. void InitContact(Contact* pc)
2. {
3.     pc->sz=0;
4. memset(pc->data,0,sizeof(pc->data));
5. }

pc->data结构体首元素的地址,sizeof(pc->data)计算的是整个结构体数组的大小,然后用memeset将整个数组初始化为0,别忘了引用头文件#include<string.h>

增加联系人:

void AddContact(Contact* pc);

每个联系人都包含姓名,年龄,性别,电话号码,地址,我们需要一一录入,录入成功后,将有效个数(就是联系人个数)增加一,pc->sz增加一

展示联系人的信息:

void ShowContact(Contact* pc);

就是打印出,通讯录里存在的联系人的所有信息,使用的是循环语句。

删除指定人信息

void DelContact(Contact* pc);

就是我们输入我们想要的查找人的名字,如果通讯录里存在这个人,我就删除这个人的信息。这里实现了一个查找姓名的函数,因为在改变联系人信息功能里也需要实现查找这个功能,所以实现一个函数,减少代码的重叠性。

int Find_name(Contact* pc,char name[])

如果在查找函数中,找到这个人的姓名,我们将返回这个人在结构体数组的位置,就是pc->sz。找到了之后,我们会让后面一个人的信息复制到前一个人的空间里,从要删的人位置开始,直到通讯录要删的人位置以后的人都向前复制了。这样我们就删除指定人的信息。

查找指定人的信息

void SearchContact(Contact* pc);

我们还是需要Find_name这个函数去帮我们找到我想修改人员的名字,返回这个人在结构体的位置(pc->sz),找到之后打印这个人的信息。

改变指定人信息

void ModifyContact(Contact* pc);

我们还是需要Find_name这个函数去帮我们找到我想修改人员的名字,返回这个人在结构体的位置(pc->sz),找到之后直接通过他的位置修改这个人的信息。

给通讯录的人信息排序

void SortContact(Contact* pc,int op);

排序我们使用的系统的自带的qsort给通讯录人员信息进行排序,qsort的原型

qsort(pc->data,pc->sz,sizeof(PeoInfo),cmp_by_name);

qrort函数第一个参数是排序空间的首地址,第二个参数是排序的个数,第三个参数是排序单个元素的大小,第四个元素是排序函数。

我们这里排序有两种选择,一是按照姓名排序,而是按照年龄排序,所以有两个排序函数

1. int cmp_by_name(const void* e1,const void* e2)//按照姓名排序
2. {
3. return strcmp(((PeoInfo*)e1)->name,((PeoInfo*)e2)->name);
4. }
5. 
6. int cmp_by_gae(const void* e1,const void* e2)//按照年龄排序
7. {
8. return ((PeoInfo*)e1)->age-((PeoInfo*)e2)->age;
9. }

🐰 通讯录的原码

🌸主函数

1. #include"test.h"
2. void menu(void)
3. {
4. printf("===========================\n");
5. printf("        1.添加,2.删除       \n");
6. printf("        3.查找,4.改动       \n");
7. printf("        5.展示,6.排序       \n");
8. printf("        0.退出             \n");
9. printf("===========================\n");
10. }
11. enum Option
12. {
13.     EXIT,
14.     ADD,
15.     DEL,
16.     SEARCH,
17.     MODIFY,
18.     SHOW,
19.     SORT,
20. };
21. int main()
22. {
23.     Contact con;
24. InitContact(&con);
25. int input=0;
26. int op=0;
27. do
28.     {
29. menu();
30. printf("请选择\n");
31. scanf("%d",&input);
32. switch(input)
33.         {
34. case ADD:
35. AddContact(&con);
36. break;
37. case DEL:
38. DelContact(&con);
39. break;
40. case SEARCH:
41. SearchContact(&con);
42. break;
43. case MODIFY:
44. ModifyContact(&con);
45. break;
46. case SHOW:
47. ShowContact(&con);
48. break;
49. case SORT:
50. printf("请选择排序方法\n");
51. printf("=========================\n");
52. printf("1.按名字排序     2.按年龄排序\n");
53. printf("=========================\n");
54. scanf("%d",&op);
55. SortContact(&con,op);
56. break;
57. case EXIT:
58. printf("退出通讯录\n");
59. break;
60. default:
61. printf("输入错误\n");
62. break;
63.         }
64.     }while(input);
65. }

🌸头文件

1. #ifndef test_h
2. #define test_h
3. #include <stdio.h>
4. #endif /* test_h */
5. 
6. #include<string.h>
7. #include<stdlib.h>
8. 
9. #define MAX 100
10. #define MAX_NAME 20
11. #define MAX_SEX 5
12. #define MAX_TELE 12
13. #define MAX_ADDR 30
14. typedef struct PeoInfo
15. {
16. char name[MAX_NAME];
17. int age;
18. char sex[MAX_SEX];
19. char tele[MAX_TELE];
20. char addr[MAX_ADDR];
21. }PeoInfo;
22. 
23. typedef struct Contact
24. {
25.     PeoInfo data[MAX];//存放数据
26. int sz;//有效信息的个数
27. }Contact;
28. 
29. 
30. //初始化
31. void InitContact(Contact* pc);
32. //增加指定联系人
33. void AddContact(Contact* pc);
34. //展示联系人的信息
35. void ShowContact(Contact* pc);
36. //删除指定人信息
37. void DelContact(Contact* pc);
38. //查找指定人的信息
39. void SearchContact(Contact* pc);
40. //改变指定人信息
41. void ModifyContact(Contact* pc);
42. //给通讯录的人信息排序
43. void SortContact(Contact* pc,int op);

🌸函数实现文件

1. #include "test.h"
2. void InitContact(Contact* pc)
3. {
4.     pc->sz=0;
5. memset(pc->data,0,sizeof(pc->data));
6. }
7. void AddContact(Contact* pc)
8. {
9. if(pc->sz==MAX)
10.     {
11. printf("通讯录已满,无法增加\n");
12.     }
13. else
14.     {
15. printf("请输入名字\n");
16. scanf("%s",pc->data[pc->sz].name);
17. printf("请输入年龄\n");
18. scanf("%d",&(pc->data[pc->sz].age));
19. printf("请输入性别\n");
20. scanf("%s",pc->data[pc->sz].sex);
21. printf("请输入电话号码\n");
22. scanf("%s",pc->data[pc->sz].tele);
23. printf("请输入地址\n");
24. scanf("%s",pc->data[pc->sz].addr);
25.     }
26.     pc->sz++;
27. printf("添加成功\n");
28. }
29. void ShowContact(Contact* pc)
30. {
31. printf("%-10s %-4s %-5s %-12s %-30s\n","性别","年龄","性别","电话号码","地址");
32. for(int i=0;i<pc->sz;i++)
33.     {
34. printf("%-10s %-4d %-5s %-12s %-30s\n",pc->data[i].name,pc->data[i].age,pc->data[i].sex,pc->data[i].tele,pc->data[i].addr);
35.     }
36. }
37. int Find_name(Contact* pc,char name[])
38. {
39. int i;
40. int pos=-1;
41. for( i=0;i<pc->sz;i++)
42.     {
43. if(strcmp(name,pc->data[i].name)==0)
44.         {
45.             pos=i;
46. break;
47.         }
48.     }
49. return pos;
50. }
51. void DelContact(Contact* pc)
52. {
53. if(pc->sz==0)
54.     {
55. printf("通讯录为空,无法删除\n");
56.     }
57. //删除
58. //1.找到删除人的位置
59. char name[MAX_NAME];
60. int pos=-1;
61. int i;
62. printf("输入删除人的名字;>\n");
63. scanf("%s",name);
64.     pos=Find_name(pc,name);
65. if(pos==-1)
66.     {
67. printf("要删的人不存在\n");
68.     }
69. else{
70. for(i=pos;i<pc->sz-1;i++)
71.         {
72.             pc->data[i]=pc->data[i+1];
73.         }
74.         pc->sz--;
75. printf("删除成功\n");
76.     }
77. }
78. void SearchContact(Contact* pc)
79. {
80. char name[MAX_NAME];
81. printf("输入查找人的名字;>\n");
82. scanf("%s",name);
83. int pos=-1;
84.     pos=Find_name(pc, name);
85. if(pos==-1)
86.     {
87. printf("查找的人不存在\n");
88.     }
89. else
90.     {
91. printf("%-10s %-4s %-5s %-12s %-30s\n","性别","年龄","性别","电话号码","地址");
92. printf("%-10s %-4d %-5s %-12s %-30s\n",pc->data[pos].name,pc->data[pos].age,pc->data[pos].sex,pc->data[pos].tele,pc->data[pos].addr);
93.     }
94. }
95. void ModifyContact(Contact* pc)
96. {
97. char name[MAX_NAME];
98. printf("输入修改人的名字;>\n");
99. scanf("%s",name);
100. int pos=-1;
101.     pos=Find_name(pc, name);
102. if(pos==-1)
103.     {
104. printf("修改人信息不存在\n");
105.     }
106. else
107.     {
108. printf("请输入名字\n");
109. scanf("%s",pc->data[pos].name);
110. printf("请输入年龄\n");
111. scanf("%d",&(pc->data[pos].age));
112. printf("请输入性别\n");
113. scanf("%s",pc->data[pos].sex);
114. printf("请输入电话号码\n");
115. scanf("%s",pc->data[pos].tele);
116. printf("请输入地址\n");
117. scanf("%s",pc->data[pos].addr);
118. printf("修改成功\n");
119.     }
120. }
121. int cmp_by_name(const void* e1,const void* e2)
122. {
123. return strcmp(((PeoInfo*)e1)->name,((PeoInfo*)e2)->name);
124. }
125. int cmp_by_gae(const void* e1,const void* e2)
126. {
127. return ((PeoInfo*)e1)->age-((PeoInfo*)e2)->age;
128. }
129. void SortContact(Contact* pc,int op)
130. {
131. if(op==1)
132.     {
133. qsort(pc->data,pc->sz,sizeof(PeoInfo),cmp_by_name);
134. printf("排序成功\n");
135.     }
136. if(op==2)
137.     {
138. qsort(pc->data,pc->sz,sizeof(PeoInfo),cmp_by_gae);
139. printf("排序成功\n");
140.     }
141. }

🌸🌸🌸如果大家还有不懂或者建议都可以发在评论区,我们共同探讨,共同学习,共同进步。谢谢大家! 🌸🌸🌸



相关文章
|
4月前
|
存储
基于静态顺序表实现通讯录
基于静态顺序表实现通讯录
|
11月前
简易实现通讯录(1.0)
简易实现通讯录(1.0)
33 0
|
11月前
简易实现通讯录(2.0)
简易实现通讯录(2.0)
36 0
|
4月前
|
存储 C语言
使用结构体数组
使用结构体数组
39 0
|
3月前
结构体\结构体数组
结构体\结构体数组
15 2
26.通讯录的实现
26.通讯录的实现
|
4月前
|
数据管理
【通讯录项目 (3 / 3)】基于顺序表的通讯录实现——通讯录项目实现
通讯录项目我们实现了大部分内容,接下来你可以自行探索,丰富功能。
32 0
|
存储
通讯录实现上
通讯录实现上
通讯录实现上
|
C语言
【纯C实现简易通讯录】
【纯C实现简易通讯录】
49 0
|
4月前
通讯录实现
通讯录实现
34 0