这是我之前提出的问题的后续。我仍在学习指针的方法,并且发现在迭代数据结构时很难维护对结构的物理地址的引用。例如,我有一个简单的准系统链表,我想通过搜索指针从中删除:
struct Node{
int value;
struct Node* next;
};
struct Node* createNode(int value){
struct Node* newNode = malloc(sizeof *newNode);
newNode->value = value;
newNode->next = NULL;
return newNode;
}
void nodeDelete(Node **killptr){
free(*killptr);
*killptr = NULL;
}
int main(){
struct Node* head = createNode(16);
head->next = createNode(25);
head->next->next = createNode(51);
head->next->next->next = createNode(5);
// Working code to delete a specific node with direct reference address
struct Node** killptr = &head->next;
nodeDelete(killptr);
return 0;
}
nodeDelete
上面显示了通过将指针传递给头指针的地址来进行删除。我想要做的是能够移动我的指针->next
,直到它找到满足删除条件的东西,然后调用nodeDelete
它。我尝试了以下方法:
struct Node* searchAndDestroy = head;
while(searchAndDestroy->value != NULL){ // Search until the end of the structure
if (searchAndDestroy->value == 25){ // If the value == 25
nodeDelete(&searchAndDestroy); // Delete the node (FAILS: Nullifies the
// address of search variable, not the
break; // original node)
}else{
searchAndDestroy = searchAndDestroy->next;
}
}
我也尝试过类似的东西:
if (searchAndDestroy->value == 25){
struct Node** killptr = (Node**)searchAndDestroy);
nodeDelete(killptr); // Still fails
}
我需要能够将我的指针移动到 ->next 点,但还要保持对我要删除的节点地址的引用(而不是对搜索节点本身地址的引用)。
编辑:一些澄清:我意识到以这种方式从链表中删除是幼稚的,泄漏内存,并且不正确地删除了一半的列表。关键不是要从链表中实际删除。最终的想法是使用它递归地删除二叉搜索树的叶子。我只是认为在问题中描述一个链接列表会更短作为一个例子。