1 #include <stdio.h> 2 #include<stdlib.h> 3 #include<string.h> 4 5 typedef struct student { 6 int number; 7 char name[20]; 8 char faculty[50]; 9 char classes[20]; 10 struct student * link; 11 }STU; 12 13 STU * CreateLink(); 14 void WriteLink(STU *); 15 16 void input(); 17 void del(); 18 void del_number(STU *); 19 void del_name(STU *); 20 void del_faculty(STU *); 21 void del_classes(STU *); 22 void search(); 23 void search_number(STU *); 24 void search_name(STU *); 25 void search_faculty(STU *); 26 void search_classes(STU *); 27 void sort(); 28 void show(); 29 void edit(); 30 31 32 void main() 33 { 34 char c; 35 FILE * fp; 36 37 if((fp=fopen("student.dat","r"))==NULL) 38 { 39 fp=fopen("student.dat","w"); 40 fclose(fp); 41 } 42 43 do 44 { 45 system("cls"); 46 printf(" "); 47 printf(" ╔═════════════════════╗ "); 48 printf(" ║ ║ "); 49 printf(" ║ 1: 添加一个学生 ║ "); 50 printf(" ║ 2: 删除一个学生 ║ "); 51 printf(" ║ 3: 查找一个学生 ║ "); 52 printf(" ║ 4: 学生信息排序 ║ "); 53 printf(" ║ 5: 修改学生信息 ║ "); 54 printf(" ║ 6: 查看学生信息 ║ "); 55 printf(" ║ 9: 退出 ║ "); 56 printf(" ║ ║ "); 57 printf(" ╚═════════════════════╝ "); 58 printf(" "); 59 printf(" 请选择输入选项[1\2\3\4\5\6\9]:> "); 60 do 61 { 62 c=getchar(); 63 }while(c!='1'&&c!='2'&&c!='3'&&c!='4'&&c!='5'&&c!='6'&&c!='9'); 64 getchar(); 65 66 switch(c) 67 { 68 case '1': input(); break; 69 case '2': del(); break; 70 case '3': search(); break; 71 case '4': sort(); break; 72 case '5': edit(); break; 73 case '6': show(); break; 74 case '9': exit(0); 75 } 76 system("cls"); 77 }while(1); 78 } 79 80 STU * CreateLink() 81 { 82 FILE *fp; 83 STU * head,*p1, *p2; 84 85 if((fp=fopen("student.dat","r"))==NULL) 86 { 87 printf("打开文件错误,退出。"); 88 exit(1); 89 } 90 head=p1=p2=(STU *)malloc(sizeof(STU)); 91 while(!feof(fp)) 92 { 93 if(fscanf(fp,"%d %s %s %s ",&p2->number,p2->name,p2->faculty,p2->classes)==EOF) 94 { 95 free(head); 96 return NULL; 97 } 98 p1->link=p2; 99 p1=p2; 100 p2=(STU *)malloc(sizeof(STU)); 101 } 102 p1->link=NULL; 103 free(p2); 104 fclose(fp); 105 106 return head; 107 } 108 109 void WriteLink(STU * p2) 110 { 111 FILE *fp; 112 113 if((fp=fopen("student.dat","w"))==NULL) 114 { 115 printf("打开文件错误,退出。"); 116 exit(1); 117 } 118 while(p2!=NULL) 119 { 120 fprintf(fp,"%d %s %s %s ",p2->number,p2->name,p2->faculty,p2->classes); 121 p2=p2->link; 122 } 123 fclose(fp); 124 } 125 126 void input() 127 { 128 STU * head, *p1, *p2; 129 system("cls"); 130 131 head=CreateLink(); 132 p1=head; 133 134 if(p1!=NULL) 135 while(p1->link!=NULL) 136 p1=p1->link; 137 138 p2=p1; 139 printf(" 输入待添加学生(-1 结束): "); 140 while(1) 141 { 142 p2=(STU *)malloc(sizeof(STU)); 143 if(p1==NULL) head=p1=p2; 144 printf("输入学号:"); 145 scanf("%d",&p2->number); 146 if(p2->number==-1) break; 147 printf("输入 姓名、系别、班级:"); 148 scanf("%s%s%s",p2->name,p2->faculty,p2->classes); 149 p1->link=p2; 150 p1=p2; 151 } 152 p1->link=NULL; 153 free(p2); 154 155 WriteLink(head); 156 157 free(head); 158 } 159 160 void del() 161 { 162 STU * head=CreateLink(); 163 char c; 164 do 165 { 166 system("cls"); 167 printf(" "); 168 printf(" ╔═════════════════════╗ "); 169 printf(" ║ ║ "); 170 printf(" ║ 请输入删除内容: ║ "); 171 printf(" ║ ║ "); 172 printf(" ║ 1: 按照学号删除 ║ "); 173 printf(" ║ 2: 按照姓名删除 ║ "); 174 printf(" ║ 3: 按照系别删除 ║ "); 175 printf(" ║ 4: 按照班级删除 ║ "); 176 printf(" ║ 9: 返回主菜单 ║ "); 177 printf(" ║ ║ "); 178 printf(" ╚═════════════════════╝ "); 179 printf(" "); 180 printf(" 请选择输入选项[0\1\2\3\4\9]:> "); 181 do 182 { 183 c=getchar(); 184 }while(c!='1'&&c!='2'&&c!='3'&&c!='4'&&c!='9'); 185 getchar(); 186 187 switch(c) 188 { 189 case '1': del_number(head); break; 190 case '2': del_name( head); break; 191 case '3': del_faculty(head); break; 192 case '4': del_classes(head); break; 193 case '9': return; 194 } 195 printf(" 按任意键返回主菜单: "); 196 getchar(); 197 system("cls"); 198 }while(1); 199 200 free(head); 201 } 202 void del_number(STU * head) 203 { 204 STU * p1, *p2, temp; 205 system("cls"); 206 do 207 { 208 printf(" 输入要删除学生学号(-1 结束):"); 209 scanf("%d",&temp.number); 210 getchar(); 211 p1=p2=head; 212 while(p2!=NULL) 213 { 214 if(head->number==temp.number) 215 { 216 head=head->link; 217 p1->link=NULL; 218 free(p1); 219 p1=p2=head; 220 } 221 else 222 { 223 if(p2->number==temp.number) 224 { 225 p1->link=p2->link; 226 p2->link=NULL; 227 free(p2); 228 p2=p1; 229 } 230 p1=p2; 231 p2=p2->link; 232 } 233 } 234 }while(temp.number!=-1); 235 WriteLink(head); 236 } 237 void del_name(STU * head) 238 { 239 STU * p1, *p2, temp; 240 system("cls"); 241 do 242 { 243 printf(" 输入要删除学生姓名(EOF 结束):"); 244 if(scanf("%s",temp.name)==EOF) break; 245 getchar(); 246 p1=p2=head; 247 while(p2!=NULL) 248 { 249 if(strcmp(head->name,temp.name)==0) 250 { 251 head=head->link; 252 p1->link=NULL; 253 free(p1); 254 p1=p2=head; 255 } 256 else 257 { 258 if(strcmp(head->name,temp.name)==0) 259 { 260 p1->link=p2->link; 261 p2->link=NULL; 262 free(p2); 263 p2=p1; 264 } 265 p1=p2; 266 p2=p2->link; 267 } 268 } 269 }while(1); 270 WriteLink(head); 271 } 272 void del_faculty(STU * head) 273 { 274 STU * p1, *p2, temp; 275 system("cls"); 276 do 277 { 278 printf(" 输入要删除学生系别(EOF 结束):"); 279 if(scanf("%s",temp.faculty)==EOF) break; 280 getchar(); 281 p1=p2=head; 282 while(p2!=NULL) 283 { 284 if(strcmp(head->faculty,temp.faculty)==0) 285 { 286 head=head->link; 287 p1->link=NULL; 288 free(p1); 289 p1=p2=head; 290 } 291 else 292 { 293 if(strcmp(head->faculty,temp.faculty)==0) 294 { 295 p1->link=p2->link; 296 p2->link=NULL; 297 free(p2); 298 p2=p1; 299 } 300 p1=p2; 301 p2=p2->link; 302 } 303 } 304 }while(1); 305 WriteLink(head); 306 } 307 void del_classes(STU * head) 308 { 309 STU * p1, *p2, temp; 310 system("cls"); 311 do 312 { 313 printf(" 输入要删除学生班级(EOF 结束):"); 314 if(scanf("%s",temp.classes)==EOF) break; 315 getchar(); 316 p1=p2=head; 317 while(p2!=NULL) 318 { 319 if(strcmp(head->classes,temp.classes)==0) 320 { 321 head=head->link; 322 p1->link=NULL; 323 free(p1); 324 p1=p2=head; 325 } 326 else 327 { 328 if(strcmp(head->classes,temp.classes)==0) 329 { 330 p1->link=p2->link; 331 p2->link=NULL; 332 free(p2); 333 p2=p1; 334 } 335 p1=p2; 336 p2=p2->link; 337 } 338 } 339 }while(1); 340 WriteLink(head); 341 } 342 343 void search() 344 { 345 STU * head=CreateLink(); 346 347 char c; 348 do 349 { 350 system("cls"); 351 printf(" "); 352 printf(" ╔═════════════════════╗ "); 353 printf(" ║ ║ "); 354 printf(" ║ 请输入查找内容: ║ "); 355 printf(" ║ ║ "); 356 printf(" ║ 1: 按照学号查找 ║ "); 357 printf(" ║ 2: 按照姓名查找 ║ "); 358 printf(" ║ 3: 按照系别查找 ║ "); 359 printf(" ║ 4: 按照班级查找 ║ "); 360 printf(" ║ 9: 返回主菜单 ║ "); 361 printf(" ║ ║ "); 362 printf(" ╚═════════════════════╝ "); 363 printf(" "); 364 printf(" 请选择输入选项[0\1\2\3\4\9]:> "); 365 do 366 { 367 c=getchar(); 368 }while(c!='1'&&c!='2'&&c!='3'&&c!='4'&&c!='9'); 369 getchar(); 370 371 switch(c) 372 { 373 case '1': search_number(head); break; 374 case '2': search_name( head); break; 375 case '3': search_faculty(head); break; 376 case '4': search_classes(head); break; 377 case '9': return; 378 } 379 printf(" 按任意键返回主菜单: "); 380 getchar(); 381 system("cls"); 382 }while(1); 383 } 384 void search_number(STU * head) 385 { 386 STU temp,*p2=head; 387 system("cls"); 388 389 do 390 { 391 printf(" 输入要查找学生学号(-1 结束): "); 392 scanf("%d",&temp.number); 393 printf(" 查询结果: "); 394 while(p2!=NULL) 395 { 396 if(p2->number==temp.number) 397 printf(" %d %s %s %s",p2->number,p2->name,p2->faculty,p2->classes); 398 p2=p2->link; 399 } 400 p2=head; 401 }while(temp.number!=-1); 402 403 } 404 void search_name(STU * head) 405 { 406 STU temp, *p2=head; 407 system("cls"); 408 409 printf(" 输入要查找学生姓名(EOF 结束): "); 410 do 411 { 412 if(scanf("%s",temp.name)==EOF) return; 413 printf(" 查询结果: "); 414 while(p2!=NULL) 415 { 416 if(strcmp(p2->name,temp.name)==0) 417 printf(" %d %s %s %s ",p2->number,p2->name,p2->faculty,p2->classes); 418 p2=p2->link; 419 } 420 p2=head; 421 getchar(); 422 printf(" 输入要查找学生姓名(EOF 结束): "); 423 }while(1); 424 } 425 void search_faculty(STU * head) 426 { 427 STU temp, *p2=head; 428 system("cls"); 429 430 printf(" 输入要查找学生系别(EOF 结束): "); 431 do 432 { 433 if(scanf("%s",temp.faculty)==EOF) return; 434 printf(" 查询结果: "); 435 while(p2!=NULL) 436 { 437 if(strcmp(p2->faculty,temp.faculty)==0) 438 printf(" %d %s %s %s ",p2->number,p2->name,p2->faculty,p2->classes); 439 p2=p2->link; 440 } 441 p2=head; 442 getchar(); 443 printf(" 输入要查找学生系别(EOF 结束): "); 444 }while(1); 445 } 446 void search_classes(STU * head) 447 { 448 STU temp, *p2=head; 449 system("cls"); 450 451 printf(" 输入要查找学生班级(EOF 结束): "); 452 do 453 { 454 if(scanf("%s",temp.classes)==EOF) return; 455 printf(" 查询结果: "); 456 while(p2!=NULL) 457 { 458 if(strcmp(p2->classes,temp.classes)==0) 459 printf(" %d %s %s %s ",p2->number,p2->name,p2->faculty,p2->classes); 460 p2=p2->link; 461 } 462 p2=head; 463 getchar(); 464 printf(" 输入要查找学生班级(EOF 结束): "); 465 }while(1); 466 } 467 468 void sort() 469 { 470 STU * head, *p1, *p2; 471 STU temp; 472 473 head=CreateLink(); 474 475 system("cls"); 476 printf(" 按照学号排序(正序): "); //常排序 477 for(p1=head;p1!=NULL;p1=p1->link) 478 for(p2=p1->link;p2!=NULL;p2=p2->link) 479 if(p1->number>p2->number) 480 { 481 temp.number=p1->number; 482 strcpy(temp.name,p1->name); 483 strcpy(temp.faculty,p1->faculty); 484 strcpy(temp.classes,p1->classes); 485 p1->number=p2->number; 486 strcpy(p1->name,p2->name); 487 strcpy(p1->faculty,p2->faculty); 488 strcpy(p1->classes,p2->classes); 489 p2->number=temp.number; 490 strcpy(p2->name,temp.name); 491 strcpy(p2->faculty,temp.faculty); 492 strcpy(p2->classes,temp.classes); 493 } 494 495 WriteLink(head); 496 497 printf(" 排序完毕,输出排序结果:"); 498 show(); 499 free(head); 500 } 501 502 void show() 503 { 504 STU * head, *p2; 505 506 head=CreateLink(); 507 508 printf(" 学号 姓名 系别 班级: "); 509 p2=head; 510 while(p2!=NULL) 511 { 512 printf(" %d %s %s %s ",p2->number,p2->name,p2->faculty,p2->classes); 513 p2=p2->link; 514 } 515 getchar(); 516 } 517 518 void edit() 519 { 520 STU * head, *p2; 521 STU temp; 522 head=CreateLink(); 523 p2=head; 524 525 system("cls"); 526 do 527 { 528 printf(" 输入要查找学生学号(-1 结束): "); 529 scanf("%d",&temp.number); 530 getchar(); 531 while(p2!=NULL) 532 { 533 if(p2->number==temp.number) 534 { 535 printf("请输入修改后的内容:姓名、系别、班级: "); 536 scanf("%s %s %s",p2->name,p2->faculty,p2->classes); 537 } 538 p2=p2->link; 539 } 540 }while(temp.number!=-1); 541 542 WriteLink(head); 543 free(head); 544 }