试图描绘“doIt”函数中发生的事情(它在下面完成)我发现自己在进行比较时有一个具体的疑问。
疑点:在得到最后一个节点并将其分配给辅助指针之后。我看到以下比较:
if(aux == lista)
一:比较 aux -> info 和 list -> info?我为什么要比较?
另一方面,之后
aux = obtenerUltimo(lista);
图表会像这样吗?
作为附加注释,“getLast”返回列表中的最后一个节点。节点的结构是:
struct Nodo
{
int info;
Nodo *sgte;
};
完整功能:
int doIt(Nodo *&lista)
{
int elemento;
Nodo *aux; Nodo *aux2;
if(lista)
{
aux = obtenerUltimo(lista);
if(aux == lista) // Duda
{
elemento = lista -> info;
delete lista;
lista = NULL;
return elemento;
}
else
{
aux2 = lista;
while(aux2->sgte != aux)
aux2 = aux2->sgte;
elemento = aux -> info;
delete aux;
aux -> sgte = NULL;
return elemento;
}
}
else
{
cout << "Error: vacia" << endl;
return 0;
}
}
没有。
aux
和是什么类型lista
:lista
是对指向Nodo
(Nodo *&lista
) 的指针的引用。aux
是指向Nodo
(Nodo *aux
) 的指针。出于所有实际目的,引用的行为与其引用的类型相同,因此您
aux == lista
正在比较两个指针,这只不过是比较它们包含的内存地址,而不是它们指向的内容。换句话说,如果两者都存储相同的内存地址,则表达式
aux == lista
将为真。aux
lista
你会知道,这是你的代码。当我读到它时,我觉得它没有多大意义,至少它对开发它的你来说应该是有意义的。
假设它
obtenerUltimo
按照您所说的那样做:是的。但是让我们看看接下来会发生什么,首先假设aux
并lista
指向相同的Nodo
:在您的代码中,您保存
elemento
到一个变量以便稍后返回,删除Nodo
指向的变量lista
,使其指向NULL
并返回elemento
;在这些步骤之后,您的记忆将与此类似:正如你所看到的,倒数第二个
Nodo
仍然指向Nodo
删除,我认为这将是一个问题,因为Nodo
没有被告知其追随者已不复存在。当
aux
和lista
不指向同一个Nodo
时,您将另一个辅助指针(aux2
)提前到之前的节点aux
,然后保存elemento
到一个变量以稍后返回,删除Nodo
指向的那个aux
,(删除后!)它的下一个指向NULL
y 的指针返回elemento
. 此代码将在运行时在aux -> sgte = NULL;
. 但是假设它没有失败,从您的初始图表开始,在这些步骤之后,您的记忆将类似于:不仅访问已擦除内存 (
delete aux; aux -> sgte = NULL;
) 是错误的,而且它指向的节点aux2
还没有被告知其下一个节点已不存在。