zoukankan      html  css  js  c++  java
  • 为什么感觉明明把两个链表链接起来了,但是实际上没有

    将*L2链表插入到*L1链表尾部(*L1, *L2均为不含头结点的链表)
     1 /*将*L2链表插入到*L1链表尾部(*L1, *L2均为不含头结点的链表)*/
     2 void attach(List *L1, List *L2)
     3 {
     4     List p;
     5 
     6     /*寻找L1链表的尾节点的next指针*/
     7     for (p = *L1; p; p = p->next);        //当指针p不为空时,p不断后移
     8 
     9     /*退出循环代表p为空,即p和尾节点的next指针同指向*/
    10     p = *L2;        //修改p,使p指向L2链表
    11 
    12 
    13 }

    上面这个函数看似把L1的尾部链接了L2的头部,但是实际上并没有。因为用于链接的指针p并不属于L1,只是一个和L1尾节点的next同指向的指针,

    是尾节点的next指针的拷贝,所以修改它的值并不会对L1有任何影响,所以当然没有将两个链表链接在一起。

    正确的做法是:将p->next作为for()循环的判断条件,最终退出循环时p->next为空,修改p->next的指向,p->next = *L2;

           这样就能将两个链表成功链接在一起了,因为虽然p指针依然只是L1链表的尾节点指针的一个拷贝,p依然不属于L1链表,

           但是p->next却是属于链表的,所以修改p->next的指向就能真正对L1链表产生影响,从而真正将L2连接到L1的尾部。

    函数代码修正如下:

     1 /*将*L2链表插入到*L1链表尾部(*L1, *L2均为不含头结点的链表)*/
     2 void attach(List *L1, List *L2)
     3 {
     4     List p;
     5 
     6     /*寻找L1链表的尾节点的next指针*/
     7     for (p = *L1; p->next; p = p->next);        //当指针p->next不为空时,p不断后移
     8 
     9     /*退出循环代表p为空,即p和尾节点的next指针同指向*/
    10     p->next = *L2;        //修改p,使p->next指向L2链表
    11 
    12 }
  • 相关阅读:
    数据库 封装类CppSQLite3的helloword VC6
    数据库 sqlite 进阶
    数据库 sqlite3_get_table,sqlite3_free_table
    数据库 sqlite3_open,sqlite3_exec,slite3_close
    数据库 SQLite C++ 接口
    数据库 如何在VC6下使用sqlite3
    MFC CButtonST使用技巧(一)(二)(三)
    MFC CButtonST简介
    MFC CButtonST 在你的程序中如何使用CButtonST类
    MFC静态分割后锁定分隔条/限制分隔条的移动范围 方法1
  • 原文地址:https://www.cnblogs.com/hi3254014978/p/10107015.html
Copyright © 2011-2022 走看看