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_*/
View Code

 

 

 

posted @ 2018-04-20 23:16  醉风晨  阅读(1701)  评论(0编辑  收藏  举报