答案:(1)p->next!=NULL (2)p->next=q->next
单链表中可以指定删除其中的一个链表结点,如下图所示是一个链表
如果删除其中的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) 函数声明
Status ListDelete(LinkList &L, int i)
函数类型:函数类型为Status,Status是通过typedef定义的int的别名,其实可以定义为int类型,或者bool类型
函数参数:LinkList &L为所传入的链表,int i是需要删除的结点序号。
(2) 定义了两个变量p和q,其中p变量初始化指向头结点,接着循环过程中指向要删除的结点,q变量临时存储删除结点的地址。
(3) while循环中的循环条件(p->next) && (j<i-1)。p->next等价于p->next != NULL;j<i-1中i是要删除结点的序号,i-1即为前一个结点,如删除3号结点,需要将指针移动到2号结点。
while循环中p = p->next的作用是将指针p移动至删除的结点
(4)if语句
if(!(p->next) || (j>i-1)) return ERROR;
在将指针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)。
登录后提交答案