C 删除节点

 

  在接下来的时间里面,我们准备为大家介绍"删除节点"。


  (1)在删除链表中的节点时,首先,要把删除的节点从链表中分离出来,同时,保证链表

     在删除某节点后,其前后节点可以链接上,不能让链表出现断开的情况。

  (2)如果删除的是链表中的第一个节点,那么,就需要通过一个针指变量先指向下一个节点,

     然后,再删除第一个节点。

  (3)如果删除的是链表中最后一个节点,那么,就需要将它指向下一个节点的成员赋值为NULL,

     然后,再删除最后一个节点。

  (4)通过前面学习过的free函数,将分离出来的节点所占用的存储空间释放掉,即删除节点。

 

 

 

   例子:

     

        struct ST  //定义了结构体ST

        {

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

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

        };   

 

        void main()

        {

          struct ST * head; //定义了结构体ST的指针变量head指向第一个节点

          struct ST * p1; //定义了结构体ST的指针变量p1指向当前节点

 

          int len = sizeof( struct ST ); //获取结构体ST的大小并保存于len中

 

          head = ( struct ST * ) malloc( len ); //分配第1个节点的内存空间,同时,返回

                            成功分配后的内存空间地址给head,所以,

                            head指向第1个节点

          head->Number = 1;

          p1 = head;     //让p1指向第一个节点

    

          p1->next = ( struct ST * ) malloc( len ); //分配第2个节点的内存空间,

                             并让第1个节点的next成员指向第2个节点

          p1 = p1->next;    //让p1指向第二个节点         

          p1->Number = 2;

 

          p->next = ( struct ST * ) malloc( len ); //分配第3个节点的内存空间

                            并让第2个节点的next成员指向第3个节点

          p1 = p1->next;    //让p1指向第三个节点 

          p1->Number = 3;

          p1->next = NULL;  //向next成员赋值为NULL,表示后面没有节点了。

 

          //---------------------------------------------//

          //以下代码是本次要学习与分析的代码//

          //---------------------------------------------//

           

          //目前链表中有3个节点,假如,现在我们要删除第1个节点

          //首先,我们要将p1重新指向第1个节点,而目前p1是指向第3个节点。

 

           p1 = head; //通过head对p1赋值,就可以让p1指向第1个节点,

                  因为,head当前是指向第1个节点。

 

           head = head->next; //让head指向第二个节点,因为,准备要删除第1个节点,

                      所以,删除后,第二个节点就变为链表中的第1个节点。

                      并让head指向。

 

           free(p1); //删除第1个节点,即通过free释放p1所指向的节点内存空间。

 

 

          //--------------------------------------------------//

          //假设上面删除第一个节点的代码没有执行//

          //---------------------------------------------------//

          //假设上面删除第一个节点的代码没有执行,所以,链表中仍然有3个节点,同时,

           假设head与p1都是指向第1个节点,接下来,我们要删除链表中第2个节点

 

           p1 = p1->next;//让p1指向第2个节点,因为,目前假设了p1指向第1个节点,

                   所以,p1->next就是第2个节点的地址,所以,将p1->next

                   赋值给p1,就是将p1指向第2个节点。

 

           head->next = p1->next;//将第1个节点的next成员指向第3个节点,这样,就可以

                        在删除第2个节点后,保证链表不会断开。

                       同时,由于上一行代码,已经让p1指向第2个节点,

                       所以,p1->next就是指向第3个节点的内存地址,

                       然后,将它赋值给head->next,就是让第1个节点指向

                       第3个节点。

 

           free(p1);  //删除第2个节点,即通过free释放p1所指向的节点内存空间。

 

           //----------------------------------------------------------------------------------------------//

           //接下来,假设我们要删除最后一个节点,同时,当前的链表中只有两个节点,

            因为,刚才删除了第2个节点,另外,当前的head仍然指向第一个节点。

           //-----------------------------------------------------------------------------------------------//

 

            p1 = head->next; //让p1指向链表中第二个节点,即最后一个节点。

            head->next = NULL; //表示第1个节点后没有节点了。

            free(p1);  //删除最后一个节点,即通过free释放p1所指向的节点内存空间。

         

        }   

 

 

  小结:

    (1)在对链表操作时,定义两个结构体指针变量,head与p1,而head用于指向链表的第1个

       节点,而p1,就是当前节点,就是可以移动的,用于指向链表中的任意节点,这样,当要

       进行删除操作时就可以找到p1所指向的节点来删除,而当需要找到链表中第1个节点时,就

       可以找head,因为,head一直都是指向第1个节点。

    (2)在某个节点需要删除时,先将它的前一个节点找出来,并让前一个节点指向将要删除节点的

       后一个节点,以保证节点删除后,链表不会出现断开的情况。

    

 

 

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

 

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

 

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

进入游戏学习与训练