Fork me on GitHub

【C语言】静态(动态)顺序表-通讯录


前言

近期学习了自定义类型结构体以及顺序表,所以就试着利用顺序表模拟实现了一个通讯录。

简要功能如下:

  • 初始化通讯录
  • 添加联系人
  • 查找联系人
  • 删除联系人
  • 修改联系人
  • 按姓名排序
  • 清空联系人
  • 联系人列表
  • 退出

项目效果展示:

图片加载中

图片加载中

图片加载中

图片加载中

静态顺序表

参考代码:

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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
/***********************************************************
* 程序名称:通讯录(静态顺序表) *
* 编译环境:VS2013 *
* 编制日期:2018.5.28 *
* -----by Gbr *
***********************************************************/
#ifndef __CONTACT_H__
#define __CONTACT_H__

#include <stdio.h>
#include <Windows.h>
#include <assert.h>
#include <string.h>

enum OPPTION
{
EXIT,
ADD,
SEARCH,
DEIETE,
MODIFY,
SORT,
SHOW,
EMPTY
};

typedef char datatype;

#define MAX_NAME 10
#define MAX_SEX 5
#define MAX_TEL 11
#define MAX_ADDR 30
#define MAX_SIZE 1000

typedef struct PeoInfo
{
datatype Name[MAX_NAME];
datatype Sex[MAX_SEX];
int age;
datatype Tel[MAX_TEL];
datatype Addr[MAX_ADDR];
}PeoInfo, *pPeoInfo;

typedef struct Contact
{
PeoInfo data[MAX_SIZE];
int size;
}Contact,*pContact;

//初始化通讯录
void InitContact(pContact pc);
//添加联系人
void AddContact(pContact pc);
//查找联系人
int SearchContact(pContact pc);
//删除联系人
void DeleteContact(pContact pc);
//修改联系人
void ModifyContact(pContact pc);
//按姓排序
void SortContact(pContact pc);
//列表联系人
void ShowContact(pContact pc);
//清空联系人
void EmptyContact(pContact pc);



#endif //__CONTACT_H__

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
#define _CRT_SECURE_NO_WARNINGS 1

#include "contact.h"

//初始化通讯录
void InitContact(pContact pc)
{
assert(pc);
pc->size = 0;
memset(pc->data, 0, sizeof(pc->data));
}
//添加联系人
void AddContact(pContact pc)
{
assert(pc);
if (pc->size == MAX_SIZE)
{
printf("\t\t\t空间不足");
return;
}
printf("\t\t\t请输入姓名:>");
scanf("%s", pc->data[pc->size].Name);
printf("\t\t\t请输入性别:>");
scanf("%s", pc->data[pc->size].Sex);
printf("\t\t\t请输入年龄:>");
scanf("%d", &pc->data[pc->size].age);
printf("\t\t\t请输入电话号:>");
scanf("%s", pc->data[pc->size].Tel);
printf("\t\t\t请输入地址:>");
scanf("%s", pc->data[pc->size].Addr);
pc->size++;
printf("\t\t\t添加成功\n");
}
//查找联系人
int SearchContact(pContact pc)
{
char name[MAX_NAME];
int i = 0;
assert(pc);
if (0 == pc->size)
{
printf("\t\t\t无此联系人\n");
return -1;
}
scanf("%s", name);
printf("\t\t\tName\tSex\tAge\tTel\t\tAddr\n");
for (i = 0; i < pc->size; i++)
{
if (0 == strcmp(pc->data[i].Name, name))
{

printf("\t\t\t%-5s\t%-5s\t%-5d\t%-12s\t%-15s\n",
pc->data[i].Name,
pc->data[i].Sex,
pc->data[i].age,
pc->data[i].Tel,
pc->data[i].Addr);
return i;
}
}
printf("\t\t\t无此联系人\n");
return -1;

}
//删除联系人
void DeleteContact(pContact pc)
{
int i = 0;
int num = 0;
assert(pc);
if (0 == pc->size)
{
printf("\t\t\t无联系人\n");
return;
}
num = SearchContact(pc);
if (num != -1)
{
int n = 0;
printf("\t\t\t确定删除? 1.yes, 2.no:>");
scanf("%d", &n);
if (1 == n)
{
for (i = num; i < (pc->size) - 1; i++)
{
pc->data[i] = pc->data[i + 1];

}
pc->size--;
printf("\t\t\t删除成功\n");
}
else
{
return;
}
}

}

//交换
void Swap(pPeoInfo *a, pPeoInfo *b)
{
pPeoInfo *Tmp;
Tmp = *a;
*a = *b;
*b = Tmp;

}


//修改联系人
void ModifyContact(pContact pc)
{
int modify = 0;
assert(pc);
if (0 == pc->size)
{
printf("\t\t\t无联系人\n");
return;
}
modify = SearchContact(pc);
if (modify != -1)
{
int n = 0;
printf("\t\t\t确认修改?1.yes 2.no:>");
scanf("%d", &n);
if (1 == n)
{
printf("\t\t\t请输入姓名:>");
scanf("%s", pc->data[modify].Name);
printf("\t\t\t请输入性别:>");
scanf("%s", pc->data[modify].Sex);
printf("\t\t\t请输入年龄:>");
scanf("%d", &pc->data[modify].age);
printf("\t\t\t请输入电话号:>");
scanf("%s", pc->data[modify].Tel);
printf("\t\t\t请输入地址:>");
scanf("%s", pc->data[modify].Addr);
printf("\t\t\t修改成功\n");


}
else
{
return;
}
}


}
//按姓排序
void SortContact(pContact pc)
{
int i = 0;
int j = 0;
int flag = 0;
assert(pc);
if (0 == pc->size)
{
printf("\t\t\t无联系人\n");
return;
}
// 冒泡次数
for (i = 0; i < pc->size - 1; i++)
{
//冒泡排序
for (j = 0; j < pc->size - i - 1; j++)
{
if (strcmp(pc->data[j].Name,pc->data[j + 1].Name)>0)
{
Swap(&pc->data[j], &pc->data[j + 1]);
flag = 1;
}
}
if (0 == flag)
{
break;
}
}
printf("排序成功\n");
}
//列表联系人
void ShowContact(pContact pc)
{
int i = 0;
assert(pc);
if (0 == pc->size)
{
printf("\t\t\t无联系人\n");
return;
}
printf("\t\t\tName\tSex\tAge\tTel\t\tAddr\n");
for (i = 0; i < pc->size; i++)
{
printf("\t\t\t%-5s\t%-5s\t%-5d\t%-12s\t%-15s\n",
pc->data[i].Name,
pc->data[i].Sex,
pc->data[i].age,
pc->data[i].Tel,
pc->data[i].Addr);

}

}
//清空联系人
void EmptyContact(pContact pc)
{
assert(pc);
pc->size = 0;
printf("清空成功");
}

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

#define _CRT_SECURE_NO_WARNINGS 1

#include "contact.h"
void meau()
{
printf("\t\t\t****** 《通讯录》 ********\n");
printf("\t\t\t****************************************\n");
printf("\t\t\t****** 1.添加信息 2.查找信息******\n");
printf("\t\t\t****** 3.删除信息 4.修改信息******\n");
printf("\t\t\t****** 5.按姓排序 6.信息列表******\n");
printf("\t\t\t****** 7.清空信息 0.退出 ******\n");
printf("\t\t\t****************************************\n");
}

void test()
{
int input = 0;
Contact pc;
InitContact(&pc);
do
{
meau();
printf("\t\t\t请选择:>");
scanf("%d", &input);
switch (input)
{
case ADD:
AddContact(&pc);
break;
case SEARCH:
SearchContact(&pc);
break;
case DEIETE:
DeleteContact(&pc);
break;
case MODIFY:
ModifyContact(&pc);
break;
case SORT:
SortContact(&pc);
break;
case SHOW:
ShowContact(&pc);
break;
case EMPTY:
EmptyContact(&pc);
break;
case EXIT:
exit(0);
break;
default:
printf("\t\t\t输入有误,请重新输入:>");
break;
}

} while (input);

}

int main()
{
test();
system("pause");
return 0;
}

动态顺序表

参考代码

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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
/***********************************************************
* 程序名称:通讯录(静态顺序表) *
* 编译环境:VS2013 *
* 编制日期:2018.5.28 *
* -----by Gbr *
***********************************************************/

#ifndef __CONTACT_H__
#define __CONTACT_H__

#include <stdio.h>
#include <Windows.h>
#include <assert.h>
#include <string.h>
#include <stdlib.h>

enum OPPTION
{
EXIT,
ADD,
SEARCH,
DEIETE,
MODIFY,
SORT,
SHOW,
EMPTY
};

typedef char datatype;

#define MAX_NAME 10
#define MAX_SEX 5
#define MAX_TEL 11
#define MAX_ADDR 30
#define MAX_SIZE 1000

typedef struct PeoInfo
{
datatype Name[MAX_NAME];
datatype Sex[MAX_SEX];
int age;
datatype Tel[MAX_TEL];
datatype Addr[MAX_ADDR];
}PeoInfo, *pPeoInfo;

typedef struct Contact
{
pPeoInfo data;
int size;
int capacity;
}Contact, *pContact;

//初始化通讯录
void InitContact(pContact pc);
//添加联系人
void AddContact(pContact pc);
//删除联系人
void DeleteContact(pContact pc);
//查找联系人
int SearchContact(pContact pc);
//修改联系人
void ModifyContact(pContact pc);
//按姓排序
void SortContact(pContact pc);
//列表联系人
void ShowContact(pContact pc);
//清空联系人
void EmptyContact(pContact pc);
//销毁
void DestoryContact(pContact pc);


#endif //__CONTACT_H__

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
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
#define _CRT_SECURE_NO_WARNINGS 1

#include "contact.h"

//初始化通讯录
void InitContact(pContact pc)
{
assert(pc);
pc->size = 0;
pc->capacity = 3;
pc->data = (pPeoInfo)malloc((pc->capacity)*sizeof(PeoInfo));
if (pc->data == NULL)
{
printf("\t\t\t内存分配失败");
exit(EXIT_FAILURE);
}
memset(pc->data,0,sizeof(pc->data));
}
//检查扩容
void CheckCapacity(pContact pc)
{
assert(pc);
pPeoInfo *p = NULL;
if (pc->size == pc->capacity)
{
p = (pPeoInfo)realloc(pc->data, (pc->capacity + 2)*sizeof(PeoInfo));
if (p != NULL)
{
pc->data = p;

}
else
{
printf("\t\t\t增容失败");
exit(EXIT_FAILURE);
}

pc->capacity += 2;
printf("\t\t\t增容成功\n");
}
}
//添加联系人
void AddContact(pContact pc)
{
assert(pc);
if (pc->size == MAX_SIZE)
{
printf("\t\t\t空间不足");
return;
}
CheckCapacity(pc);
printf("\t\t\t请输入姓名:>");
scanf("%s", pc->data[pc->size].Name);
printf("\t\t\t请输入性别:>");
scanf("%s", pc->data[pc->size].Sex);
printf("\t\t\t请输入年龄:>");
scanf("%d", &pc->data[pc->size].age);
printf("\t\t\t请输入电话号:>");
scanf("%s", pc->data[pc->size].Tel);
printf("\t\t\t请输入地址:>");
scanf("%s", pc->data[pc->size].Addr);
pc->size++;
printf("\t\t\t添加成功\n");
}
//查找联系人
int SearchContact(pContact pc)
{
char name[MAX_NAME];
int i = 0;
assert(pc);
if (0 == pc->size)
{
printf("\t\t\t无此联系人\n");
return -1;
}
printf("\t\t\t");
scanf("%s", name);
printf("\t\t\tName\tSex\tAge\tTel\t\tAddr\n");
for (i = 0; i < pc->size; i++)
{
if (0 == strcmp(pc->data[i].Name, name))
{

printf("\t\t\t%-5s\t%-5s\t%-5d\t%-12s\t%-15s\n",
pc->data[i].Name,
pc->data[i].Sex,
pc->data[i].age,
pc->data[i].Tel,
pc->data[i].Addr);
return i;
}
}
printf("\t\t\t无此联系人\n");
return -1;

}
//删除联系人
void DeleteContact(pContact pc)
{
int i = 0;
int num = 0;
assert(pc);
if (0 == pc->size)
{
printf("\t\t\t无联系人\n");
return;
}
num = SearchContact(pc);
if (num != -1)
{
int n = 0;
printf("\t\t\t确定删除? 1.yes, 2.no:>");
printf("\t\t\t");
scanf("%d", &n);
if (1 == n)
{
for (i = num; i < (pc->size) - 1; i++)
{
pc->data[i] = pc->data[i + 1];

}
pc->size--;
printf("\t\t\t删除成功\n");
}
else
{
return;
}
}

}

//交换
void Swap(pPeoInfo *a, pPeoInfo *b)
{
pPeoInfo *Tmp;
Tmp = *a;
*a = *b;
*b = Tmp;

}


//修改联系人
void ModifyContact(pContact pc)
{
int modify = 0;
assert(pc);
if (0 == pc->size)
{
printf("\t\t\t无联系人\n");
return;
}
modify = SearchContact(pc);
if (modify != -1)
{
int n = 0;
printf("\t\t\t确认修改?1.yes 2.no:>");
printf("\t\t\t");
scanf("%d", &n);
if (1 == n)
{
printf("\t\t\t请输入姓名:>");
scanf("%s", pc->data[modify].Name);
printf("\t\t\t请输入性别:>");
scanf("%s", pc->data[modify].Sex);
printf("\t\t\t请输入年龄:>");
scanf("%d", &pc->data[modify].age);
printf("\t\t\t请输入电话号:>");
scanf("%s", pc->data[modify].Tel);
printf("\t\t\t请输入地址:>");
scanf("%s", pc->data[modify].Addr);
printf("\t\t\t修改成功\n");


}
else
{
return;
}
}


}
//按姓排序
void SortContact(pContact pc)
{
int i = 0;
int j = 0;
int flag = 0;
assert(pc);
if (0 == pc->size)
{
printf("\t\t\t无联系人\n");
return;
}
// 冒泡次数
for (i = 0; i < pc->size - 1; i++)
{
//冒泡排序
for (j = 0; j < pc->size - i - 1; j++)
{
if (strcmp(pc->data[j].Name, pc->data[j + 1].Name)>0)
{
Swap(&pc->data[j], &pc->data[j + 1]);
flag = 1;
}
}
if (0 == flag)
{
break;
}
}
printf("排序成功\n");
}
//列表联系人
void ShowContact(pContact pc)
{
int i = 0;
assert(pc);
if (0 == pc->size)
{
printf("\t\t\t无联系人\n");
return;
}
printf("\t\t\tName\tSex\tAge\tTel\t\tAddr\n");
for (i = 0; i < pc->size; i++)
{
printf("\t\t\t%-5s\t%-5s\t%-5d\t%-12s\t%-15s\n",
pc->data[i].Name,
pc->data[i].Sex,
pc->data[i].age,
pc->data[i].Tel,
pc->data[i].Addr);

}

}
//清空联系人
void EmptyContact(pContact pc)
{
assert(pc);
pc->size = 0;
printf("\t\t\t清空成功");
}
//销毁通讯录
void DestoryContact(pContact pc)
{
assert(pc);
free(pc->data);
pc->data = NULL;
pc->capacity = 0;
pc->size = 0;
printf("\t\t\t销毁成功");
}

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

#define _CRT_SECURE_NO_WARNINGS 1

#include "contact.h"
void meau()
{
printf("\t\t\t****** 《通讯录》 ********\n");
printf("\t\t\t****************************************\n");
printf("\t\t\t****** 1.添加信息 2.查找信息******\n");
printf("\t\t\t****** 3.删除信息 4.修改信息******\n");
printf("\t\t\t****** 5.按姓排序 6.信息列表******\n");
printf("\t\t\t****** 7.清空信息 0.退出 ******\n");
printf("\t\t\t****************************************\n");
}

void test()
{
int input = 0;
Contact pc;
InitContact(&pc);
do
{
meau();
printf("\t\t\t请选择:>");
scanf("%d", &input);
switch (input)
{
case ADD:
AddContact(&pc);
break;
case SEARCH:
SearchContact(&pc);
break;
case DEIETE:
DeleteContact(&pc);
break;
case MODIFY:
ModifyContact(&pc);
break;
case SORT:
SortContact(&pc);
break;
case SHOW:
ShowContact(&pc);
break;
case EMPTY:
EmptyContact(&pc);
break;
case EXIT:
exit(1);
break;
default:
printf("\t\t\t输入有误,请重新输入:>");
break;
}

} while (input);

}

int main()
{
Contact pc;
test();
//销毁通讯录
DestoryContact(&pc);
system("pause");
return 0;
}

结语

今天简单实现了基于静态(动态)顺序表的通讯录,需再努力继续实现链表通讯录。

不忘初心,方得始终!

-------------本文结束感谢您的阅读-------------