我正在编写一个删除链表中节点的函数,其输入是指向链表的指针。如果函数删除只有一个节点的链表,则该函数将使指针指向NULL。这是代码的一部分:
void remove(dlinkNode_t *start){
//some previous code
if(start->next==NULL){//meaning we're removing the head of the linked list
dlinkNode_t current=start; //get a temp pointer to point at this node
start=NULL; //make start point to null
free(current); //free the head
return;
}
// More code
在main中,我创建了一个包含一个节点的链接列表,并传递了此链接列表以删除函数以释放它。这是代码:
int main(){
dlinkNode_t *node1=create(); //creates a node and make node1 point at it
remove(node1); //now node1 should point at NULL
if(node1==NULL)
printf("hi");
return 0;
}
但我没看到喜打印。我不知道为什么if语句没有通过。有任何想法吗?
答案 0 :(得分:3)
指针的新副本在remove
的本地范围内。您对指针所做的任何更改只会在该范围内可见。您对指针指向的值所做的任何更改都将返回到调用范围。
您可以通过以下两种方式之一解决此问题:
返回已编辑的指针
node1 = remove(node1);
并在删除中进行更改。
dlinkNode_t * remove(dlinkNode_t *start){
//some previous code
//Function code
return start;
或者您可以将指针传递给指针开始,然后操纵该指针。
函数调用:
remove(&node1);
功能定义:
void remove(dlinkNode_t **start){
//some previous code
if((*start)->next==NULL){ // meaning we're removing
// the head of the linked list
dlinkNode_t current=**start; //get a temp pointer
// to point at this node
**start=NULL; //make start point to null
free(current); //free the head