【C语言实现】通讯录系统

各个函数实现的并不完整,许多地方写完之后才考虑到,但是总体还是能够勉强运行的,如果有对相关代码实现有更好的删改,希望能够分享出来。

链表实现

姓名只能支持2个字和3个字的,学号是九位

增:只能在末尾增加

删,改,查:如果有重复的数据只能操作其中的一个

这个代码利用了txt文件作为输入,输出,保存的媒介,所以请注意txt的编码方式为ASNI。

头文件

 1 #include<stdio.h>
 2 #include<malloc.h>
 3 #include <string.h>
 4 #include <stdlib.h>
 5 
 6 typedef struct Personal
 7 {
 8     char Name[50];        //姓名
 9     char Phone[50];        //手机号
10     struct Personal* next;
11 }Per, * Pnode;            //定义结构体
12 
13 
14 FILE* fp;        //指定文件指针
15 char  filename[50];        //文件名
16 
17 char username[50] = "某某" ;//用户的姓名
18 char membername[50] = "成员";
19 char memberphone[50] = "13615559962";
20 int  number = 211806141;//用户的学号
21 
22 int flag = 0;//数字标志变量
23 
24 Pnode L = NULL;//头结点
25 Pnode q, pnew;//q是临时结点,pnew是新结点
26 
27 void Welcome();/*欢迎界面*/
28 void Open();/*打开或者创建一个名单*/
29 void Read();/*将已存在的数据读到链表中*/
30 void Printall();/*打印通讯录中的数据*/
31 void Work();/*操作函数"增,删,改,查"*/
32 
33 void SearchName();/*查询姓名*/
34 void SearchPhone();/*查询手机号*/
35 
36 void ChangeName();/*改姓名*/
37 void ChangePhone();/*改手机号*/
38 
39 void AddMember();/*增加新的成员*/
40 void NameDeleteMember();/*通过姓名先查询后删除旧成员*/
41 void PhoneDeleteMember();/*通过电话先查询后删除旧成员*/

主函数和其他函数

  1 #include "message.h"
  2 
  3 int main()
  4 {
  5     Welcome();
  6     Open();
  7     Read();
  8     Work();
  9     fclose(fp);
 10     fp = fopen(filename, "w");
 11     while (L->next)
 12     {
 13         fprintf(fp,"%s\t%s\n", L->next->Name, L->next->Phone);
 14         L = L->next;
 15     }
 16     fclose(fp);
 17     return 0;
 18 }
 19 
 20 
 21 /*欢迎界面*/void Welcome()
 22 {
 23     printf("\t\t\t请问您叫什么名字?\n");
 24     scanf("%s", &username);
 25     if (strlen(username) == 4)
 26     {
 27         flag = 0;
 28     }
 29     else
 30     {
 31         flag = 1;
 32     }    
 33     fflush(stdin);
 34     printf("\t\t\t您的学号是多少(9位学号)\n");
 35     scanf("%d", &number);
 36     //询问姓名和学号
 37     printf("\t\t\t┏┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┓\n");
 38     if (flag == 0)
 39     {
 40         printf("\t\t\t┃      %s的通讯录    ┃\n", username);
 41     }
 42     else
 43     {
 44         printf("\t\t\t┃     %s的通讯录   ┃\n", username);
 45     }
 46     printf("\t\t\t┠┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┨\n");
 47     printf("\t\t\t┃                      ┃\n");
 48     printf("\t\t\t┃                      ┃\n");
 49     if (flag == 0)
 50     {
 51         printf("\t\t\t┃          %s        ┃\n", username);
 52     }
 53     else
 54     {
 55         printf("\t\t\t┃         %s       ┃\n", username);
 56     }
 57     printf("\t\t\t┃                      ┃\n");
 58     printf("\t\t\t┃                      ┃\n");
 59     printf("\t\t\t┃        %d     ┃\n",number);
 60     printf("\t\t\t┃                      ┃\n");
 61     printf("\t\t\t┃                      ┃\n");
 62     printf("\t\t\t┗┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┛\n");
 63 
 64 }
 65 /*打开或者创建一个名单*/void Open()
 66 {
 67     int i = 0;
 68     printf("\t\t\t打开文件请按1\n\t\t\t新建文件请按2\n");
 69     scanf("%d", &flag);
 70     while (1)
 71     {        
 72         if (flag == 1)//打开已有的文件
 73         {
 74             printf("\t\t\t请输入文件名\n");
 75             scanf("%s", filename);
 76             
 77             while (filename[i] != 0)
 78             {    
 79                 i++;
 80             }
 81             filename[i] = '.';
 82             filename[++i] = 't';
 83             filename[++i] = 'x';
 84             filename[++i] = 't';
 85             filename[++i] = '\0';
 86             if ((fp = fopen(filename, "r+")) == NULL)//打开失败
 87             {
 88                 printf("\t\t\t文件打开异常,请检查文件的正确性!!!\n重新输入请按1,新建请按2\n");
 89                 scanf("%d", &flag);
 90                 continue;
 91             }
 92             else//打开成功
 93             {
 94                 printf("\t\t\t打开成功!!!");
 95                 break;
 96             }
 97             
 98         }
 99         if (flag==2)//新建文件
100         {
101             printf("请输入新建的文件名\n");
102             scanf("%s", filename);
103             while (filename[i] != 0)
104             {
105                 i++;
106             }
107             filename[i] = '.';
108             filename[++i] = 't';
109             filename[++i] = 'x';
110             filename[++i] = 't';
111             filename[++i] = '\0';
112             if ((fp = fopen(filename, "w+")) == NULL)
113             {
114                 printf("创建失败,建议重启电脑!!!");
115                 exit(1);
116             }
117             else
118             {
119                 printf("创建成功并已经打开文件!!!");
120                 break;
121             }
122         }
123         if (flag != 1 && flag !=2)//重新输入数字
124         {
125             printf("请输入正确的数字\n");
126             scanf("%d", &flag);
127             continue;
128         }
129         
130     }
131     
132 }
133 /*将已存在的数据读到链表中*/void Read()
134 {
135     
136     L = (Pnode)malloc(sizeof(Per));
137     L->next = NULL;
138     q = L;
139     while (1)
140     {
141         pnew = (Pnode)malloc(sizeof(Per));
142         if (fscanf(fp, "%s\t%s\n", pnew->Name, pnew->Phone) == EOF)
143         {
144             free(pnew);
145             break;
146         }
147         q->next = pnew;
148         q = q->next;
149     }
150     q->next = NULL;
151 }
152 /*打印通讯录中的数据*/void Printall()
153 {
154     
155     q = L->next;
156     while (q)
157     {
158         printf(" \t\t\t%s\t%s\n", q->Name, q->Phone);
159         q = q->next;
160     }
161     
162 }
163 /*操作函数"增,删,改,查"*/void Work()
164 {
165     printf("\n\t\t\t┏┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┓\n");
166     printf("\t\t\t┃       数据的操作     ┃\n");
167     printf("\t\t\t┠┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┨\n");
168     printf("\t\t\t┃                      ┃\n");
169     printf("\t\t\t┃       1.增加数据     ┃\n");
170     printf("\t\t\t┃       2.删除数据     ┃\n");
171     printf("\t\t\t┃       3.改变数据     ┃\n");
172     printf("\t\t\t┃       4.查询数据     ┃\n");
173     printf("\t\t\t┃       5.打印全部     ┃\n");
174     printf("\t\t\t┃       6.退出程序     ┃\n");
175     printf("\t\t\t┃                      ┃\n");
176     printf("\t\t\t┗┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┛\n");
177     printf("\t\t\t请输入执行的操作\n");
178     scanf("%d", &flag);
179     while (1)
180     {
181         if (flag == 1)
182         {
183             AddMember();
184             printf("\t\t\t其他操作见上表\n");
185             scanf("%d", &flag);
186             continue;
187         }
188         if (flag == 2)
189         {
190             printf("\t\t\t通过查询姓名删除请按1\n\t\t\t通过查询电话号码删除请按2\n");
191             scanf("%d", &flag);
192             if (flag == 1)//通过姓名查询
193             {
194                 printf("\t\t\t请输入姓名\n");
195                 scanf("%s",membername);
196 
197                 NameDeleteMember();
198 
199                 printf("\t\t\t其他操作见上表\n");
200                 scanf("%d", &flag);
201                 continue;
202             }
203             if (flag == 2)//通过电话号码查询
204             {
205                 printf("\t\t\t请输入电话号码\n");
206                 scanf("%s", memberphone);
207 
208                 PhoneDeleteMember();
209 
210                 printf("\t\t\t其他操作见上表\n");
211                 scanf("%d", &flag);
212                 continue;
213             }
214         }
215         if (flag == 3)
216         {
217             printf("\t\t\t输入想要修改的姓名请按1\n\t\t\t输入想要修改的电话号码请按2\n");
218             scanf("%d", &flag);
219             if (flag == 1)//通过姓名查询更改
220             {
221                 printf("\t\t\t请输入姓名\n");
222                 scanf("%s", membername);
223                 ChangeName();
224                 printf("\t\t\t其他操作见上表\n");
225                 scanf("%d", &flag);
226                 continue;
227             }
228             if (flag == 2)//通过电话号码查询更改
229             {
230                 printf("\t\t\t请输入电话号码\n");
231                 scanf("%s", memberphone);
232                 ChangePhone();
233                 printf("\t\t\t其他操作见上表\n");
234                 scanf("%d", &flag);
235                 continue;
236             }
237         }
238         if (flag == 4)
239         {
240             printf("\t\t\t通过查询姓名请按1\n\t\t\t通过查询电话号码请按2\n");
241             scanf("%d",&flag);
242             if (flag == 1)//通过姓名查询
243             {
244                 printf("\t\t\t请输入姓名\n");
245                 scanf("%s",membername);
246                 SearchName();
247                 printf("\t\t\t其他操作见上表\n");
248                 scanf("%d", &flag);
249                 continue;
250             }
251             if (flag == 2)//通过电话号码查询
252             {
253                 printf("\t\t\t请输入电话号码\n");
254                 scanf("%s", memberphone);
255                 SearchPhone();
256                 printf("\t\t\t其他操作见上表\n");
257                 scanf("%d", &flag);
258                 continue;
259             }
260         }
261         if (flag == 5)
262         {
263             Printall();
264             printf("\t\t\t其他操作见上表\n");
265             scanf("%d", &flag);
266             continue;
267         }//打印全部信息
268         if (flag == 6)
269         {
270             break;
271         }
272         if (flag != 1 && flag != 2 && flag != 3 && flag != 4 && flag != 5 && flag != 6)//重新输入数字
273         {
274             printf("请输入正确的数字\n");
275             scanf("%d", &flag);
276             continue;
277         }
278     }
279 }
280 
281 /*操作函数"查姓名"*/void SearchName()
282 {
283     q = L->next;
284     while (q)
285     {
286         if (!strcmp(q->Name,membername))
287         {
288             printf("\t\t\t查询成功!!!\n");
289             printf("%s\t%s\n", q->Name, q->Phone);
290             break;
291         }
292         q = q->next;
293         if (q->next==NULL)//空表和查到最后一个未查询到(失败)
294         {
295             printf("\t\t\t查询失败!!!\n");
296             break;
297         }
298     }
299     if (q == NULL)//空表和查到最后一个未查询到(失败)
300     {
301         printf("\t\t\t查询失败!!!\n");
302     }
303 }
304 /*操作函数"查电话"*/void SearchPhone()
305 {
306     q = L->next;
307     while (q)
308     {
309         if (!strcmp(q->Phone, memberphone))
310         {
311             printf("\t\t\t查询成功!!!\n");
312             printf("%s\t%s\n", q->Name, q->Phone);
313             break;
314         
315         }
316         q = q->next;
317         if (q->next == NULL)
318         {
319             printf("\t\t\t查询失败!!!\n");
320             break;
321         }
322     }
323     if (q == NULL)//空表和查到最后一个未查询到(失败)
324     {
325         printf("\t\t\t查询失败!!!\n");
326     }
327 
328 }
329 
330 /*操作函数"改姓名"*/void ChangeName()
331 {
332     q = L->next;
333     while (q)
334     {
335         if (!strcmp(q->Name, membername))
336         {
337             printf("\t\t\t查询成功!!!\n");
338             printf("%s\t%s\n", q->Name, q->Phone);
339             printf("\t\t\t请输入修改后的姓名\n");
340             scanf("%s", q->Name);
341             printf("\t\t\t修改成功!!!\n");
342             printf("%s\t%s\n", q->Name, q->Phone);
343             break;
344         }
345         q = q->next;
346         if (q->next == NULL)//空表和查到最后一个未查询到(失败)
347         {
348             printf("\t\t\t查询失败!!!\n");
349             break;
350         }
351     }
352     if (q == NULL)//空表和查到最后一个未查询到(失败)
353     {
354         printf("\t\t\t查询失败!!!\n");
355     }
356 }
357 /*操作函数"改电话"*/void ChangePhone()
358 {
359     q = L->next;
360     while (q)
361     {
362         if (!strcmp(q->Phone, memberphone))
363         {
364             printf("\t\t\t查询成功!!!\n");
365             printf("%s\t%s\n", q->Name, q->Phone);
366             printf("\t\t\t请输入修改后的电话\n");
367             scanf("%s", q->Phone);
368             printf("\t\t\t修改成功!!!\n");
369             printf("%s\t%s\n", q->Name, q->Phone);
370             break;
371         }
372         q = q->next;
373         if (q->next == NULL)//空表和查到最后一个未查询到(失败)
374         {
375             printf("\t\t\t查询失败!!!\n");
376             break;
377         }
378     }
379     if (q == NULL)//空表和查到最后一个未查询到(失败)
380     {
381         printf("\t\t\t查询失败!!!\n");
382     }
383 }
384 
385 /*操作函数"增加新成员"*/void AddMember()
386 {
387         Pnode pnews;
388         q = L;
389         while (q->next)
390         {
391             q = q->next;
392         }
393         pnews = (Pnode)malloc(sizeof(Per));
394         printf("\t\t\t请输入需要添加的姓名和手机号码\n");
395         scanf("%s%s", pnews->Name, pnews->Phone);
396         pnews->next = NULL;
397         q->next = pnews;
398         printf("\t\t\t添加成功!!!\n");
399 
400 }
401 
402 /*操作函数"删除旧成员"*/void NameDeleteMember()
403 {
404     Pnode det;
405     q = L->next;
406     while (q)
407     {
408         if (!strcmp(q->next->Name, membername))
409         {
410             printf("\t\t\t查询成功!!!\n");
411             printf("%s\t%s\n", q->next->Name, q->next->Phone);
412 
413             printf("\t\t\t是否确定删除!!!\n\t\t\t“是”按1\n\t\t\t“否”按2\n");
414             scanf("%d", &flag);
415             if (flag==1)
416             {
417                 det = q->next;
418                 q->next= det->next;
419                 free(det);
420 
421                 printf("\t\t\t删除成功!!!\n");
422                 break;
423             }
424             if (flag == 2)
425             {
426                 break;
427             }
428         }
429         q = q->next;
430         if (q->next == NULL)//空表和查到最后一个未查询到(失败)
431         {
432             printf("\t\t\t查询失败!!!\n");
433             break;
434         }
435     }
436     if (q == NULL)//空表和查到最后一个未查询到(失败)
437     {
438         printf("\t\t\t查询失败!!!\n");
439     }
440 }
441 /*操作函数"删除旧成员"*/void PhoneDeleteMember()
442 {
443     Pnode det;
444     q = L->next;
445     while (q)
446     {
447         if (!strcmp(q->next->Phone, memberphone))
448         {
449             printf("\t\t\t查询成功!!!\n");
450             printf("%s\t%s\n", q->next->Name, q->next->Phone);
451 
452             printf("\t\t\t是否确定删除!!!\n\t\t\t“是”按1\n\t\t\t“否”按2\n");
453             scanf("%d", &flag);
454             if (flag == 1)
455             {
456                 det = q->next;
457                 q->next = det->next;
458                 free(det);
459 
460                 printf("\t\t\t删除成功!!!\n");
461                 break;
462             }
463             if (flag == 2)
464             {
465                 break;
466             }
467         }
468         q = q->next;
469         if (q->next == NULL)//空表和查到最后一个未查询到(失败)
470         {
471             printf("\t\t\t查询失败!!!\n");
472             break;
473         }
474     }
475     if (q == NULL)//空表和查到最后一个未查询到(失败)
476     {
477         printf("\t\t\t查询失败!!!\n");
478     }
479 }

效果展示

猜你喜欢

转载自www.cnblogs.com/Zoeun/p/12678811.html