C解析之十链表进阶
前言:最直观的图解,解链表最迷惑之点。下面将介绍链表的核心操作:插入,删除,查询,掌握这些操作,链表便可在你的程序中大放光彩啦。
1.链表的插入:将新的节点插入到链表指定的位置。
如下图:
等待插入的新节点(p),插入链表两个节点之间(左边为p1,右边为p2),完成这一操作需要两步:1.将p1的指针指向等待插入的节点;2将等待插入节点的指针指向p2。(如图)。
上图数字1,2分别指示了这两个操作步骤。插入节点的关键代码:
p1->next = p;
p->next = p2;
2.链表的删除: 将一个节点从链表删除。
如下图:
删除节点操作是上一步插入节点的逆操作。删除节点P,只需要把P1的指针指向P2,P便不在属于链表了。(如图)。
上图的数字1指示了删除所需的一步操作。有同学可能觉得,P的指针还指向P2呢,这丝毫不能改变P已经被链表删除了的事实。链表删除操作的核心代码:
P1->next=P->next; //P-next指向的是P2
或者 :P1->next=P2;
3.链表的查询:遍历链表查找满足特定要求的节点。
链表的查询,需要遍历每一个节点,那么在遍历的过程中同样可以输出链表,遍历的最后可以找到链表的末尾(此处同时解释【C解析之九】链表初探中最后读者可能存在疑问的链表输出与找到链表的末尾)。
如下图:
链表习惯上表头Head不存储数据,Head之后的节点才真正是存有数据的节点,不管是查询时的比较,还是遍历时的输出都是操作链表节点内的数据。我们定义一个指针,通过指针的偏移(依次指向每个节点)来访问所有的节点。
依次分析:
数字1: 将指针指向第一个链表节点,代码:P=Head->next;
数字2: 指针指向下一个链表节点, 代码:P=P->next;
数字3: 指针继续指向下一个节点, 代码:P=P->next;
......
最后的结果:P-next=NULL,此时P指向的加点便是末尾的节点,这可以成为控制while循环的条件之一。
继续扩展上一篇的例子:这个例子是初学者进一步学习C的良好例子,有兴趣的同学可以试试。掌握这个例子,C语言可以说已经初步入门了。同时,这个例子对链表操作而言,可谓五脏俱全,借助上面的图解仔细阅读,理解其中的关系。笔者认为,链表的操作,能极好地锻炼逻辑思维,同时考验开发者的细致程度。为便初学者,笔者决定不再增加更多的干扰,次程序就不做模块化处理了。
【C解析之十】链表进阶,布布扣,bubuko.com
【C解析之十】链表进阶
原文:http://blog.csdn.net/lovecodeless/article/details/22063591