c语言实现通讯录管理系统(用链表实现)

题目:

       通讯录(通过链表实现)

       设计并实现一个简易的通讯录软件,管理个人通讯记录。一条通讯记录可包括:姓名、工作单位、手机、住宅电话、E-Mail、家庭住址等(可自行增删,但不可过少)。该系统应实现以下基本功能:

     (1)增加新的通讯记录。

    (2)删除已有的通讯记录。

    (3)修改已有的通讯记录。

    (4)浏览全部或指定(如指定姓名、工作单位等)的通讯记录。

    (5)合理组织排列各项功能,界面可使用键盘操作。

    (6)以文件的形式存储数据。

说明:

      大一时的c语言课设,用链表实现一个通讯录管理系统,为了美观好看,花了很多时间调整齐度,记录一下大一时的作业。其主要功能是对通讯录可输入,显示,插入,删除,最难是可保存,这个学文件的时候不怎么会。内容我自己弄了7个,名字,性别,工作单位,手机,住宅电话,E-Mail,家庭住址(其他太多其实都是一样的,就懒得加了)。主要运用到对指针中的链表的功能和使用要比较扎实,分部列写就可以了。

实现图片:

附上代码:

  1 #include <stdio.h>
  2 #include <string.h>
  3 #include <stdlib.h>
  4 typedef struct student
  5 {
  6     char name[20];//名字
  7     char wm[20];//性别
  8     char work[100];//工作单位
  9     char stel[20];//手机
 10     char htel[20];//住宅号码
 11     char mail[20];//E-Mail
 12     char home[100];//家庭住址
 13     struct student *next;
 14 }stu;
 15 stu *head;//头指针
 16 void screen()//主菜单
 17 {
 18     printf("\n=======================================================\n");
 19     printf("              欢迎来到通讯录管理系统\n\n");
 20     printf("            1.输入数据         2.显示数据\n");
 21     printf("            3.插入数据         4.删除数据\n");
 22     printf("            5.查看数据         6.修改数据\n");
 23     printf("            7.保存数据         8.返回主菜单\n");
 24     printf("\n~~~~~~输~~~~~~入~~~~~~9~~~~~~退~~~~~~出~~~~~~程~~~~~~序\n");
 25 }
 26 void input()//输入数据
 27 {
 28     int ans;//判断是否继续输入
 29     stu *p1,*p2;
 30     p1=(stu *)malloc(sizeof(stu));//申请内存来用
 31     if(p1!=NULL)
 32     {
 33         printf("========输入数据========\n");
 34         head=p1;
 35         while(1)
 36         {
 37             printf("名字:");
 38             scanf("%s",&p1->name);
 39             printf("性别:");
 40             scanf("%s",&p1->wm);
 41             printf("工作单位:");
 42             scanf("%s",&p1->work);
 43             printf("手机:");
 44             scanf("%s",&p1->stel);
 45             printf("住宅号码:");
 46             scanf("%s",&p1->htel);
 47             printf("E-Mail:");
 48             scanf("%s",&p1->mail);
 49             printf("家庭地址:");
 50             scanf("%s",&p1->home);
 51             printf("===================================\n");
 52             p2=p1;
 53             p1=(stu *)malloc(sizeof(stu));//申请下一个要用的空间
 54             if(p1!=NULL)
 55                 p2->next=p1;
 56             printf("请选择是否继续输入:1.继续  2.退出\n请选择:");//用户选择
 57             scanf("%d",&ans);
 58             if(ans==1)//继续
 59                 continue;
 60             else//退出
 61             {
 62                 printf("========输入完毕========\n");
 63                 p2->next=NULL;
 64                 free(p1);//将申请的的无用内存释放
 65                 break;
 66             }
 67         }
 68     }
 69 }
 70 void look(stu *p1)//显示数据
 71 {
 72     printf("========显示数据========\n");
 73     while(p1!=NULL)
 74     {
 75         printf("名字:%s\n",p1->name);
 76         printf("性别:%s\t",p1->wm);
 77         printf("工作单位:%s\t",p1->work);
 78         printf("手机:%s\t",p1->stel);
 79         printf("住宅号码:%s\t",p1->htel);
 80         printf("E-Mail:%s\t",p1->mail);
 81         printf("家庭住址:%s\n",p1->home);
 82         printf("=====================================\n");
 83         p1=p1->next;
 84     }
 85     printf("========显示完毕========\n");
 86 }
 87 void insert()//插入数据
 88 {
 89     int ans;//选择插入位置
 90     char name[20];//插入者的名字
 91     printf("========插入数据========\n");
 92     stu *p1,*p2,*p3;
 93     p1=head;
 94     p3=(stu *)malloc(sizeof(stu));//申请内存
 95     p3->next=NULL;
 96     printf("请输入插入者的数据:\n");
 97     printf("名字:");
 98     scanf("%s",&p3->name);
 99     printf("性别:");
100     scanf("%s",&p3->wm);
101     printf("工作单位:");
102     scanf("%s",&p3->work);
103     printf("手机:");
104     scanf("%s",&p3->stel);
105     printf("住宅号码:");
106     scanf("%s",&p3->htel);
107     printf("E-Mail:");
108     scanf("%s",&p3->mail);
109     printf("家庭地址:");
110     scanf("%s",&p3->home);
111     printf("请选择插入位置:1.首位置插入  2.尾部插入  3.插到某人前面\n请选择:");
112     scanf("%d",&ans);
113     switch(ans)
114     {
115     case 1://放到头指针
116         p3->next=p1;
117         head=p3;
118         break;
119     case 2://放到尾部
120         while(p1->next!=NULL)
121             p1=p1->next;
122         p1->next=p3;
123         break;
124     case 3://放到某人前面
125         printf("请输入插到谁前面名字:");
126         scanf("%s",name);
127         while(strcmp(name,p1->name)!=0)
128         {
129             p2=p1;
130             p1=p1->next;
131         }
132         p2->next=p3;
133         p3->next=p1;
134         break;
135     }
136     printf("========插入成功========\n");
137 }
138 void deleted()//删除数据
139 {
140     stu *p1,*p2;
141     char name[20];//删除者名字
142     printf("========删除数据========\n");
143     printf("请输入要删除者的名字:");
144     scanf("%s",name);
145     p1=head;
146     if(head==NULL)//通讯录已经没数据了
147     {
148         printf("通讯录里什么也没有了。\n");
149         printf("========删除失败========\n");
150         return;
151     }
152     if(!strcmp(name,p1->name))//头指针就是要删除的,为什么要单独拿出来,就是为了可以在删除后改变头指针
153     {
154         head=p1->next;
155         printf("========删除成功========\n");
156         return;
157     }
158     while(p1!=NULL&&strcmp(name,p1->name))
159     {
160         p2=p1;
161         p1=p1->next;
162     }
163     if(p1==NULL)//查找完了,没找到
164     {
165         printf("查无此人!!!!\n");
166         printf("========删除失败========\n");
167         return;
168     }
169     if(p1->next!=NULL)//找到了,不是最后一个
170     {
171         p1=p1->next;
172         p2->next=p1;
173         printf("========删除成功========\n");
174     }
175     else//是最后一个
176     {
177         p2->next=NULL;
178         printf("========删除成功========\n");
179     }
180 }
181 void find(stu *p1)//查找数据
182 {
183     char name[20];//查找的名字
184     printf("========查看数据========\n");
185     printf("请输入要查看人的名字:");
186     scanf("%s",name);
187     while(p1!=NULL)
188     {
189         if(!strcmp(name,p1->name))//找到了输出
190         {
191             printf("你要查找人的数据:\n");
192             printf("名字:%s\n",p1->name);
193             printf("性别:%s\t",p1->wm);
194             printf("工作单位:%s\t",p1->work);
195             printf("手机:%s\t",p1->stel);
196             printf("住宅号码:%s\t",p1->htel);
197             printf("E-Mail:%s\t",p1->mail);
198             printf("家庭住址:%s\n",p1->home);
199             break;
200         }
201         p1=p1->next;
202     }
203     if(p1==NULL)//找完了,没找到
204         printf("您要查找的人不存在\n");
205     printf("========结束查找========\n");
206 }
207 void update(stu *p1)//修改数据
208 {
209     int n;//选择的修改内容
210     char name[20];//要修改人的名字
211     printf("========修改数据========\n");
212     printf("请输入要修改人的姓名:");
213     scanf("%s",name);
214     while(p1!=NULL)
215     {
216         if(!strcmp(name,p1->name))//找到了
217         {
218             printf("要修改人的数据为:\n");
219             printf("名字:%s\n",p1->name);
220             printf("性别:%s\t",p1->wm);
221             printf("工作单位:%s\t",p1->work);
222             printf("手机:%s\t",p1->stel);
223             printf("住宅号码:%s\t",p1->htel);
224             printf("E-Mail:%s\t",p1->mail);
225             printf("家庭住址:%s\n",p1->home);
226             printf("请选择要修改的信息:");
227             printf("\t1.名字\t2.性别\t3.工作单位\t4.手机\t5.住宅号码\t6.E-Mail\t7.家庭住址\n\n您的选择是(1~7):");
228             scanf("%d",&n);
229             switch(n)
230             {
231                 case 1:
232                     printf("名字:");
233                     scanf("%s",&p1->name);
234                     break;
235                 case 2:
236                     printf("性别:");
237                     scanf("%s",&p1->wm);
238                     break;
239                 case 3:
240                     printf("工作单位:");
241                     scanf("%s",&p1->work);
242                     break;
243                 case 4:
244                     printf("手机:");
245                     scanf("%s",&p1->stel);
246                     break;
247                 case 5:
248                     printf("住宅号码:");
249                     scanf("%s",&p1->htel);
250                     break;
251                 case 6:
252                     printf("E-Mail:");
253                     scanf("%s",&p1->mail);
254                     break;
255                 case 7:
256                     printf("家庭住址:");
257                     scanf("%s",&p1->home);
258                     break;
259             }
260             printf("========修改成功========\n");
261             break;
262         }
263         p1=p1->next;
264     }
265     if(p1==NULL)//找完了,没有找到
266     {
267         printf("没有找到该人信息\n");
268         printf("========修改失败========\n");
269     }
270 }
271 void save(stu *p1)//保存数据
272 {
273     printf("========保存数据========\n");
274     FILE *fp;
275     char file[15];
276     printf("请输入文件名:");
277     scanf("%s",file);
278     if((fp=fopen(file,"w"))==NULL)//打开文件,若没有此文件可以新建立
279     {
280         printf("cannot open this file\n");//无法建立新文件
281         exit(0);//正常运行程序并退出程序
282     }
283     fprintf(fp,"名字\t性别\t工作单位\t手机\t住宅号码\tE-Mail\t家庭住址\n");
284     while(p1!=NULL)
285     {
286         fprintf(fp,"%s\t",p1->name);
287         fprintf(fp,"%s\t",p1->wm);
288         fprintf(fp,"%s\t",p1->work);
289         fprintf(fp,"%s\t",p1->stel);
290         fprintf(fp,"%s\t",p1->htel);
291         fprintf(fp,"%s\t",p1->mail);
292         fprintf(fp,"%s\n",p1->home);
293         p1=p1->next;
294     }
295     printf("========保存成功========\n");
296     fclose(fp);//关闭文件,这个要记得
297 }
298 int main(void)
299 {
300     int n;
301     screen();
302     while(1)
303     {
304         printf("请输入你的选择(1~9):");
305         scanf("%d",&n);
306         if(n<1||n>9)
307         {
308             printf("输入有误!");
309             continue;
310         }
311         switch(n)
312         {
313         case 1:
314             input();
315             break;
316         case 2:
317             look(head);
318             break;
319         case 3:
320             insert();
321             break;
322         case 4:
323             deleted();
324             break;
325         case 5:
326             find(head);
327             break;
328         case 6:
329             update(head);
330             break;
331         case 7:
332             save(head);
333             break;
334         case 8:
335             screen();
336             break;
337         case 9:
338             printf("===============欢迎你再次使用通讯录系统===============\n");
339             exit(1);//退出系统
340             break;
341         }
342     }
343 }

 

 

———————————————————————————————————————————————————————————————————————

付出

凌晨四点的太阳:

Kobe:Do you know what Los Angeles looks like at four in the morning?

“I don't know. What do you think of Los Angeles at four every morning.”

Kobe:Full of stars, few lights, few pedestrians.

posted @ 2020-04-22 12:29  头巨铁  阅读(5061)  评论(9编辑  收藏  举报