单链表中可以指定删除其中的一个链表结点,如下图所示是一个链表
如果删除其中的3号结点,该如何操作?简单来说,分为以下几个步骤
(1)找到3号结点
(2)将2号和4号结点链接。
(3)释放3号结点
具体如何来进行操作
(1)如何找到3号结点
通过上述的图示,3号结点的地址存储在2号结点的指针域中,因此在输入删除结点的序号时,需要先找到删除结点的前一个结点。如删除3号结点,则先找到2号结点。
(2)如何将2号和4号结点链接
2号结点的指针域原本存储的是3号结点的地址,删除3号结点,2号结点需要存储4号结点的地址。4号结点的地址存储在3号结点的指针域中,因此将3号结点的指针域赋值给2号结点的指针域,就可以将2号和4号结点链接起来。
(3)如何释放3号结点
C语言中采用free()函数释放内存,但需要注意,应先将3号结点的地址存储在临时变量中,再使用free()函数释放。
上述说明删除结点的过程,如下是代码实现。
下面来分析具体的代码
(1)函数声明
StatusListDelete(LinkListL,inti)
函数类型:函数类型为Status,Status是通过typedef定义的int的别名,其实可以定义为int类型,或者bool类型
函数参数:LinkListL为所传入的链表,inti是需要删除的结点序号。
(2)定义了两个变量p和q,其中p变量初始化指向头结点,接着循环过程中指向要删除的结点,q变量临时存储删除结点的地址。
(3)while循环中的循环条件(p-next)(ji-1)。p-next等价于p-next!=NULL;ji-1中i是要删除结点的序号,i-1即为前一个结点,如删除3号结点,需要将指针移动到2号结点。
while循环中p=p-next的作用是将指针p移动至删除的结点
(4)if语句
if(!(p-next)
(ji-1))returnERROR;
在将指针p移动到删除结点过程中,可能存在空表,删除结点序号非法这样的情况,需要使用if语句返回ERROR。
(4)删除结点的操作
q=p-next;p-next=q-next;
假设删除的是3号结点,指针p已指向了前一个结点,即2号结点。此时删除结点的操作
q=p-next
p-next的地址为3号结点的地址,将其赋值给临时变量q
p-next=q-next
q-next相当于p-next-next,p-next的地址为3号结点的地址,p-next-next为4号结点的地址,将其赋值给p-next,相当于把2号和4号结点链接起来。
(5)释放删除的结点,free(q)。