Fork me on GitHub

创建动态通讯录

今天我们用自定义类型和动态内存管理实现一个通讯录程序,能够实现以下要求:

  1. 添加联系人信息
  2. 删除指定联系人信息
  3. 查找指定联系人信息
  4. 修改指定联系人信息
  5. 显示所有联系人信息
  6. 清空所有联系人
  7. 以名字排序所有联系人

头文件 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
48
49
#ifndef __TEST_H__
#define __TEST_H__
#pragma once
//2.实现一个通讯录;
//通讯录可以用来存储1000个人的信息,每个人的信息包括:
//姓名、性别、年龄、电话、住址
//
//提供方法:
//1. 添加联系人信息
//2. 删除指定联系人信息
//3. 查找指定联系人信息
//4. 修改指定联系人信息
//5. 显示所有联系人信息
//6. 清空所有联系人
//7. 以名字排序所有联系人
#include<stdio.h>
#include<string.h>
#include<assert.h>
#include<stdlib.h>
#include<math.h>
#include <windows.h>
#include<time.h>
#define Filename "Contact.txt"
typedef struct PERSON
{
char Name[20];
char Sex[5];
int Age;
char Tel[20];
char Address[50];

}Person;

typedef struct BOOK
{
int max; //当前上限
int count; //当前已存储人数
Person* Data;
}Book;
void Initbook(Book* people);
void Add_person(Book * people);
void show_person(Book* people);
void Del_person(Book* people);
void Find_person(Book* people);
void Change_person(Book* people);
void BubbleSort_person(Book* people);
void Req_mem(Book* people);
void Desbook(Book* people);
#endif //__TEST_H__

源文件 Test.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
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
#include "test.h"
//仅查找
static int find_person(Book* people)
{
int i = 0;
assert(people);
char name[20];
printf("\t\t 输入姓名:");
scanf("%s", name);
for (; i<people->count; i++)
{
if (strcmp(people->Data[i].Name, name) == 0)
{
return i;
}
}
//printf("没有找到该联系人!\n");
//system("pause");
return -1;
}
//加载文件
void load(Book*people)
{
FILE* op = fopen(Filename, "a+");
FILE* load = fopen(Filename,"r");
fclose(op);
if (load == NULL)
{
perror("load file,please try again");
exit(1);
}
while (fread(&(people->Data[people->count]), sizeof(Person), 1, load))
{
people->count++;
Req_mem(people);
}
fclose(load);
load = NULL;
}
//保存文件
void save(Book*people)
{
int i = 0;
FILE* save = fopen(Filename,"w");
if (save == NULL)
{
perror("save file");
exit(1);
}
while (i<people->count)
{
fwrite(&(people->Data[i]), sizeof(Person), 1, save);
i++;
}
//fwrite(people->Data, sizeof(Person), (size_t)people->count, save);
fclose(save);
save = NULL;
}
//初始化
void Initbook(Book* people)
{
(people)->Data = (Person*)malloc(2*sizeof(Person));
(people)->count = 0;
(people)->max = 2;
load(people);
}
//清空
void Desbook(Book* people)
{
free(people->Data);
people->Data = NULL;
people->max = 0;
people->count = 0;
save(people);
printf("\t\t 清空完毕!\n");
Sleep(300);
}
//打印
void show_person(Book* people)
{
int i = 0;
if (people == NULL)
{
printf("\t\t 空通讯录!\n\t\t ");
system("pause");
return;
}
if (people->count == 0)
{
printf("\t\t 空通讯录!\n\t\t ");
system("pause");
return;
}
printf("\t\t |%-15s\t|%-5s\t|%-5s\t|%-15s\t|%-20s\n", "姓名", "性别", "年龄", "电话", "地址");
for (; i<=people->count-1; ++i)
{
printf("\t\t |%-15s\t", people->Data[i].Name);
printf("|%-5s\t", people->Data[i].Sex);
printf("|%-5d\t", people->Data[i].Age);
printf("|%-15s\t", people->Data[i].Tel);
printf("|%-20s\n", people->Data[i].Address);
}
printf("\n\t\t ");
system("pause");
}

//申请内存
void Req_mem(Book *people)
{
Person* p;
if (people->count < people->max - 1)return;
p = (Person*)realloc((people)->Data,((people)->max+=5)*sizeof(Person));
if (p != NULL)
{
(people)->Data = p;
return;
}
else
{
perror("realloc");
exit(EXIT_FAILURE);
}
}
//增加成员
void Add_person(Book *people)
{
int i = 0;
assert(people);
if ((people)->count == 1000)
{
printf("\t\t 通讯录已满!\n");
return;
}
Req_mem(people);
printf("\t\t 请输入姓名:>");
scanf("%s", ((people)->Data[(people)->count]).Name);
printf("\t\t 请输入性别:>");
scanf("%s", ((people)->Data[(people)->count]).Sex);
printf("\t\t 请输入年龄:>");
scanf("%d", &((people)->Data[(people)->count]).Age);
printf("\t\t 请输入联系方式:>");
scanf("%s", ((people)->Data[(people)->count]).Tel);
for (; i<(people)->count; ++i)
{
if (strcmp((people)->Data[i].Tel, (people)->Data[(people)->count].Tel) == 0)
{
printf("\t\t 联系人已存在!\n\t\t ");
system("pause");
return;
}
}
printf("\t\t 请输入住址:>");
scanf("%s", ((people)->Data[(people)->count]).Address);
printf("\t\t 增加成功!\n");
Sleep(300);
(people)->count++;
//printf("count = %d\n", (*people)->count);

}
//删除成员
void Del_person(Book* people)
{
if (people->count == 0)
{
printf("\t\t 空通讯录!\n\t\t ");
system("pause");
return;
}
int ret = find_person(people);
if (ret != -1)
{
int i = ret;
for (; i<people->count-1; ++i)
{
people->Data[i] = people->Data[i + 1];
}
people->count--;
}
else
{
printf("\t\t 没有该成员!\n");
system("pause");
}
}

//查找成员
void Find_person(Book* people)
{
int i = 0;
char name[20];
if (people->count == 0)
{
printf("\t\t 空通讯录!\n\t\t ");
system("pause");
return;
}
assert(people);
printf("\t\t 输入姓名:");
scanf("%s", name);

for (; i<people->count; ++i)
{
if (strcmp(people->Data[i].Name, name) == 0)
{
printf("\t\t Name:%s\n\t\t Sex:%s\n\t\t Age:%d\n\t\t Tel:%s\n\t\t Add:%s\n\t\t ",
people->Data[i].Name,
people->Data[i].Sex,
people->Data[i].Age,
people->Data[i].Tel,
people->Data[i].Address);
//printf("编号为 %d\n", i);
system("pause");
return;
}
}
printf("\t\t 没有找到该联系人!\n\t\t ");
system("pause");
return ;
}

//修改成员
void Change_person(Book* people)
{
assert(people);
int ret = find_person(people);
if (ret != -1)
{
printf("\t\t Name->:");
scanf("%s", people->Data[ret].Name);
printf("\t\t Sex->:");
scanf("%s", people->Data[ret].Sex);
printf("\t\t Age->:");
scanf("%d", &(people->Data[ret]).Age);
printf("\t\t Tel->:");
scanf("%s", people->Data[ret].Tel);
printf("\t\t Add->:");
scanf("%s", people->Data[ret].Address);
}
else
{
printf("\t\t 没有该成员!\n");
system("pause");
return;
}
}
//排序
void BubbleSort_person(Book* people)
{
if (people == NULL)
{
printf("\t\t 空通讯录!\n\t\t ");
system("pause");
return;
}
int i = 0;
for (; i<people->count - 1; ++i)
{
int j = 0;
for (; j<people->count - 1 - i; ++j)
{
if (strcmp(people->Data[j].Name, people->Data[j + 1].Name) > 0)
{
Person tmp = people->Data[j];
people->Data[j] = people->Data[j + 1];
people->Data[j+1] = tmp;
}
}
}
show_person(people);
}
void color() //自定义函根据参数改变颜色
{
//static int x = 9;
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), rand()%7+9); //只有一个参数,改变字体颜色
//if (x == 16)
// x = 9;
}
//static void change_color()
//{
// static int i = 0;
// char *str[20];
// sprintf((char*)str, "color %x%x",0,15 - i);
// system((const char*)str);
// i++;
// if (15 == i)
// i = 0;
//}

void menu()
{
system("cls");
printf("\t\t ******************************通讯录管理系统*****************************\n\n");
color();
printf("\t\t **************1.添加联系人**********************2.删除联系人*************\n\n");
color();
printf("\t\t **************3.查找联系人**********************4.修改联系人*************\n\n");
color();
printf("\t\t **************5.显示联系人**********************6.清空联系人*************\n\n");
color();
printf("\t\t **************7.排序联系人**********************0.退出此程序*************\n\n");
color();
printf("\t\t *************************************************************************\n\n");
}

int main()
{
srand((size_t)time(NULL));
Book people;
Initbook(&people);
while (1)
{
//change_color();
menu();
int n = 0;
printf("\t\t 请选择:> ");
scanf("%d", &n);
switch (n)
{
case 1:
Add_person(&people);
break;
case 2:
Del_person(&people);
break;
case 3:
Find_person(&people);
break;
case 4:
Change_person(&people);
break;
case 5:
show_person(&people);
break;
case 6:
Desbook(&people);
Initbook(&people);
break;
case 7:
BubbleSort_person(&people);
break;
case 0:
save(&people);
free((&people)->Data);
color();
printf("\t\t 感谢您的使用,再见!");
Sleep(800);
exit(0);
default:
{
printf("\t\t input error!\n\t\t ");
system("pause");
break;
}
}
}
return 0;
}

这个通讯录我加入了一点花里胡哨的元素:每次操作完毕都会使背景变色,你可以试试哦~~
修订信息:于2018.5.31加入文件保存功能。

-------------本文结束感谢您的阅读-------------
坚持原创技术分享,您的支持将鼓励我继续创作!