各个函数实现的并不完整,许多地方写完之后才考虑到,但是总体还是能够勉强运行的,如果有对相关代码实现有更好的删改,希望能够分享出来。
链表实现
姓名只能支持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 }
效果展示
原文:https://www.cnblogs.com/Zoeun/p/12678811.html