第四天还差恢复已删除学生功能

  对于我来说,已经开始很复杂了。

小细节太重要了,边写边出错





1
#include<stdio.h> 2 #include<stdlib.h> 3 #include<string.h> 4 5 #define StuIdlen 12//学生学号长度 6 #define StuNamelen 12//学生姓名长度 7 typedef struct Stu 8 { 9 char StuName[StuNamelen]; 10 char StuId[StuIdlen]; 11 int score; 12 struct Stu* pNext;//下一个指针 13 }Stu_data; //学生数据类型 14 //声明链表的头和尾 15 Stu_data* g_pHead =NULL; 16 Stu_data* g_pEnd =NULL; //初始化0 17 void show_main();//展示功能面板 声明 18 void AddStu( char *iStuName,char *iStuId,int iscore);//添加学生信息 19 //清空列表 20 void FreeLinkData(); 21 //打印数据 22 void showStu_data(); 23 //链表头添加一个节点 24 void HeadAddStu( char *iStuName,char *iStuId,int iscore);//添加学生信息 25 //查找指定学生 26 Stu_data* FindStu(char* iStuId); 27 //指定位置插入节点 28 void InsertNode(Stu_data* pTemp,char *iStuName,char *iStuId,int iscore); 29 //查找指定的学生信息 30 void FindStudata(char* iStuId); 31 //删除指定的学生信息 32 void DeleteStuNode(Stu_data* pNode); 33 //保存信息进文件 34 void SaveStuToFile(); 35 //读取文件中学生的信息 36 void ReadStuFormFile(); 37 int main() 38 { 39 40 41 42 int chose; 43 int run =1;//永真run 44 show_main();//调用 45 while(run)//永真执行操作 46 { 47 printf("*****************请输入指令(帮助10)*********************\n"); 48 scanf("%d",&chose); 49 50 switch(chose) 51 { 52 case 1: 53 printf("*****************1.增加学生信息***************************\n"); 54 char iStuName[StuNamelen]; 55 char iStuId[StuIdlen]; 56 int iscore; 57 printf("输入学生姓名:"); 58 scanf("%s",iStuName); 59 getchar(); 60 printf("输入学生学号:"); 61 scanf("%s",iStuId); 62 printf("输入学生成绩:"); 63 scanf("%d",&iscore); 64 AddStu(iStuName,iStuId,iscore); 65 printf("*******************增加信息成功***************************\n"); 66 67 break; 68 case 11: 69 printf("*****************11.增加学生信息(头添加)******************\n"); 70 /*char iStuName[StuNamelen]; 71 char iStuId[StuIdlen]; 72 int iscore; 73 */ 74 printf("输入学生姓名:"); 75 scanf("%s",iStuName); 76 getchar(); 77 printf("输入学生学号:"); 78 scanf("%s",iStuId); 79 printf("输入学生成绩:"); 80 scanf("%d",&iscore); 81 HeadAddStu(iStuName,iStuId,iscore); 82 printf("*******************增加信息成功***************************\n"); 83 //头添加 84 break; 85 case 111: 86 { 87 88 Stu_data* pTemp =NULL; 89 printf("输入指定学号"); 90 scanf("%s",iStuId); 91 pTemp=FindStu(iStuId); 92 if(NULL!=pTemp) 93 { 94 95 scanf("%s",iStuId); 96 printf("输入学生姓名:"); 97 scanf("%s",iStuName); 98 getchar(); 99 printf("输入学生学号:"); 100 scanf("%s",iStuId); 101 printf("输入学生成绩:"); 102 scanf("%d",&iscore); 103 InsertNode(pTemp,iStuName,iStuId,iscore); 104 printf("*******************信息插入成功***************************\n"); 105 } 106 break; 107 } 108 case 2: 109 printf("*****************2.查找指定的学生信息*********************\n"); 110 printf("输入学生学号:"); 111 scanf("%s",iStuId); 112 FindStudata(iStuId); 113 printf("*******************信息显示成功***************************\n"); 114 break; 115 case 3: 116 printf("*****************3.修改指定的学生信息*********************\n"); 117 printf("输入学生学号:"); 118 scanf("%s",iStuId); 119 //查找 120 Stu_data* pTemp = FindStu(iStuId) ; 121 //打印 122 char c; 123 if(NULL != pTemp) 124 { 125 getchar(); 126 printf("是否修改学号?Y/N\n"); 127 scanf("%c",&c); 128 //修改学号 129 if('Y'==c){ 130 printf("修改学号:") ; 131 scanf("%s",iStuId); 132 strcpy(pTemp->StuId,iStuId); 133 } 134 getchar(); 135 printf("是否修改名字?Y/N\n"); 136 scanf("%c",&c); 137 //修改名字 138 if('Y'==c){ 139 printf("修改名字:") ; 140 scanf("%s",iStuName); 141 strcpy(pTemp->StuName,iStuName); 142 } 143 getchar(); 144 printf("是否修改分数?Y/N\n"); 145 scanf("%c",&c); 146 //修改分数 147 if('Y'==c){ 148 printf("修改分数:"); 149 scanf("%d",&iscore); 150 pTemp->score=iscore; 151 } 152 153 } 154 printf("*******************信息修改成功***************************\n"); 155 break; 156 case 4: 157 printf("*****************4.保存业主的信息到文件中*****************\n"); 158 //保存函数 159 SaveStuToFile(); 160 161 printf("*******************信息成功保存***************************\n"); 162 break; 163 case 5: 164 ReadStuFormFile(); 165 break; 166 case 6: 167 printf("*****************6.删除指定的学生的信息*******************\n"); 168 printf("输入学生学号:"); 169 scanf("%s",iStuId); 170 //查找 171 pTemp = FindStu(iStuId); 172 173 //删除这个节点 174 if(NULL !=pTemp) 175 { 176 //调用学生删除函数 177 178 DeleteStuNode(pTemp); 179 180 } 181 break; 182 case 9: 183 printf("*****************9.显示所有的学生的信息*******************\n"); 184 showStu_data(); 185 printf("*******************信息显示成功***************************\n"); 186 break; 187 case 0: 188 printf("*****************0.退出系统*******************************\n"); 189 run=0; 190 break; 191 case 10: 192 show_main();//调用 193 break; 194 default: 195 printf("*****************!.输入错误*******************************\n"); 196 break; 197 } 198 199 200 } 201 FreeLinkData(); 202 system("PAUSE"); 203 return 0; 204 } 205 206 207 208 void show_main()//展示功能面板 定义 209 { 210 printf("*******************学生管理系统***************************\n"); 211 printf("*******************系统功能如下***************************\n"); 212 printf("*****************1.增加学生信息(尾添加)*******************\n"); 213 printf("*****************11.增加学生信息(头添加)******************\n"); 214 printf("*****************111.增加学生信息(指定位置添加)***********\n"); 215 printf("*****************2.查找指定的学生信息*********************\n"); 216 printf("*****************3.修改指定的学生信息*********************\n"); 217 printf("*****************4.保存业主的信息到文件中*****************\n"); 218 printf("*****************5.读取文件中的业主的信息*****************\n"); 219 printf("*****************6.删除指定的学生的信息*******************\n"); 220 printf("*****************7.恢复删除的学生的信息*******************\n"); 221 printf("*****************9.显示所有的学生的信息*******************\n"); 222 printf("*****************10.查看面板******************************\n"); 223 printf("*****************0.退出系统*******************************\n"); 224 printf("**********************************************************\n"); 225 226 } 227 void AddStu(char *iStuName,char *iStuId,int iscore) 228 { 229 230 //检验合法性质 231 if(NULL == iStuName||NULL == iStuId||iscore<0) 232 { 233 printf("输入学生信息错误"); 234 return ; 235 } 236 //逻辑判断- 237 //创建一个节点 238 239 Stu_data* pTemp=malloc(sizeof(Stu_data)); 240 //节点成员附初始值 241 strcpy(pTemp->StuName,iStuName); 242 strcpy(pTemp->StuId,iStuId); 243 244 245 pTemp->score=iscore; 246 pTemp->pNext=NULL; 247 // 接在链表上 248 if(g_pHead==NULL||g_pEnd==NULL) 249 { 250 g_pHead =pTemp;//link 251 g_pEnd =pTemp;//向后移动 252 } 253 else 254 { 255 g_pEnd->pNext = pTemp; 256 g_pEnd=pTemp; 257 } 258 259 } 260 void FreeLinkData() //清空列表 261 { 262 Stu_data* pTemp = g_pHead;//记录节点 263 while(g_pHead !=NULL) 264 { 265 g_pHead=g_pHead->pNext;//向后移动了一个 266 267 free(pTemp);//删除节点 268 269 } 270 } 271 void showStu_data()//展示链表 showStu_data(); 272 { 273 Stu_data* pTemp = g_pHead; 274 while(pTemp != NULL) 275 { 276 printf("学号:%15s,姓名:%10s,分数:%5d\n",pTemp->StuId,pTemp->StuName,pTemp->score); 277 pTemp=pTemp->pNext;//向后移动了一个 278 } 279 } 280 //链表头添加一个节点 281 void HeadAddStu( char *iStuName,char *iStuId,int iscore)//添加学生信息 282 { 283 //检测合法性 284 if(NULL == iStuName||NULL == iStuId||iscore < 0) 285 { 286 printf("学生信息输入错误"); 287 return ; 288 } 289 //创建一个节点 290 Stu_data* pTemp = malloc(sizeof(Stu_data)); 291 //成员赋值 292 strcpy(pTemp->StuName,iStuName); 293 strcpy(pTemp->StuId,iStuId); 294 pTemp->score = iscore; 295 pTemp->pNext = NULL; 296 if(NULL == g_pHead||NULL == g_pEnd) 297 {//链表为空 298 g_pHead = pTemp; 299 g_pEnd =pTemp; 300 301 } 302 else 303 { 304 //新节点的下一个指向头先连后断 305 pTemp->pNext = g_pHead; 306 g_pHead=pTemp; 307 } 308 } 309 //查找指定学生 310 Stu_data* FindStu(char* iStuId)//201801013 12356 311 { 312 //检测参数合法性 313 if(NULL == iStuId) 314 { 315 printf("学号输入错误"); 316 return NULL; 317 } 318 //遍历链表 319 Stu_data* pTemp=g_pHead; 320 while(pTemp) 321 { 322 if(0 == strcmp(pTemp->StuId,iStuId)) 323 { 324 return pTemp; 325 } 326 pTemp=pTemp->pNext; 327 } 328 printf("查无此节点\n"); 329 printf("*******************信息显示失败***************************\n"); 330 return NULL; 331 } 332 333 //指定位置插入节点 334 void InsertNode(Stu_data* pTemp,char *iStuName,char *iStuId,int iscore) 335 { 336 //创建一个节点 337 Stu_data* pnewTemp = malloc(sizeof(Stu_data)); 338 //成员赋值 339 //成员赋值 340 strcpy(pnewTemp->StuName,iStuName); 341 strcpy(pnewTemp->StuId,iStuId); 342 pnewTemp->score = iscore; 343 pnewTemp->pNext = NULL; 344 if(pTemp==g_pEnd)//是尾节点 345 { 346 printf("是尾戒点\n"); 347 g_pEnd->pNext=pnewTemp; 348 g_pEnd=pnewTemp; 349 350 } 351 else 352 { 353 //先连后断 354 pnewTemp->pNext=pTemp->pNext; 355 pTemp->pNext=pnewTemp; 356 357 } 358 } 359 //查找指定的学生信息 360 void FindStudata(char* iStuId) 361 { 362 Stu_data* pTemp=FindStu(iStuId); 363 if(pTemp ==NULL) 364 { 365 return ; 366 } 367 printf("学号:%15s,姓名:%10s,分数:%5d\n",pTemp->StuId,pTemp->StuName,pTemp->score); 368 } 369 //删除指定的学生信息 370 void DeleteStuNode(Stu_data* pNode) 371 { 372 373 //只有一个节点 374 if(g_pHead == g_pEnd) 375 { 376 free(g_pHead); 377 g_pHead = NULL; 378 g_pEnd = NULL; 379 } 380 //只有两个节点 381 else if(g_pHead->pNext==g_pEnd) 382 { 383 if(g_pHead==pNode) 384 { 385 386 free(g_pHead); 387 g_pHead=g_pEnd; 388 389 } 390 else 391 { 392 free(g_pEnd); 393 g_pEnd=g_pHead; 394 g_pHead->pNext=NULL; 395 396 } 397 } 398 //常规情况 399 else 400 { 401 Stu_data* pTemp=g_pHead; 402 if(g_pHead == pNode)//删除 特殊在头部 403 { 404 //记住头 405 pTemp=g_pHead; 406 g_pHead = g_pHead->pNext; 407 free(pTemp); 408 pTemp = NULL; 409 return; 410 } 411 //判断头 412 while(pTemp) 413 { 414 if(pTemp->pNext == pNode) 415 { 416 //删除 特殊在尾巴 417 if(pNode == g_pEnd) 418 { 419 free(pNode); 420 pNode == NULL; 421 g_pEnd = pTemp; 422 g_pEnd->pNext = NULL; 423 return ; 424 } 425 //删除 426 else 427 { 428 //记住删除的节点 429 Stu_data* p =pTemp->pNext; 430 pTemp->pNext = pNode->pNext; 431 //释放节点 432 free(p); 433 p = NULL; 434 return ; 435 436 } 437 438 439 } 440 pTemp=pTemp->pNext; 441 } 442 } 443 } 444 //保存信息进文件 445 void SaveStuToFile() 446 { 447 //判断链表是否为NULL 448 FILE* pFile = NULL; 449 Stu_data* pTemp = g_pHead; 450 char strBuf[30] = {0}; 451 char strScore[10] = {0}; 452 if(NULL == g_pHead) 453 { 454 printf("没有学生\n"); 455 return ; 456 } 457 //打开文件 458 pFile = fopen("dat.dat","wb+"); 459 if (NULL == pFile) 460 { 461 printf("打开文件失败\n"); 462 return; 463 } 464 //操作文件指针 465 while(pTemp) 466 { 467 //学号赋值进去 468 strcpy(strBuf,pTemp->StuId); 469 strcat(strBuf,"."); 470 //姓名赋值进去 471 strcat(strBuf,pTemp->StuName); 472 strcat(strBuf,"."); 473 //分数赋值进去 474 itoa(pTemp->score,strScore,10); 475 strcat(strBuf,strScore); 476 strcat(strBuf,"."); 477 478 479 fwrite(strBuf,1,strlen(strBuf),pFile); 480 fwrite("\r\n",1,strlen("\r\n"),pFile); 481 pTemp = pTemp->pNext; 482 } 483 //关闭文件 484 fclose(pFile); 485 486 } 487 //读取文件中学生的信息 488 void ReadStuFormFile() 489 { 490 FILE* pFile = fopen("dat.dat","rb+"); 491 if(NULL == pFile) 492 { 493 printf("文件打开失败"); 494 return; 495 496 } 497 char strBuf[30]={0}; 498 //操作指针,读取函数 499 char strName[StuNamelen] = {0}; 500 char strId[StuIdlen] = {0}; 501 char strScore[10] = {0}; 502 503 int nCount =0; 504 int j = 0; 505 while(NULL != fgets(strBuf, 30, pFile)) 506 { 507 508 int i = 0; 509 nCount = 0; 510 j = 0; 511 for(i = 0;strBuf[i] !='\r';i++) 512 { 513 if(0 == nCount)//没到点 514 { 515 strId[i] = strBuf[i]; 516 printf("学号:%s,\n",strId); 517 if('.'== strBuf[i]) 518 { 519 strId[i] = '\0'; 520 nCount++; 521 } 522 } 523 else if (1 == nCount)//第一个点 524 { 525 526 strName[j] = strBuf[i]; 527 528 529 printf("姓名:%s,\n",strName); 530 if('.'== strBuf[i]) 531 { 532 strName[j] ='\0'; 533 nCount++; 534 j = 0; 535 continue; 536 } 537 j++; 538 } 539 else //第二个点 (2 == nCount) 540 { 541 //int j=0; 542 if('.'== strBuf[i]){ 543 strScore[j] ='\0'; 544 nCount++; 545 j = 0; 546 continue; 547 } 548 strScore[j] = strBuf[i]; 549 printf("分数:%s,\n",strScore); 550 j++; 551 } 552 } 553 //插入到链表中 554 AddStu(strName,strId,atoi(strScore)); 555 } 556 //关闭 557 fclose(pFile); 558 } 559 560 561 562 563 564 565