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.