- 这是使用递归(使用引用)进行删除节点的内存变化
void Del_x(LinkList &L, int x) {//引用
if (L == NULL) {//空结点
return;
}
LNode *p;
if (L->element == x) {
p = L;
printf("address of L:%p\n", &L);
printf("value of L->next:%p\n", L->next);
L = L->next; //L相当于L的前一个节点.next
delete p;
Del_x(L, x);
}
else {
Del_x(L->next, x);
}
}
可以看到这里,L=L->next 可以理解为将L的next的值(下个节点的地址)赋值到L地址上(这里L的地址也就是L1->next的地址)。
因为上层函数调用的是(L1->next,x),因为是引用的关系,直接L看成是L1->next就行了,那么就是L1->next=L->next,和正常的一样了
- 这是不使用递归正常的删除结点的方法
LNode *p = start->next;
LNode *q = p->next;
printf("address of p->next:%p\n", &(p->next));
printf("value of q:%p\n", q->next);
p->next = q->next;
delete q;
- 这是使用递归方法的中删除节点方式,但是非递归
p = start->next;
printf("address of p:%p\n", &p);
printf("value of p:%p\n", p->next);
p = p->next;
这里并非引用,这样做的结果只会导致,原本q地址上存放的是第二个节点的地址(start—>next)变成了第三个节点的地址(p->next)
总的来说是因为对引用的使用不够精确的了解
参考:引用的使用