C语言 动态链表

 

  1、 什么是动态链表?

    动态链表,其实,就是在程序运行的过程所产生出来的节点,而不是预先定义好的节点。

    而动态链表的作用是,在创建链表时,不确定有多少个节点,那么,就可以在程序运行

    的过程中再根据程序的判断去创建节点,从而,形成动态链表。

 

  2、动态产生节点的函数

    在C语言里面,它提供了两个函数 malloc 与 calloc 来动态产生节点。

 

       函数malloc的原型如下:

       void *malloc(unsigned int size );

       原型分析

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

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

 

       函数calloc的原型如下:

       void *calloc( unsigned n ,unsigned size );

       原型分析

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

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

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

    

  3、释放节点的函数

     free函数的原型如下:

     void free ( void  *p );

 

     原型分析

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

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

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

 

  4、例子:   

        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语言中的(动态链表)但是,如何去运行用它呢?

所以,我们就需要通过下方的链接,进入到C语言的代码训练中,然后,通过实践去加深对该知识点的理解与运用。

>>>下载训练环境与使用说明(使用真实的开发环境,结合游戏闯关进行编程训练)