为什么感觉明明把两个链表链接起来了,但是实际上没有

将*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 }

 

posted @ 2018-12-12 10:35  Lucky小黄人^_^  阅读(363)  评论(0编辑  收藏  举报