typedef的用法 单向链表的查找、增加、删除、销毁。

一:typedef的用法。
   写一个数据结构(计算机存储数据的一种方式,是抽象的,可以人为组织,提高算法效率),我们需要注意:接口友好,模块化,规范命名等方面,在接口友好方面,typedef是非常好用并且标准及人性化的。
   

点击(此处)折叠或打开

  1. /*定义一个叫student的结构体*/
  2. struct student
  3. {
  4.     int Id;
  5.     char name[20];       
  6. };

  7. /*定义成员*/
  8. struct stduent stu1,stu2;   //定义了2个名字分别为stu1和stu2的结构体
  9. struct student *stu;         //定义一个指向stu的4字节的指针
  10. typedef struct student * head;  //将struct student * 定义为 head
  11. head h;                     //直接用head 就可以定义头指针






二:单向链表的查找、增加、删除、销毁。(要是只写一段查找或者增加的某程序,倒不是很好写,所以就写了个简单的学生系统,也可以练习下自己的c语言,看的客官注意注释)。
   

点击(此处)折叠或打开

  1. /*************************************************************************
  2.     > File Name: link.c
  3.     > Author:
  4.     > Mail:
  5.     > Created Time: Thu 23 Jul 2015 11:41:41 AM CST
  6.  ************************************************************************/

  7. #include<stdio.h>
  8. #include<stdlib.h>
  9. #define LEN sizeof(struct student)


  10. struct student
  11. {
  12.     int Id;
  13.     char name[20];
  14.     struct student *next;
  15. };

  16. typedef struct student * head;                        //用typedef 以后我定义指针就直接用head了。

  17. head Input(head h);
  18. head Delete();
  19. int Ruin(head h);
  20. void Print();
  21. head Find();
  22. void biaotou();

  23. void biaotou()
  24. {
  25.     printf("\n 信息表\n");
  26.     printf("学生编号\t学生姓名\n");
  27. }
  28. head Find(head h)
  29. {
  30.     int Id;
  31.     head p;

  32.     printf("请输入学生编号\n");
  33.     scanf("%d",&Id);
  34.     for(p = h ;p->next;p = p->next)                     //查找过程 
  35.     {                                                                                                                       
  36.         if(p->next->Id == Id)                           //为什么直接用p->next->Id ,原因是返回要找的前驱节点,以后删除和增加的时候都有好处。

  37.         {
  38.             biaotou();
  39.             printf("%d\t\t%s\n",p->next->Id,p->next->name);
  40.             break;
  41.         }
  42.     }
  43.         if(p->next == NULL)
  44.         {
  45.             printf("没有此学号\n");
  46.         }
  47.         

  48.     return(p);
  49. }
  50. void Print(head h)
  51. {
  52.     head p;
  53.     
  54.     printf("\n 信息表\n");
  55.     printf("学生编号\t学生姓名\n");
  56.     for(p = h->next; p; p = p->next)                     //显示的时候直接显示p->next
  57.     printf("%d\t\t%s\n",p->Id,p->name);


  58. }
  59. int Ruin(head h)
  60. {
  61.     head p = NULL;
  62.     int choice;

  63.     printf("确定销毁整个链表?(1:销毁,2:不销毁)\n");
  64.     scanf("%d",&choice);
  65.     if(choice == 1)
  66.     {
  67.     for(p;h->next;)                                      //传进来头结点 然后每次保存h->next  
  68.     {                                                    //改链域之后在删除第二个,然后第三个,
  69.         p = h->next;
  70.         h->next = p->next;
  71.         free(p);                                         //最后需要把最后一个也释放
  72.     }
  73.     free(h);
  74.         printf("销毁成功\n");
  75.     }
  76.     if(choice == 2)
  77.     {
  78.         return 0;
  79.     }
  80. }
  81. head Delete(head t)
  82. {
  83.     head p;
  84.     
  85.     p = t->next;                                             //保存要删除的节点
  86.     t->next = p->next;                                       //更改链域绕过要删除的节点
  87.     free(p);                                                 //删除要删除的节点
  88.     printf("删除成功\n");

  89. }

  90. void Add(head t)                                            //在插入之前,已经查找了插入点的位置
  91. {
  92.     head p ;                                                 // t:find()函数的返回值,返回查找到点的前驱节点

  93.     p = (head) malloc (LEN);                            
  94.     printf("请输入要插入学生的信息\n");
  95.     printf("请输入学生Id\n");
  96.     scanf("%d",&p->Id);
  97.     printf("请输入学生姓名\n");
  98.     scanf("%s",p->name);                                       //准备好要插入的信息
  99.                                                                 
  100.     p->next = t->next;                                           //将要插入的节点与后一个节点相连
  101.     t->next = p;                                                 //将前驱节点与要插入的节点相连即可

  102.     
  103. }
  104. head Input(head h)
  105. {
  106.     char choice;
  107.     head p;
  108.     head q;
  109.     h = (head) malloc(LEN);                                     //整个结构要清晰  head p; 表示p是一个四字节的,指向结构体的指针
  110.     q = h;                                                      //malloc 之后,就相当于有了空间 并且p指向它
  111.     do
  112.     {
  113.         p = (head) malloc(LEN);
  114.         printf("请输入学生Id\n");
  115.         scanf("%d",&p->Id);
  116.         printf("请输入学生姓名\n");
  117.         scanf("%s",p->name);
  118.         p->next = NULL;
  119.         h->next = p;
  120.         h = p;
  121.         printf("Contine?(Y/N)\n");
  122.         getchar();
  123.         scanf("%c",&choice);
  124.     }while(choice == 'Y'||choice == 'y' );
  125.     
  126.     return(q);

  127. }



  128. int main(int argc,char *agrv[])
  129. {
  130.     head h = NULL;
  131.     head t = NULL; //查找到的学生信息id所指的指针
  132.     int choice;

  133.     printf("学生信息\n");
  134.     do
  135.     {
  136.         printf("1:输入信息\n");
  137.         printf("2:增加信息\n");
  138.         printf("3:删除信息\n");
  139.         printf("4:销毁信息\n");
  140.         printf("5:显示信息\n");
  141.         printf("6:查找信息\n");
  142.         printf("0:退出程序\n");
  143.         printf("请输入:");
  144.         scanf("%d",&choice);
  145.         switch(choice)
  146.         {
  147.             case 1:h = Input(h);
  148.             break;
  149.             case 2:
  150.             printf("请先确定要插入的位置学号(前插入)是否存在\n");
  151.             printf("注意:若不存在,默认插入到最后\n");
  152.             t = Find(h);
  153.             Add(t);
  154.             break;
  155.             case 3:
  156.             printf("请先确定要删除的学号是否存在\n");
  157.             t = Find(h);
  158.             Delete(t);
  159.             break;
  160.             case 4:Ruin(h);
  161.             break;
  162.             case 5:Print(h);
  163.             break;
  164.             case 6:Find(h);
  165.             break;
  166.         }
  167.     }while(choice != 0);
  168. }


阅读(1) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~
评论热议

版权声明:本文为博主原创文章,未经博主允许不得转载。

posted on 2015-08-04 21:07  杨博东的博客  阅读(503)  评论(0编辑  收藏  举报

导航