C语言程序设计——电话本
个人通讯系统
函数声明:
LinkList Createlinklist(void);//创建链表函数申明
LinkList Insertlinklist(LinkList head);//插入链表函数申明
LinkList Deletelinklist(LinkList head);//删除节点函数
LinkList searchlinklist1(LinkList head);//以 mob_phono 在链表上查找
LinkList searchlinklist2(LinkList head);//以 name 在链表上查找
LinkList Sort1(LinkList head);//姓名排序
LinkList Sort2(LinkList head);//电话号码排序
void inputdate(LinkList s);//数据输入函数
void Outputlinklist(LinkList head);//链表的遍历,数据输出
void Store(LinkList head);//储存
void program(LinkList head);//控制函数
void mum(void);//菜单显
1 //线性表链式结构——C语言课程设计通讯管理系统 2 #include <stdio.h> 3 #include <stdlib.h> 4 #include <string.h> 5 #include <windows.h>//插入此头文件的目的是调用Sleep(1000)函数,中间1000正常情况下表示一秒钟 6 /*创建链表结点*/ 7 8 typedef struct node { 9 char name[10]; 10 char unit[30]; 11 char mob_phono[15]; 12 char land_phono[15]; 13 char type[10]; 14 char add[25]; 15 char e_mail[25]; 16 char qq[15]; 17 struct node *next; //next为结点指针域用于存放下一个结点的地址 18 }ListNode, *LinkList;/*用typedef将struct node 重新命名为ListNode,方便以后的使用,将ListNode * 重新命名为LinkList*/ 19 20 //主要申明区间 21 void mum(void);//菜单显示函数 22 void program(LinkList head);//控制函数 23 LinkList Createlinklist(void);//创建链表函数申明 24 LinkList Readin(void);//读取创建链表申明 25 LinkList Insertlinklist(LinkList head);//插入链表函数申明 26 LinkList Deletelinklist_Mob_Phono(LinkList head);//以 Mob_phono进行删除 27 LinkList Deletelinklist_Name(LinkList head);//以 Name进行删除 28 LinkList searchlinklist_Mob_Phono(LinkList head);//以 Mob_phono 在链表上查找 29 LinkList searchlinklist_Name(LinkList head);//以 Name 在链表上查找 30 LinkList Sort_Name(LinkList head);//以 Name 排序 31 LinkList Sort_Mob_Phono(LinkList head);//以 Mob_phono 排序 32 LinkList Outputlinklist(LinkList head);//链表的遍历,数据输出 33 void CountNumber(LinkList head);//计算链表数据的长度 34 void inputdate(LinkList s);//数据输入函数 35 void Store_Visit(LinkList head);//储存到可视文件函数,保存数据到电话本1.text 36 void Store_User(LinkList head);//储存至可使用文件,保存数据到电话本2.bat 37 void swap(ListNode *p1, ListNode *p2);//两数据交换的函数,用于排序步骤中的整体数据交换 38 void Distory(LinkList *h);//线性表的销毁 39 40 //主程序 41 int main(void) 42 { 43 system("color F1");//颜色背景函数System("color 100")可以查看该函数后面的两个字符的说明 44 LinkList head; 45 int i = 0; 46 printf("请选择输入创建链表(0),还是读取创建链表(非0):"); 47 scanf("%d", &i); 48 if (i == 0) 49 head = Createlinklist(); 50 else 51 head = Readin(); 52 program(head); 53 Distory(&head);//程序运行完成之前最后一步,调用此函数,销毁链表,释放内存 54 printf("程序以经安全退出......\n"); 55 return 0; 56 } 57 58 //菜单函数,单纯打印菜单,使更加明了 59 void mum() 60 { 61 printf("\t、、、、、、、、、、、、、、、命令菜单、、、、、、、、、、、、、、、、\n"); 62 printf("\t++--------------------------------++--------------------------------++\n"); 63 printf("\t||1-----------------------以号插入||7-----------------------以名排序||\n"); 64 printf("\t||2-----------------------以号删除||8-----------------------统计个数||\n"); 65 printf("\t||3-----------------------以名删除||9-----------------------清除屏幕||\n"); 66 printf("\t||4-----------------------以号查找||10----------------------显示数据||\n"); 67 printf("\t||5-----------------------以名查找||11----------------------存可视表||\n"); 68 printf("\t||6-----------------------以号排序||12----------------------存可用表||\n"); 69 printf("\t++--------------------------------++--------------------------------++\n"); 70 } 71 72 //控制程序 73 void program(LinkList head) 74 { 75 int c; 76 mum(); 77 printf("请选择:\n"); 78 scanf("%d", &c); 79 while (c != 0)//如果输入的是0,终止循环 80 { 81 if (c >= 1 && c <= 12)//如果c在1~12之间,执行下面switch函数 82 switch (c) 83 { 84 case 1: head = Insertlinklist(head); break; 85 case 2: head = Deletelinklist_Mob_Phono(head); break; 86 case 3: head = Deletelinklist_Name(head); break; 87 case 4: head = searchlinklist_Mob_Phono(head); break; 88 case 5: head = searchlinklist_Name(head); break; 89 case 6: head = Sort_Mob_Phono(head); break; 90 case 7: head = Sort_Name(head); break; 91 case 8: CountNumber(head); break; 92 case 9: system("CLS"); break; 93 case 10: head = Outputlinklist(head); break; 94 case 11: Store_Visit(head); break; 95 case 12: Store_User(head); break; 96 } 97 else//如果不是,则输入指令有误,重新输入 98 printf("错误的指令...........\n"); 99 mum(); 100 printf("\n请选择:\n"); 101 scanf("%d", &c); 102 } 103 Store_User(head);//考虑程序执行的稳定性,附加默认存储函数,这样数据不易丢失 104 } 105 106 /*创建一个以mob_phono为元素链表,按mob_phono升序排列,以0输入为建立结束*/ 107 LinkList Createlinklist() 108 { 109 char x[15]; 110 LinkList head, s, r; 111 head = (ListNode*)malloc(sizeof(ListNode)); /*为头结点head申请空间*/ 112 /*这里涉及到sizeof函数,它的用途是计算其后面的定义类型所占多少字节,并返回字节数若为int则返回4,char 返回1*/ 113 /*malloc函数,为head分配固定的内存空间,前面的语句,表示分配一个链表的数据域所占的内存给head*/ 114 if (!head)//内存分配判断 115 { 116 printf("内存申请失败,程序退出......\n"); 117 exit(-1); 118 } 119 r = head; 120 r->next = NULL; 121 printf("请按mob_phono升序输入,以0输入为结束\n"); 122 printf("请输入一个mob_phono:"); 123 scanf("%s", x); /*读入一个mob_phono*/ 124 while (strcmp(x, "0") != 0) /*当输入mob_phono不为空时,添在当前表尾部*/ 125 { 126 s = (ListNode*)malloc(sizeof(ListNode));/*为添入结点申请空间*/ 127 if (!s)//内存分配判断 128 { 129 printf("内存申请失败,程序退出......\n"); 130 exit(-1); 131 } 132 strcpy(s->mob_phono, x); 133 inputdate(s); 134 s->next = r->next; 135 r->next = s;/*这两句表示将新创建的s结点连接到r结点的后面,r初次对应的head并没有数据,所以head是含有空头的链表,画图可以更方便理解*/ 136 r = s;/*用r将新定义的结点s取代,这样可以使用s进行反复连接*/ 137 printf("请输入下一个mob_phono:"); 138 scanf("%s", x); /*输入下一个mob_phono*/ 139 } 140 return head; 141 } 142 143 /*在链表head上插入数据*/ 144 LinkList Insertlinklist(LinkList head) 145 { 146 char x[15]; 147 ListNode *p, *s; 148 printf("请输入要插入的mob_phono:"); 149 scanf("%s", x); /*输入要插入的mob_phono*/ 150 p = head; /*P指向链表的头结点*/ 151 while (p->next && strcmp(x, p->next->mob_phono)>0)/*查找插入位置的前一个位置*/ 152 { 153 p = p->next; 154 } 155 if (x == p->next->mob_phono) /*数据已,有不能插入*/ 156 printf("重复插入,不允许。\n"); 157 else/*插入位置正确*/ 158 { 159 s = (ListNode *)malloc(sizeof(ListNode)); /*为插入结点申请空间。*/ 160 if (!s)//内存分配判断 161 { 162 printf("内存申请失败,程序退出......\n"); 163 exit(-1); 164 } 165 strcpy(s->mob_phono, x); 166 inputdate(s); 167 s->next = p->next; /*将插入结点s插到p的后面*/ 168 p->next = s; /*这两句是插入结点的固定模式,先将p的结点域给s的结点域,然后再将s的头与p的结点相接*/ 169 /*这样就实现了链表的插入链接*/ 170 } 171 return head; 172 } 173 174 /*数据输入*/ 175 void inputdate(LinkList s) 176 { 177 int i = 0, k = 0; 178 printf("输入他的姓名:");//每个电话号码都必须储存他的电话号码和姓名,所以没有选择输入指令 179 scanf("%s", s->name); 180 181 //选择输入指令模块 182 printf(".................选择输入................\n"); 183 { 184 //公司名称选择输入指令 185 printf("是否输入公司名称?'1'表示'是':"); 186 scanf("%d", &k); 187 if (k == 1) 188 { 189 printf("请输入公司名称:"); 190 scanf("%s", s->unit); 191 } 192 else 193 strcpy(s->unit, "无\0");//设置默认值 194 k = 0; 195 196 //固定电话号码选择输入指令 197 printf("是否输入固定电话号码?'1'表示'是':"); 198 scanf("%d", &k); 199 if (k == 1) 200 { 201 printf("请输入固定电话号码:"); 202 scanf("%s", s->land_phono); 203 } 204 else 205 strcpy(s->land_phono, "无\0");//设置默认值 206 k = 0; 207 208 //分组选择输入指令 209 printf("是否输入分组?'1'表示'是':"); 210 scanf("%d", &k); 211 if (k == 1) 212 { 213 printf("请输入公司分组:"); 214 scanf("%s", s->type);//设置默认值 215 } 216 else 217 strcpy(s->type, "无\0"); 218 k = 0; 219 220 //地址选择输入指令 221 printf("是否输入地址?'1'表示'是':"); 222 scanf("%d", &k); 223 if (k == 1) 224 { 225 printf("请输入地址:"); 226 scanf("%s", s->add); 227 } 228 else 229 strcpy(s->add, "无\0");//设置默认值 230 k = 0; 231 232 //e_mail选择输入指令 233 printf("是否输入e_mail?'1'表示'是':"); 234 scanf("%d", &k); 235 if (k == 1) 236 { 237 printf("请输入e_mail:"); 238 scanf("%s", s->e_mail); 239 } 240 else 241 strcpy(s->e_mail, "无\0");//设置默认值 242 k = 0; 243 244 //qq选择输入指令 245 printf("是否输入qq?'1'表示'是':"); 246 scanf("%d", &k); 247 if (k == 1) 248 { 249 printf("请输入qq:"); 250 scanf("%s", s->qq); 251 } 252 else 253 strcpy(s->qq, "无\0");//设置的默认值 254 } 255 }//尾部设置为'0/'防止输出时会出现乱码 256 257 /*在链表head上按电话号码删除*/ 258 LinkList Deletelinklist_Mob_Phono(LinkList head) 259 { 260 int count = 0; 261 char x[15]; 262 ListNode *p, *r; 263 if (head->next == NULL)//链表数据为空判断 264 { 265 printf("链表为空,无法进行删除,请尝试其他指令......\n"); 266 return head; 267 } 268 printf("请输入要删除的mob_phono:"); 269 scanf("%s", x); /*输入要删除的mob_phono*/ 270 p = head; 271 r = head->next; 272 while (r)//执行r次循环,如果有r个相同的数据,则都可以删除 273 { 274 p = head; 275 r = head->next; 276 while (r && strcmp(x, r->mob_phono) != 0) /*查找要删除的mob_phono*/ 277 { 278 p = r; 279 r = r->next; /*依次将p,r后移一个结点*/ 280 } 281 if (r == NULL) 282 { 283 if (count == 0)/*没有找到要删除的mob_phono*/ 284 printf("没有找到要删除的mob_phono......\n"); 285 } 286 else /*找到要删除的mob_phono,进行删除*/ 287 { 288 p->next = r->next;/*删除时直接将要删除的前一个结点指向要删除的结点,就可以进行删除*/ 289 /*这里要删除的结点是r*/ 290 free(r); 291 count++; 292 } 293 } 294 if (count != 0) 295 printf("找到要删除的mob_phono......\n"); 296 return head; 297 } 298 299 //以姓名进行删除数据 300 LinkList Deletelinklist_Name(LinkList head) 301 { 302 int count = 0; 303 char x[10]; 304 ListNode *p, *r; 305 if (head->next == NULL)//链表数据为空判断 306 { 307 printf("链表为空,无法进行删除,请尝试其他指令......\n"); 308 return head; 309 } 310 printf("请输入要删除的Name:"); 311 scanf("%s", x); /*输入要删除的Name*/ 312 p = head; 313 r = head->next; 314 while (r) 315 { 316 p = head; 317 r = head->next; 318 while (r && strcmp(x, r->name) != 0) /*查找要删除的name*/ 319 { 320 p = r; 321 r = r->next; /*依次将p,r后移一个结点*/ 322 } 323 if (r == NULL) 324 { 325 if (count == 0)/*没有找到要删除的name*/ 326 printf("没有找到要删除的Name......\n"); 327 } 328 else /*找到要删除的name,进行删除*/ 329 { 330 p->next = r->next;/*删除时直接将要删除的前一个结点指向要删除的结点,就可以进行删除*/ 331 /*这里要删除的结点是r*/ 332 free(r); 333 count++; 334 } 335 } 336 if (count != 0) 337 printf("找到要删除的Name,数据已删除......\n"); 338 return head; 339 } 340 341 /*在链表上按电话号码查找*/ 342 LinkList searchlinklist_Mob_Phono(LinkList head) 343 { 344 char x[15]; 345 ListNode *p, *r;/*定义两个链表类型的指针表示相连的两个结点*/ 346 if (head->next == NULL)//链表数据为空判断 347 { 348 printf("链表为空,无法进行查找,请尝试其他指令......\n"); 349 return head; 350 } 351 printf("请输入要查找的Mob_phono:"); 352 scanf("%s", x);/*输入要查找的mob_phono*/ 353 p = head; 354 r = head->next; 355 while (r && strcmp(x, r->mob_phono) != 0) /*查找要查找的mob_phono*/ 356 { 357 p = r; 358 r = r->next;/*依次将p,r后移一个结点*/ 359 } 360 if (r == NULL) 361 printf("没有找到要查找的Mob_phono......\n\n"); /*没有找到要查找的mob_phono*/ 362 else 363 { 364 printf("存在该查找的数据......\n"); 365 printf(" +--------+--------+------------+------------+------+----------------+----------------+-----------+\n"); 366 printf(" |--姓名--|--公司--|--移动电话--|--固定电话--|-类型-|------地址------|-----e_mail-----|----qq-----|\n"); 367 p = head; 368 r = head->next; 369 while (r)//如果数据有相同的,也可以一起被输出出来 370 { 371 while (r && strcmp(x, r->mob_phono) != 0) /*查找要查找的mob_phono*/ 372 { 373 p = r; 374 r = r->next;/*依次将p,r后移一个结点*/ 375 } 376 if (r) 377 { 378 printf(" |%8s|%8s|%12s|%12s|%6s|%16s|%16s|%11s|\n", 379 r->name, r->unit, r->mob_phono, r->land_phono, r->type, r->add, r->e_mail, r->qq); 380 r = r->next; 381 } 382 } 383 printf(" +--------+--------+------------+------------+------+------------------+--------------+-----------+\n\n"); 384 } 385 return head; 386 } 387 388 /*在链表上按姓名查找*/ 389 LinkList searchlinklist_Name(LinkList head) 390 { 391 char name1[10]; 392 ListNode *p, *r;/*定义两个链表类型的指针表示相连的两个结点*/ 393 if (head->next == NULL)//链表数据为空判断 394 { 395 printf("链表为空,无法进行查找,请尝试其他指令......\n"); 396 return head; 397 } 398 printf("请输入要查找的Name:"); 399 scanf("%s", name1);/*输入要查找的name*/ 400 p = head; 401 r = head->next; 402 while (r && strcmp(name1, r->name) != 0) /*查找要查找的name*/ 403 { 404 p = r; 405 r = r->next;/*依次将p,r后移一个结点*/ 406 } 407 if (r == NULL) 408 printf("没有找到要查找的Name......\n\n"); /*没有找到要查找的mame*/ 409 else 410 { 411 printf("存在该查找的数据......\n"); 412 printf(" +--------+--------+------------+------------+------+----------------+----------------+-----------+\n"); 413 printf(" |--姓名--|--公司--|--移动电话--|--固定电话--|-类型-|------地址------|-----e_mail-----|----qq-----|\n"); 414 p = head; 415 r = head->next; 416 while (r)//如果数据有相同的,也可以一起被输出出来 417 { 418 while (r && strcmp(name1, r->name) != 0) /*查找要查找的mob_phono*/ 419 { 420 p = r; 421 r = r->next;/*依次将p,r后移一个结点*/ 422 } 423 if (r) 424 { 425 printf(" |%8s|%8s|%12s|%12s|%6s|%16s|%16s|%11s|\n", 426 r->name, r->unit, r->mob_phono, r->land_phono, r->type, r->add, r->e_mail, r->qq); 427 r = r->next; 428 } 429 } 430 printf(" +--------+--------+------------+------------+------+----------------+----------------+-----------+\n\n"); 431 } 432 return head; 433 } 434 435 436 //交换两个数据函数 437 void swap(ListNode *p1, ListNode *p2) 438 { 439 char temp[30]; 440 strcpy(temp, p1->name); 441 strcpy(p1->name, p2->name); 442 strcpy(p2->name, temp); 443 444 strcpy(temp, p1->unit); 445 strcpy(p1->unit, p2->unit); 446 strcpy(p2->unit, temp); 447 448 strcpy(temp, p1->mob_phono); 449 strcpy(p1->mob_phono, p2->mob_phono); 450 strcpy(p2->mob_phono, temp); 451 452 strcpy(temp, p1->land_phono); 453 strcpy(p1->land_phono, p2->land_phono); 454 strcpy(p2->land_phono, temp); 455 456 strcpy(temp, p1->type); 457 strcpy(p1->type, p2->type); 458 strcpy(p2->type, temp); 459 460 strcpy(temp, p1->add); 461 strcpy(p1->add, p2->add); 462 strcpy(p2->add, temp); 463 464 strcpy(temp, p1->e_mail); 465 strcpy(p1->e_mail, p2->e_mail); 466 strcpy(p2->e_mail, temp); 467 468 strcpy(temp, p1->qq); 469 strcpy(p1->qq, p2->qq); 470 strcpy(p2->qq, temp); 471 472 } 473 474 //按姓名排序 475 LinkList Sort_Name(LinkList head) 476 { 477 int i, j, count = 0; 478 if (head->next == NULL)//链表为空判断 479 { 480 printf("无数据不执行排序......\n"); 481 return head; 482 } 483 LinkList p = (LinkList)malloc(sizeof(ListNode)); 484 if (!p)//内存分配判断 485 { 486 printf("内存分配失败,程序中断......\n"); 487 exit(-1); 488 } 489 p = head->next; 490 while (p) 491 { 492 count++; 493 p = p->next; 494 } 495 for (j = 0; j<count - 1; j++) 496 { 497 p = head->next; 498 for (i = 0; i<count - j - 1; i++) 499 { 500 if (strcmp(p->name, p->next->name)>0) 501 { 502 swap(p, p->next); 503 } 504 p = p->next; 505 } 506 } 507 return head; 508 } 509 510 //按照号码排序 511 LinkList Sort_Mob_Phono(LinkList head) 512 { 513 if (head->next == NULL)//链表为空判断 514 { 515 printf("无数据不执行排序......\n"); 516 return head; 517 } 518 int i, j, count = 0; 519 520 LinkList p = (LinkList)malloc(sizeof(ListNode)); 521 if (!p)//内存分配判断 522 { 523 printf("内存分配失败,程序中断......\n"); 524 exit(-1); 525 } 526 p = head->next; 527 while (p) 528 { 529 count++; 530 p = p->next; 531 } 532 for (j = 0; j<count - 1; j++) 533 { 534 p = head->next; 535 for (i = 0; i<count - j - 1; i++) 536 { 537 if (strcmp(p->mob_phono, p->next->mob_phono)>0) 538 { 539 swap(p, p->next); 540 } 541 p = p->next; 542 } 543 } 544 return head; 545 } 546 547 /*输出链表head中的所有数据元素*/ 548 LinkList Outputlinklist(LinkList head) 549 { 550 ListNode *p; 551 int i = 0; 552 p = head->next; 553 if (head->next == NULL)//链表为空判断 554 { 555 printf("链表中没有数据......\n"); 556 return head; 557 } 558 printf("\n 、、、、、、、、、、、、、、、、、、、、、《个人通讯录》、、、、、、、、、、、、、、、、、、、、、\n"); 559 printf(" +--------+--------+------------+------------+------+----------------+----------------+-----------+\n"); 560 printf(" |--姓名--|--公司--|--移动电话--|--固定电话--|-类型-|------地址------|-----e_mail-----|----qq-----|\n"); 561 while (p) 562 { 563 printf(" |%8s|%8s|%12s|%12s|%6s|%16s|%16s|%11s|\n", 564 p->name, p->unit, p->mob_phono, p->land_phono, p->type, p->add, p->e_mail, p->qq); 565 p = p->next;/*p指向p的下一个结点*/ 566 i++; 567 if (i % 10 == 0) 568 { 569 printf(" +--------+--------+------------+------------+------+----------------+----------------+-----------+\n"); 570 Sleep(1000); 571 system("CLS"); 572 printf("\n\t、、、、、、、、、、、、、、、、、、、、《个人通讯录》、、、、、、、、、、、、、、、、、、、、\n"); 573 printf(" +--------+--------+------------+------------+------+----------------+----------------+-----------+\n"); 574 printf(" |--姓名--|--公司--|--移动电话--|--固定电话--|-类型-|------地址------|-----e_mail-----|----qq-----|\n"); 575 } 576 } 577 printf(" +--------+--------+------------+------------+------+----------------+----------------+-----------+\n\n"); 578 return head; 579 } 580 581 //存储数据到电话本1 582 void Store_Visit(LinkList head) 583 { 584 LinkList p; 585 FILE *fp; 586 if ((fp = fopen("电话本1.text", "w+")) == NULL)//文件指针打开文件判断 587 { 588 printf("打开文件失败...............\n"); 589 exit(-1); 590 } 591 p = head->next; 592 printf("文件已存档为“电话本1.text”.......................\n"); 593 fprintf(fp, " +--------+--------+------------+------------+------+----------------+----------------+-----------+\n"); 594 fprintf(fp, " |--姓名--|--公司--|--移动电话--|--固定电话--|-类型-|------地址------|-----e_mail-----|----qq-----|\n"); 595 while (p) 596 { 597 fprintf(fp, " |%8s|%8s|%12s|%12s|%6s|%16s|%16s|%11s|\n", 598 p->name, p->unit, p->mob_phono, p->land_phono, p->type, p->add, p->e_mail, p->qq); 599 p = p->next; 600 } 601 fprintf(fp, " +--------+--------+------------+------------+------+----------------+----------------+-----------+\n"); 602 fclose(fp); 603 } 604 605 //储存至不可人工修改查看但可使用文件,到电话本2 606 void Store_User(LinkList head) 607 { 608 LinkList p; 609 FILE *fp; 610 if ((fp = fopen("电话本2.bat", "wb")) == NULL)//文件指针打开文件判断 611 { 612 printf("打开文件失败...............\n"); 613 exit(-1); 614 } 615 p = head->next; 616 printf("文件已存档为“电话本2.bat”.......................\n"); 617 while (p) 618 { 619 fwrite(p, sizeof(ListNode), 1, fp); 620 p = p->next; 621 } 622 fclose(fp); 623 } 624 625 //读取数据到链表中 626 LinkList Readin(void) 627 { 628 FILE *fp; 629 int count = 0; 630 LinkList head, s, r, tryit;//tryit 是用作尝试的指针,没其他作用 631 head = (ListNode*)malloc(sizeof(ListNode)); 632 if (!head)//内存分配判断 633 { 634 printf("创建链表head ,内存分配失败......\n"); 635 exit(-1); 636 } 637 r = head; 638 r->next = NULL; 639 if ((fp = fopen("电话本2.bat", "rb")) == NULL)//文件指针打开文件判断 640 { 641 printf("打开文件失败......\n"); 642 exit(-1); 643 644 } //获取文件的指针 645 tryit = (ListNode*)malloc(sizeof(ListNode)); 646 while (!feof(fp))//这里会多循环一次,实际count = count + 1 647 { 648 fread(tryit, sizeof(ListNode), 1, fp); 649 count++; 650 } 651 free(tryit);//释放这个尝试使用的空间 652 count -= 1;//将count 还原 653 fseek(fp, 0L, SEEK_SET);//将文件指针移动到文件首 654 while (count) 655 { 656 s = (ListNode*)malloc(sizeof(ListNode)); 657 fread(s, sizeof(ListNode), 1, fp); //按照ListNode的大小每次读一个数据到s中 658 s->next = r->next; 659 r->next = s; 660 r = s;//以上3句是将s的数据给r,然偶以此往后推,直到将文件的数据全部读到head链表中 661 count--; 662 } 663 fclose(fp); 664 return head; 665 } 666 667 void CountNumber(LinkList head)//显示链表的长度 668 { 669 int count = 0; 670 LinkList s; 671 s = head->next; 672 while (s) 673 { 674 count++; 675 s = s->next; 676 } 677 printf("count = %d\n", count); 678 } 679 680 //销毁线性表 681 void Distory(LinkList *h) 682 { 683 LinkList p, q; 684 p = *h; 685 while (p) 686 { 687 q = p; 688 p = p->next; 689 free(q); 690 } 691 *h = NULL; 692 printf("销毁链表成功......\n"); 693 } 694 695 //#endif/*LINKLIST_H_*/