我们先可以简单的写出一个整体的大纲
//首先是创建一个联系人的信息,用一个结构体表示出来
typedef struct PersonInfo
{
//一个联系人的信息
char name[1024];
char sex[1024];
char age[1024];
char phone[1024];
char addrss[1024];
char company[1024];
}PersonInfo;
{
//一个联系人的信息
char name[1024];
char sex[1024];
char age[1024];
char phone[1024];
char addrss[1024];
char company[1024];
}PersonInfo;
其次是在创建一个结构体,将每个联系人都存放在里面
typedef struct Book
{
//可以容纳联系人的个数
PersonInfo book[MAX_PERSONINFO];//这里MAX_PERSONINFO是指想要创建一个存放多少人的通讯录
int size;//通讯录的有效区间
}Book;
{
//可以容纳联系人的个数
PersonInfo book[MAX_PERSONINFO];//这里MAX_PERSONINFO是指想要创建一个存放多少人的通讯录
int size;//通讯录的有效区间
}Book;
Book g_person_book;
在制作一个简易的菜单,实现显示功能
int Menu()
{
printf("通讯录! ");
printf("================================ ");
printf("1.新增联系人 ");
printf("2.查找联系人 ");
printf("3.删除联系人 ");
printf("4.修改联系人 ");
printf("5.排序联系人 ");
printf("6.查看全部联系人 ");
printf("7.清空全部联系人 ");
printf("0.退出 ");
printf("================================ ");
int choice = 0;
printf("请输入您的选择:");
scanf("%d",&choice);
return choice;
}
int Menu()
{
printf("通讯录! ");
printf("================================ ");
printf("1.新增联系人 ");
printf("2.查找联系人 ");
printf("3.删除联系人 ");
printf("4.修改联系人 ");
printf("5.排序联系人 ");
printf("6.查看全部联系人 ");
printf("7.清空全部联系人 ");
printf("0.退出 ");
printf("================================ ");
int choice = 0;
printf("请输入您的选择:");
scanf("%d",&choice);
return choice;
}
接下来就完成具体的通讯录功能的实现
//所有的函数在传入的参数为指针的时候都需要进行非空的判定
void Init(Book* person_book)
{
assert(person_book != NULL);
{
assert(person_book != NULL);
}
void Add_PersonInfo(Book* person_book)
{
assert(Add_PersonInfo != NULL);
{
assert(Add_PersonInfo != NULL);
}
void Find_PersonInfo(Book* person_book)
{
assert(person_book != NULL);
{
assert(person_book != NULL);
}
void Del_PersonInfo(Book* person_book)
{
assert(person_book != NULL);
{
assert(person_book != NULL);
}
void Modify_PersonInfo(Book* person_book)
{
assert(person_book != NULL);
{
assert(person_book != NULL);
}
void Sort_PersonInfo(Book* person_book)
{
assert(person_book != NULL);
{
assert(person_book != NULL);
}
void PrintAll_PersonInfo(Book* person_book)
{
assert(person_book != NULL);
}
{
assert(person_book != NULL);
}
void ClearAll_PersonInfo(Book* person_book)
{
assert(person_book != NULL);
}
{
assert(person_book != NULL);
}
在就是main函数的实现
在这里要注意一点就是,在通讯录的功能选择上,如果选择用 if 来实现,那么就会嵌套太多的 if,else,这里使用的是转移表的方式来实现
int main()
{
//这里使用转移表的形式实现选项功能
typedef void(*function)(Book*);
function function_book[] = {
Add_PersonInfo,
Find_PersonInfo,
Del_PersonInfo,
Modify_PersonInfo,
Sort_PersonInfo,
PrintAll_PersonInfo,
ClearAll_PersonInfo,
};
{
//这里使用转移表的形式实现选项功能
typedef void(*function)(Book*);
function function_book[] = {
Add_PersonInfo,
Find_PersonInfo,
Del_PersonInfo,
Modify_PersonInfo,
Sort_PersonInfo,
PrintAll_PersonInfo,
ClearAll_PersonInfo,
};
//初始化结构体
Init(&g_person_book);
while (1)
{
int choice = Menu();
if (choice == 0)
{
printf("Goodbye! ");
break;
}
Init(&g_person_book);
while (1)
{
int choice = Menu();
if (choice == 0)
{
printf("Goodbye! ");
break;
}
if (choice < 0 || choice>7)
{
printf("您的输入不合法!请重新输入!");
continue;
}
function_book[choice-1](&g_person_book);
{
printf("您的输入不合法!请重新输入!");
continue;
}
function_book[choice-1](&g_person_book);
}
return 0;
}
return 0;
}
下面是完整的代码:
1 #define _CRT_SECURE_NO_WARNINGS
2 #include<stdio.h>
3 #include<stdlib.h>
4 #include<assert.h>
5 #include<string.h>
6 #define MAX_PERSONINFO 200
7
8 typedef struct PersonInfo
9 {
10 //每个联系人的信息
11 char name[1024];
12 char sex[1024];
13 char age[1024];
14 char phone[1024];
15 char addrss[1024];
16 char company[1024];
17 }PersonInfo;
18
19 typedef struct Book
20 {
21 //可以容纳联系人的个数
22 PersonInfo book[MAX_PERSONINFO];
23 int size;//通讯录的有效区间
24 }Book;
25
26 Book g_person_book;
27
28 int Menu()
29 {
30 printf("通讯录!
");
31 printf("================================
");
32 printf("1.新增联系人
");
33 printf("2.查找联系人
");
34 printf("3.删除联系人
");
35 printf("4.修改联系人
");
36 printf("5.排序联系人
");
37 printf("6.查看全部联系人
");
38 printf("7.清空全部联系人
");
39 printf("0.退出
");
40 printf("================================
");
41 int choice = 0;
42 printf("请输入您的选择:");
43 scanf("%d", &choice);
44 return choice;
45 }
46
47 void Init(Book* person_book)
48 {
49 assert(person_book != NULL);
50 memset(person_book, 0, sizeof(Book));
51 }
52
53 void Add_PersonInfo(Book* person_book)
54 {
55 assert(Add_PersonInfo != NULL);
56
57 //查看是否达到最大储存量
58 if (person_book->size >= MAX_PERSONINFO)
59 {
60 printf("添加失败!联系人已满!");
61 return;
62 }
63 printf("新增联系人:
");
64 printf("请输入联系人姓名:");
65 //***********************scanf("%s", &((person_book->book[person_book->size]).name));
66 PersonInfo* p = &person_book->book[person_book->size];
67 scanf("%s", &p->name);
68 printf("请输入联系人性别:");
69 scanf("%s", &p->sex);
70 printf("请输入联系人年龄:");
71 scanf("%s", &p->age);
72 printf("请输入联系人电话:");
73 scanf("%s", &p->phone);
74 printf("请输入联系人地址:");
75 scanf("%s", &p->addrss);
76 printf("请输入联系人公司:");
77 scanf("%s", &p->company);
78
79 printf("添加成功!
");
80 ++person_book->size;
81 }
82
83 void Find_PersonInfo(Book* person_book)
84 {
85 assert(person_book != NULL);
86 printf("请输入您要查找的姓名:");
87 char find_name[1024] = { 0 };
88 scanf("%s", &find_name);
89 for (int i = 0; i < person_book->size; ++i)
90 {
91 PersonInfo* p = &person_book->book[i];
92 if (strcmp(find_name, person_book->book[i].name) == 0)
93 {
94 printf("查找成功!
");
95 printf("[%d] %s %s %s %s %s %s
",
96 i, p->name, p->sex, p->age, p->phone, p->addrss, p->company);
97 }
98 else
99 {
100 printf("查找失败!n");
101 }
102 }
103 }
104
105 void Del_PersonInfo(Book* person_book)
106 {
107 assert(person_book != NULL);
108 printf("删除联系人!
");
109
110 for (int i = 0; i < person_book->size; ++i)
111 {
112 PersonInfo* p = &person_book->book[i];
113 printf("[%d] %s %s %s %s %s %s
",
114 i, p->name, p->sex, p->age, p->phone, p->addrss, p->company);
115 }
116 printf("请输入您要删除的序号:");
117 int num = 0;
118 scanf("%d", &num);
119 if (num < person_book->size || num >= person_book->size)
120 {
121 printf("您的输入不合理,删除失败!
");
122 return;
123 }
124 printf("您确定要删除联系人:
");
125 PersonInfo* p = &person_book->book[num];
126 printf("[%d] %s %s %s %s %s %s
",
127 num, p->name, p->sex, p->age, p->phone, p->addrss, p->company);
128 printf("输入Y确定删除!
");
129 char yes[1024] = { 0 };
130 scanf("%s", &yes);
131 if (strcmp(yes, "Y") != 0)
132 {
133 printf("删除失败!
");
134 return;
135 }
136 //执行删除操作
137 //1.用最后一个元素覆盖要删除的元素
138 PersonInfo* p1 = &person_book->book[person_book->size];
139 PersonInfo* p2 = &person_book->book[num];
140 *p1 = *p2;
141
142 //2.在 size ++ 改变有效区间
143 --person_book->size;
144 printf("删除成功!
");
145
146 }
147
148 void Modify_PersonInfo(Book* person_book)
149 {
150 assert(person_book != NULL);
151
152 //按姓名修改
153 printf("请输入您要修改的联系人的姓名:
");
154 char name[1024] = { 0 };
155 scanf("%s", &name);
156 int i = 0;
157 for (; i < person_book->size; ++i)
158 {
159 if (strcmp(name, person_book->book[i].name) == 0)
160 {
161 break;
162 }
163 }
164 if (strcmp(name, person_book->book[i].name) != 0)
165 {
166 printf("修改失败!没有相应的联系人!
");
167 return;
168 }
169
170 printf("您要修改的联系人是否为:
");
171 PersonInfo* p = &person_book->book[i];
172 printf("[%d] %s %s %s %s %s %s
",
173 i, p->name, p->sex, p->age, p->phone, p->addrss, p->company);
174 printf("输入Y确定:");
175 char str[1024] = { 0 };
176 scanf("%s", &str);
177 if (strcmp(str, "Y") != 0)
178 {
179 printf("修改失败!
");
180 }
181
182 //开始修改
183 printf("请输入联系人名字:");
184 scanf("%s", &p->name);
185 printf("请输入联系人性别:");
186 scanf("%s", &p->sex);
187 printf("请输入联系人年龄:");
188 scanf("%s", &p->age);
189 printf("请输入联系人电话:");
190 scanf("%s", &p->phone);
191 printf("请输入联系人地址:");
192 scanf("%s", &p->addrss);
193 printf("请输入联系人公司:");
194 scanf("%s", &p->company);
195
196 printf("修改成功!
");
197
198 }
199
200 void Sort_PersonInfo(Book* person_book)
201 {
202 assert(person_book != NULL);
203
204 //按姓名排序,应用冒泡排序的方式写
205 PersonInfo temp = { 0 };
206 int num = 0;//[0,num]表示未排序区间,[num,size]表示已经排序的区间
207 int i = (person_book->size) - 1;
208 for (; num < person_book->size; ++num)
209 {
210 for (; i > num; --i)
211 {
212 //升序排序
213 if (strcmp((person_book->book[i].name), (person_book->book[i - 1].name)) < 0)
214 {
215 //person_book->book[i + 1].name = person_book->book[i].name;
216 temp = person_book->book[i - 1];
217 person_book->book[i - 1] = person_book->book[i];
218 person_book->book[i] = temp;
219 }
220 }
221 }
222
223 //打印出联系人
224 for (; i < person_book->size; ++i)
225 {
226 PersonInfo* p = &person_book->book[i];
227 printf("[%d] %s %s %s %s %s %s
",
228 i, p->name, p->sex, p->age, p->phone, p->addrss, p->company);
229 }
230
231 }
232
233 void PrintAll_PersonInfo(Book* person_book)
234 {
235 assert(person_book != NULL);
236 printf("打印成功!共打印%d条信息!
", person_book->size);
237 for (int i = 0; i < person_book->size; ++i)
238 {
239 PersonInfo* p = &person_book->book[i];
240 printf("[%d] %s %s %s %s %s %s
",
241 i, p->name, p->sex, p->age, p->phone, p->addrss, p->company);
242 }
243 }
244
245 void ClearAll_PersonInfo(Book* person_book)
246 {
247 assert(person_book != NULL);
248
249 //可以直接将有效区间size设置为0
250 printf("是否确定要删除所有联系人!
");
251 printf("输入Y表示确定:");
252 char str[1024] = { 0 };
253 scanf("%s", &str);
254
255 if (strcmp(str, "Y") != 0)
256 {
257 printf("删除失败!
");
258 }
259
260 person_book->size = 0;
261 }
262
263 int main()
264 {
265 //这里使用转移表的形式实现选项功能
266 typedef void(*function)(Book*);
267 function function_book[] = {
268 Add_PersonInfo,
269 Find_PersonInfo,
270 Del_PersonInfo,
271 Modify_PersonInfo,
272 Sort_PersonInfo,
273 PrintAll_PersonInfo,
274 ClearAll_PersonInfo,
275 };
276
277 //初始化结构体
278 Init(&g_person_book);
279
280 while (1)
281 {
282 int choice = Menu();
283 if (choice == 0)
284 {
285 printf("Goodbye!
");
286 break;
287 }
288 if (choice < 0 || choice>7)
289 {
290 printf("您的输入不合法!请重新输入!");
291 continue;
292 }
293 function_book[choice - 1](&g_person_book);
294
295 }
296 return 0;
297 }