一 图说C语言 | 用C语言实现一个简单的通讯录( 四 )


我们想要删除节点A很简单,让头指针指向节点B,然后删除节点A 。不过需要注意的是,执行的顺序挺重要,因为节点B的地址保存在节点A的next成员中,如果先删除节点A就有可能造成节点B地址的丢失(除非事先保存节点B的地址),从而节点B和之后的节点C就再也找不到了;另一方面,在让头指针指向节点B之前,要保存好节点A的地址,毕竟节点A的地址原先保存在头指针那儿(现在头指针已经保存节点B的地址了),不然就无法正常释放节点A的内存空间,造成内存泄露 。
要删除节点B的话,就得先找到在它之前的节点A,通过改变节点A的next成员,让其指向节点B的下一个节点,也就是节点C即可 。同时要保存到节点B的地址,不然节点B就无法正常释放内存了 。
同理,要删除节点C的话,就得将节点B的next成员设为NULL 。同样需要注意的是要事先保存好节点C的地址,以防丢失 。
好了,知道了这些,下面就把按指定姓名删除节点的函数实现出来吧!
void del_addrbook(PADDRBOOK pNode) //参数为欲删除节点的指针
PADDRBOOK p = head; //保存第一个节点
if(head == NULL|| pNode == NULL) //判断链表或者欲删除节点是否为空
return;
elseif(head == pNode) //如果删除的是第一个节点
head = head-next; //让头指针指向第二个节点
free(p); //释放第一个节点内存空间
Else//如果删除的不是第一个节点
while(p-next) //判断是否有下一节点
if(p-next == pNode) //下一节点是否为要删除的节点
{ //如果是的话
p-next = pNode-next; //让指针p所指节点的下一节点为删除节点的下一节点
free(pNode); //释放删除节点的内存空间
break; //终止循环
【一 图说C语言 | 用C语言实现一个简单的通讯录】p = p-next; //让指针p指向下一节点
函数体中,我们首先用临时指针p保存好第一个节点地址,然后使用if语句检测链表以及要删除的节点是否为空,如果都不为空,则执行else if再次判断要删除的是否为链表中第一个节点,若是的话就让头指针指向链表第二个节点,然后通过指针p释放第一个节点的内存空间;若删除的并非是第一个节点的话,则执行else部分,大家需要注意while循环的条件,我们是通过指针p的next成员是否等于要删除的节点来进行判断,也就是检查指针p所指节点的下一节点是否为要删除的节点,如果是的话,则p所指节点就为要删除节点的前一节点,我们通过修改前一节点的next成员,将其赋值为要删除节点的下一节点地址即可 。最后,删除节点释放其内存空间并终止循环 。若指针p所指节点的下一节点不是要删除的节点,则修改指针p的值,让其指向下一节点,继续下一轮的循环 。
(九)删除所有节点 。
voiddel_all
PADDRBOOK p;
while(head)
p = head;
head = head-next;
free(p);
若懂得了如何在链表中删除指定节点的话,则对解决删除链表所有节点这件事应该是手到擒来啦 。我们从头指针所指向的节点开始,不断检查链表中的各个节点并删除释放其内存空间即可 。唯一需要注意的还是要妥善保管好相关指针,不能轻易丢掉了欲删除节点的地址或者指向下一个节点的指针 。
到这里,我们已经完成了链表操作中的增、删、查,唯一缺失的就是对链表节点的修改操作,因为这涉及到了与用户交互的操作 。关于用户交互这一块,会和标准输入流、标准输出流打交道,更会将我们的链表灵活运用到实际的操作中,其中不乏许多有意思的地方以及相关的小技巧 。由于篇幅有限,这些我就留待下期再完成 。


以上关于本文的内容,仅作参考!温馨提示:如遇专业性较强的问题(如:疾病、健康、理财等),还请咨询专业人士给予相关指导!

「辽宁龙网」www.liaoninglong.com小编还为您精选了以下内容,希望对您有所帮助: