-1

我正在编写一个函数,它删除链表中的一个节点,其输入是一个指向链表的指针。如果该函数删除一个只有一个节点的链表,该函数将使指针指向 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;
}

但是我没有看到打印的hi。我不知道为什么 if 语句没有通过。有任何想法吗?

4

1 回答 1

3

指针的新副本在remove. 您对指针所做的任何更改都将仅在该范围内可见。您对指针指向的值所做的任何更改都将返回到调用范围。

您可以通过以下两种方式之一解决此问题:

  • 返回编辑后的指针

    node1 = remove(node1); 
    

    并在 remove 中进行更改。

    dlinkNode_t * remove(dlinkNode_t *start){
        //some previous code
        //Function code
        return start;
    
  • 或者,您可以将指针传递给指针 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
    
于 2013-01-27T03:08:32.563 回答