|
10鱼币
#include "SingleLinkedList.h"
#define null NULL
void recursionDelete_3(LNode &l, int x){
SNode *p;
if(l==null)
return ;
if(l->data==x){
p=l;
l=l->next;
free(p);
recursionDelete_3(l,x);
}
else
recursionDelete_3(l->next,x);
}
int main(){
LNode l;
initLNode(l);
insertNode_rear(l,1);
insertNode_rear(l,5);
insertNode_rear(l,4);
showLNode(l);
//recursionDelete(&l,5);
recursionDelete_2(l,5);
//recursionDelete_3(l,5);
showLNode(l);
}
下面是相关头文件
#include <stdio.h>
#include <stdlib.h>
typedef struct SNode {
int data;
struct SNode *next;
} SNode, *LNode;
void initLNode(LNode &l) {
l = NULL;
}
SNode *searchPriorNode(LNode l, int i) {
if (l == NULL)
return NULL;
int index = 1;
while (l != NULL && index < i) {
l = l->next;
}
return l;
}
void insertNode_rear(LNode &l, int x) {
SNode *node = (SNode *) malloc(sizeof(SNode));
node->data = x;
node->next = NULL;
if (l == NULL) {
l = node;
} else {
SNode *t = l;
while (t->next != NULL) {
t = t->next;
}
t->next = node;
}
}
void showNode(SNode *node) {
if (node == NULL)
return;
printf("value: %-3d nextAddress :%p\n", node->data, node->next);
}
void showLNode(LNode l) {
if (l == NULL)
return;
while (l != NULL) {
showNode(l);
l = l->next;
}
printf("\n");
}
为什么在运行结束后,free了数据域为5那个结点,链表中的结点没有断,好像自动连接上了???
这是因为在递归删除结点时,当要删除的结点不是链表头结点时,递归函数会一直执行到找到要删除的结点,然后将该结点删除,并将该结点前一个结点的next指针指向该结点的下一个结点,从而达到删除该结点的效果。
而在递归函数返回上一层时,由于该结点已经被删除,所以上一层递归函数中的该结点的next指针指向的是该结点的下一个结点,因此链表仍然是连续的。
这也是链表的一个特点,即删除结点时只需要改变前一个结点的next指针即可。
|
最佳答案
查看完整内容
这是因为在递归删除结点时,当要删除的结点不是链表头结点时,递归函数会一直执行到找到要删除的结点,然后将该结点删除,并将该结点前一个结点的next指针指向该结点的下一个结点,从而达到删除该结点的效果。
而在递归函数返回上一层时,由于该结点已经被删除,所以上一层递归函数中的该结点的next指针指向的是该结点的下一个结点,因此链表仍然是连续的。
这也是链表的一个特点,即删除结点时只需要改变前一个结点的next指针即 ...
|