1.目的
写一个实用型通讯录,它有如下功能:
显示目录
复制代码
1
2
3
4
5
6
7
8
9void ShowMenu() { printf("#######################n"); printf("#1.Add 2.Del 3.Search #n"); printf("#4.Mod 5.Show 6.Clear #n"); printf("#7.Sort 0.Exit #n"); printf("#######################n"); printf("please select#"); }
1.添加联系人
2.删除联系人
3.查找联系人
4.修改联系人
5.显示通讯录
6.清除通讯录
7.排序通讯录
2.分部流程
1.初始化通讯录
复制代码
1
2
3
4
5
6
7
8
9
10
11void InitContact(contact_t **ct) { *ct = (contact_t *)malloc(sizeof(contact_t) + INIT_NUM*sizeof(person_t)); if (*ct == NULL){ perror("malloc"); exit(1); } (*ct)->size = 0; (*ct)->cap = INIT_NUM; printf("Using Default Init!n"); }
2.添加联系人
添加联系人人时要考虑几个问题
1.新加的联系人是否已经存在了
2.通讯录是否已经添加满了 : a.没有满,继续添加 b.满了,实现自动扩容
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32void AddFriend(contact_t **ct) { assert(ct); //通讯录已经满了呢?自动扩容 if (!IsFull(*ct) || Inc(ct))//如果没有满,则执行后续插入,如果满了,自动扩容&&扩容成功 { person_t p; printf("请输入新增用户的姓名:"); scanf("%s", p.name);//name是一个数组 printf("请输入新增用户的性别:"); scanf("%s", p.sex); printf("请输入新增用户的年纪:"); scanf("%d", &(p.age)); printf("请输入新增用户的电话:"); scanf("%s", p.telphone); printf("请输入新增用户的地址:"); scanf("%s", p.address); //判定当前用户是否已经存在 if (IsExist(*ct, &p)){ printf("%s 已经存在,请不要重复插入n", p.name); return; } //(*ct)->friend[(*ct)->size] = p; memcpy((*ct)->friends + (*ct)->size, &p, sizeof(p)); (*ct)->size += 1; printf("新增用户%s成功n", p.name); } else{ printf("扩容失败n"); } }
3.判断联系人是否存在
复制代码
1
2
3
4
5
6
7
8
9
10
11
12static int IsExist(contact_t *ct, person_t *p){ assert(ct); assert(p); int i = 0; for (; i < ct->size; i++){ if (strcmp(ct->friends[i].name, p->name) == 0){ return 1; } } return 0; }
4.判断通讯录是否已满
复制代码
1
2
3
4static int IsFull(contact_t *ct) { return ct->cap == ct->size; }
5.判断通讯录是否为空
复制代码
1
2
3
4static int IsEmpty(contact_t *ct) { return ct->size == 0; }
6.通讯录扩容
复制代码
1
2
3
4
5
6
7
8
9
10
11
12static int Inc(contact_t **ct) { assert(ct); contact_t *ct_temp = (contact_t *)realloc(*ct, sizeof(contact_t) + ((*ct)->cap + INC_SIZE)*sizeof(person_t)); if (ct_temp == NULL){ return 0; } *ct = ct_temp; (*ct)->cap += INC_SIZE; printf("自动扩容成功n"); return 1; }
7.核心函数
实现在通讯录里找到目标联系人,如果有此人,返回这个联系人所在数组中的索引
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14static int SearchCore(contact_t *ct, const char *name) { assert(ct); assert(name); int i = 0; for (; i < ct->size; i++) { person_t *p = ct->friends + i; if (strcmp(name, p->name) == 0){ return i; } } return -1; }
8.查找联系人
1.先判断是否存在这个联系人
2.存在,输出这个联系人的信息
3.不存在,数组不存此联系人
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18void SearchFriend(contact_t *ct) { assert(ct); printf("请输入你要查找的人的姓名#"); char name[NAME_SIZE]; scanf("%s", name); int i = SearchCore(ct, name); printf("|%-10s|%-10s|%-10s|%-10s|%10s|n", "姓名", "性别", "年纪", "电话", "地址"); if (i >= 0){ person_t *p = ct->friends + i; printf("| %-10s | %-10s | %-10d | %-10s | % 10s | n", p->name, p->sex, p->age, p->telphone, p->address); } else{ printf("你要查找的人%s不存在n", name); } return; }
9.修改联系人
1.在输入想修改的联系人姓名之后,先判断这个联系人是否存在于通讯录中
2.如果存在,定义一个指针指向该联系人存在的位置
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28void ModFriend(contact_t *ct) { assert(ct); printf("请输入你要修改的人的姓名#"); char name[NAME_SIZE]; scanf("%s", name); int i = SearchCore(ct, name); if (i >= 0){ //person_t p; person_t *p= (ct->friends + i); printf("请输入修改用户的姓名:"); scanf("%s", p->name);//name是一个数组 printf("请输入修改用户的性别:"); scanf("%s", p->sex); printf("请输入修改 用户的年纪:"); scanf("%d", &(p->age)); printf("请输入修改用户的电话:"); scanf("%s", p->telphone); printf("请输入修改用户的地址:"); scanf("%s", p->address); //(*ct)->friend[(*ct)->size] = p; memcpy((ct)->friends + (ct)->size, &p, sizeof(p)); printf("修改用户%s成功n", p->name); } else{ printf("你要修改的联系人%s不存在n",name); } }
10.清空通讯录
只要令size=0,就清空了
复制代码
1
2
3
4
5void ClearContact(contact_t *ct) { assert(ct); ct->size = 0; }
11.删除联系人
不考虑顺序问题,可直接让最后一个联系人的信息覆盖此要删除的联系人
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18void DelFriend(contact_t *ct) { assert(ct); printf("请输入你要删除的人的姓名#"); char name[NAME_SIZE]; scanf("%s", name); int i = SearchCore(ct, name); if (i >= 0){ //将最后的人的信息直接覆盖到当前位置 ct->friends[i] = ct->friends[ct->size - 1]; ct->size -= 1; printf("删除成功n"); } else { printf("你要删除的人%s不存在n", name); } }
12.显示通讯录
复制代码
1
2
3
4
5
6
7
8
9
10void ShowContact(contact_t *ct){ assert(ct); int i = 0; printf("|cap:%d|size:%d|n", ct->cap, ct->size); printf("|%-10s|%-10s|%-10s|%-10s|%10s|n", "姓名", "性别", "年纪", "电话", "地址"); for (; i < ct->size; i++){ person_t *p = ct->friends + i; printf("|%-10s|%-10s|%-10d|%-10s|%10s|n", p->name, p->sex, p->age, p->telphone, p->address); } }
13.比较联系人
复制代码
1
2
3
4
5
6
7
8
9static int CmpPerson(const void *p1,const void *p2) { assert(p1); assert(p2); person_t *_p1 = (person_t *)p1; person_t *_p2 = (person_t *)p2; return strcmp(_p1->name, _p2->name); }
14.通讯录排序
复制代码
1
2
3
4
5
6
7
8void SortContact(contact *ct) { assert(ct); if (!IsEmpty(ct)){ qsort(ct->friends, ct->size, sizeof(person_t), CmpPerson); } }
3.总代码展示
main.c
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54#include "contact.h" void ShowMenu() { printf("#######################n"); printf("#1.Add 2.Del 3.Search #n"); printf("#4.Mod 5.Show 6.Clear #n"); printf("#7.Sort 0.Exit #n"); printf("#######################n"); printf("please select#"); } int main(){ contact_t *ct = NULL; InitContact(&ct); int quit = 0; while (!quit){ int select = 0; ShowMenu(); scanf("%d", &select); switch (select){ case 1: AddFriend(&ct);//添加用户是要进行自动扩容的 break; case 2: DelFriend(ct); break; case 3: SearchFriend(ct); break; case 4: ModFriend(ct); break; case 5: ShowContact(ct); break; case 6: ClearContact(ct); break; case 7: SortContact(ct); break; case 0: //SaveContact(ct); //break; return 0; default: break; } } //free(ct); system("pause"); return 0; }
contact.c
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213#include "contact.h" //初始化通讯录 void InitContact(contact_t **ct) { *ct = (contact_t *)malloc(sizeof(contact_t) + INIT_NUM*sizeof(person_t)); if (*ct == NULL){ perror("malloc"); exit(1); } (*ct)->size = 0; (*ct)->cap = INIT_NUM; } //判断联系人是否存在 static int IsExist(contact_t *ct, person_t *p){ assert(ct); assert(p); int i = 0; for (; i < ct->size; i++){ if (strcmp(ct->friends[i].name, p->name) == 0){ return 1; } } return 0; } // //判断通讯录是否已满 static int IsFull(contact_t *ct) { return ct->cap == ct->size; } // //判断通讯录是否为空 static int IsEmpty(contact_t *ct) { return ct->size == 0; } / //通讯录扩容 static int Inc(contact_t **ct) { assert(ct); contact_t *ct_temp = (contact_t *)realloc(*ct, sizeof(contact_t) + ((*ct)->cap + INC_SIZE)*sizeof(person_t)); if (ct_temp == NULL){ return 0; } *ct = ct_temp; (*ct)->cap += INC_SIZE; printf("自动扩容成功n"); return 1; } //添加新的联系人 void AddFriend(contact_t **ct) { assert(ct); //通讯录已经满了呢?自动扩容 if (!IsFull(*ct) || Inc(ct))//如果没有满,则执行后续插入,如果满了,自动扩容&&扩容成功 { person_t p; printf("请输入新增用户的姓名:"); scanf("%s", p.name);//name是一个数组 printf("请输入新增用户的性别:"); scanf("%s", p.sex); printf("请输入新增用户的年纪:"); scanf("%d", &(p.age)); printf("请输入新增用户的电话:"); scanf("%s", p.telphone); printf("请输入新增用户的地址:"); scanf("%s", p.address); //判定当前用户是否已经存在 if (IsExist(*ct, &p)){ printf("%s 已经存在,请不要重复插入n", p.name); return; } //(*ct)->friend[(*ct)->size] = p; memcpy((*ct)->friends + (*ct)->size, &p, sizeof(p)); (*ct)->size += 1; printf("新增用户%s成功n", p.name); } else{ printf("扩容失败n"); } } / //核心函数 static int SearchCore(contact_t *ct, const char *name) { assert(ct); assert(name); int i = 0; for (; i < ct->size; i++) { person_t *p = ct->friends + i; if (strcmp(name, p->name) == 0){ return i; } } return -1; } // //查找联系人 void SearchFriend(contact_t *ct) { assert(ct); printf("请输入你要查找的人的姓名#"); char name[NAME_SIZE]; scanf("%s", name); int i = SearchCore(ct, name); printf("|%-10s|%-10s|%-10s|%-10s|%10s|n", "姓名", "性别", "年纪", "电话", "地址"); if (i >= 0){ person_t *p = ct->friends + i; printf("| %-10s | %-10s | %-10d | %-10s | % 10s | n", p->name, p->sex, p->age, p->telphone, p->address); } else{ printf("你要查找的人%s不存在n", name); } return; } // //修改联系人 void ModFriend(contact_t *ct) { assert(ct); printf("请输入你要修改的人的姓名#"); char name[NAME_SIZE]; scanf("%s", name); int i = SearchCore(ct, name); if (i >= 0){ //person_t p; person_t *p= (ct->friends + i); printf("请输入修改用户的姓名:"); scanf("%s", p->name);//name是一个数组 printf("请输入修改用户的性别:"); scanf("%s", p->sex); printf("请输入修改 用户的年纪:"); scanf("%d", &(p->age)); printf("请输入修改用户的电话:"); scanf("%s", p->telphone); printf("请输入修改用户的地址:"); scanf("%s", p->address); //(*ct)->friend[(*ct)->size] = p; memcpy((ct)->friends + (ct)->size, &p, sizeof(p)); printf("修改用户%s成功n", p->name); } else{ printf("你要修改的联系人%s不存在n",name); } } //清空通讯录 void ClearContact(contact_t *ct) { assert(ct); ct->size = 0; } /// //删除好友 void DelFriend(contact_t *ct) { assert(ct); printf("请输入你要删除的人的姓名#"); char name[NAME_SIZE]; scanf("%s", name); int i = SearchCore(ct, name); if (i >= 0){ //将最后的人的信息直接覆盖到当前位置 ct->friends[i] = ct->friends[ct->size - 1]; ct->size -= 1; printf("删除成功n"); } else { printf("你要删除的人%s不存在n", name); } } // //显示通讯录 void ShowContact(contact_t *ct){ assert(ct); int i = 0; printf("|cap:%d|size:%d|n", ct->cap, ct->size); printf("|%-10s|%-10s|%-10d|%-10s|%10s|n", "姓名", "性别", "年纪", "电话", "地址"); for (; i < ct->size; i++){ person_t *p = ct->friends + i; printf("|%-10s|%-10s|%-10d|%-10s|%10s|n", p->name, p->sex, p->age, p->telphone, p->address); } } //比较联系人 static int CmpPerson(const void *p1,const void *p2) { assert(p1); assert(p2); person_t *_p1 = (person_t *)p1; person_t *_p2 = (person_t *)p2; return strcmp(_p1->name, _p2->name); } / //通讯录排序 void SortContact(contact *ct) { assert(ct); if (!IsEmpty(ct)){ qsort(ct->friends, ct->size, sizeof(person_t), CmpPerson); } }
contact.h
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47#ifndef _CINTACT_H_ #define _CONTACT_H_ //person 内部的元素的大小 #define NAME_SIZE 32 #define SEX_SIZE 8 #define TELPHONE_SIZE 16 #define ADDRESS_SIZE 128 #include <stdio.h> #include <Windows.h> #include <assert.h> #pragma warning(disable:4996) //通讯的初始信息 #define INIT_NUM 1000//通讯录初始大小 #define INC_SIZE 5//每次扩容扩5个 //文件信息 #define SAVE_FILE "save.txt" typedef struct person{ char name[NAME_SIZE]; char sex[SEX_SIZE]; int age; char telphone[TELPHONE_SIZE]; char address[ADDRESS_SIZE]; //int ok; }person_t; typedef struct contact{ FILE *save; int cap; //容量 int size; //当前有效好友 person_t friends[0];//柔性数组 }contact_t; void InitContact(contact_t **ct); void AddFriend(contact_t **ct); void ShowContact(contact_t *ct); void ModFriend(contact_t *ct); void SearchFriend(contact_t *ct); void ClearContact(contact_t *ct); void DelFriend(contact_t *ct); void SortContact(contact_t *ct); #endif
到此这篇关于C语言实现可排序通讯录的示例代码的文章就介绍到这了,更多相关C语言 可排序通讯录内容请搜索靠谱客以前的文章或继续浏览下面的相关文章希望大家以后多多支持靠谱客!
最后
以上就是妩媚金毛最近收集整理的关于C语言实现可排序通讯录的示例代码的全部内容,更多相关C语言实现可排序通讯录内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复