C 动态链表

 

  在接下来的时间里面,我们准备为大家介绍"链动态链表"。


  (1)为什么需要动态链表?

      在前面的学习中,我们已经了解到如何定义链表,但是,在当时的学习过程中,我们是预先

      定义了多个结构体的变量作为节点,然后,再把它们连接起来。

      但是,如果节点的数量不确定,那么,我们如何在程序运行的过程添加或删除节点呢?

      所以,我们就需要动态产生节点并把它链接到链表中,从而,形成动态链表。

 

 

 

   接下来,我们要学习如何动态产生节点,而这个工作,在C语言里面它就提供了函数malloc与calloc

来完成,也就是说,当我们需要动态产生节点时,就可以使用这两个函数来完成工作。

 

     函数malloc的原型如下:

     void *malloc(unsigned int size );

 

     原型分析

     malloc函数的作用就是分配一个由参数size所指定大小的内存空间,并返回成功分配后的

     内存空间的起始地址。如果分配不成功则返回NULL空值。

 

 

 

     函数calloc的原型如下:

     void *calloc( unsigned n ,unsigned size );

 

     原型分析

     calloc函数的作用就是分配n个连续的内存空间,而要分配多少个,则由第一个参数n来决定。

     而每一个内存空间要分配的大小,则由第二个参数size来决定。

     如果分配成功,则返回已分配的连续内存空间的起始地址,否则,返回NULL空值。

 

 

 

     free函数的原型如下:

     void free ( void  *p );

 

     原型分析

     free函数的作用是释放参数p所指向的内存空间,而这里的参数p,是指通过

     malloc或calloc函数成功分配内存空间后的返回值。

     另外,free函数没有返回值。

 

 

 

  (2)

       例子:

     

        struct ST  //定义了结构体ST

        {

         int Number;     //编号,用于记录一个整型数

         struct ST * next;  //定义一个ST结构体的指针变量next,指向链表中下一个节点

        };   

 

        void main()

        {

          //定义了结构体ST的指针变量head作为第一个节点

          struct ST * head; 

 

          int len = sizeof( struct ST ); //通过sizeof获取ST结构体的大小

                          并保存于 变量len中

 

       (1)//通过malloc为第一个节点head分配内存空间,并通过(struct ST*)对返回的

           类型强制转换为(结构体ST的指针类型)

 

          head = ( struct ST * ) malloc( len );//根据变量len中所保存的大小来分配内存空间

 

          //通过head节点调用成员Number,并赋值为1

 

          head->Number = 1;

 

       (2)//再通过malloc分配另一个内存空间,作为第2个节点

           并通过第一个节点的next成员指向第2个节点的内存空间。

 

          head->next = ( struct ST * ) malloc( len );

 

          //通过head节点调用成员next找到第2个节点

           并调用第2个节点的成员Number,并赋值为2

 

           head->next->Number = 2;

 

       (3)//再通过malloc分配另一个内存空间,作为第3个节点

           并通过第一个节点的next成员找到第2个节点,

           然后,通过第2个节点的next成员指向第3个节点的内存空间。

 

           head->next->next = ( struct ST * ) malloc( len );

 

          //通过head节点调用成员next找到第2个节点

           再通过第2个节点调用成员next找到第3个节点,

           再通过第3个节点调用成员Number,并赋值为3

 

           head->next->next->Number = 3;

        }       

 

       

  小结:

   (1)从第一个节点head开始可以通过每个节点的next成员找到下一个节点。

   (2)每个节点中的next成员都指向下一个节点的内存空间,即指向下一个节点。

      所以,可以通过next成员调用下一个节点中的成员。

 

 

 

 

   非常好,现在,我们已经掌握了C中的“动态链表”这个知识点,但是,如何去运行用它呢?所以,我们就要通过下方的按钮进入到游戏中,然后,运用该知识点去完成任务,这样,才可以加深大家对每个知识点的理解和运用,以及“尽快进入到编程的状态”

 

      不要停留在理论规则上面,快动起来吧!

 

(通过游戏模式学习与训练,需要在电脑上运行)

进入游戏学习与训练