2

我想让函数返回特定节点的地址。但是编译器没有检测到我创建的节点数据类型结构。

struct node
{
int data;

node *link;
};

node *header,*current;
node traverse(int pos);


node *Linkedlist::traverse(int pos)
{
    int location = 0;  
    current->link = header->link;
    node *address = new node;
    address->data = NULL;
    address->link = NULL;


    while(current->link != NULL)
    {

        if(location == pos)
        {
            cout <<current->link->data <<" "<< endl; 
            address->link=current->link;
        }
        location ++;
        current->link = current->link->link;

    }


    return  address->link;
}
4

2 回答 2

5

改变

return  *address;

return  address;
于 2013-01-13T04:09:16.783 回答
1

由于地址是指向节点的指针变量,因此您只需返回变量即可。

*指针变量前面是显式引用,意思是获取指针变量所指向的值address。这与操作员&会做的事情是相反的,即获取变量的地址。

return  address;

因此,您应该返回变量而不是返回变量指向的值是合乎逻辑的。

请注意,调用者需要注意traverse通过调用 else 显式释放内存,delete这将导致内存泄漏。这是因为一个潜在的设计问题,您在本地范围内分配了一个堆对象并返回了地址。

node * foo = Linkedlist::traverse(n);
...............
delete foo;

您可以简单地在堆中创建对象或将其添加为类成员,在前一种情况下,您可以轻松地将对象的所有权从一个范围转移到另一个范围,而在第二种情况下,对象的生命周期会被对象控制Linkedlist

于 2013-01-13T04:19:16.640 回答