![]() |
#2
牧人马2020-07-07 02:01
回复 楼主 牧人马
|
题目是设计一个通过递归调用,实现删除不带头结点的单链表L中所有值为X的结点
假设输入1 2 3 1 4 5,删除“1”的结点,那么采用头插法生成的链表为5 4 1 3 2 1,首先要删除序号为3的“1”结点
我认为为此应该执行之前所学的4步操作:
(1)找到“1”的前驱结点“4”,赋值给结点s
(2)令结点p指向s的后继结点,也就是“1”
(3)令s指向p的后继结点,也就是“3”
(4)释放p的空间
可是题目答案的操作只有(1)(2)(4),并且在书上有专门解释是“有读者认为直接去掉p结点会造成断链,实际上因为L为引用,是直接对原链表进行操作,因此不会断链”
我并不能完全理解为什么不会发生断链,所以发帖询问
答案所示即为delectX函数内容,问题代码在delectX()中的注释部分

#include <iostream>
using namespace std;
typedef struct LNode
{
int data;
struct LNode* next;
}LNode,*LinkList;
LinkList createList()
{
int x;
LinkList l = (LinkList)malloc(sizeof(LNode)); //head
LNode* s;
l->next = NULL;
cin >> x;
do
{
s = (LNode*)malloc(sizeof(LNode));
s->data = x;
s->next = l->next;
l->next = s;
cout << "add new data " << s->data << endl;
cin >> x;
} while (x > 0);
return l;
}
void dis(LinkList l)
{
l = l->next;
while (l != NULL)
{
cout << l->data << " ";
l = l->next;
}
cout << endl;
}
void delectX(LinkList &l, int x) //使用递归
{
//cout << "delect" << endl;
LNode* s;
if (l == NULL) return;
if (l->data == x) {
s = l;
l = l->next; //5 4 1 3 2 1 ,删除第一个1后,4与3之间没有链接了应该会断链啊?
free(s);
delectX(l, x);
}
else
delectX(l->next, x);
}
int main()
{
LinkList l=createList();
dis(l);
delectX(l, 1);
dis(l);
return 0;
}
[此贴子已经被作者于2020-7-7 02:02编辑过]