2011-10-26 20 views
1

在下面的代码:什么是Node *&aNode?

void insert(Node *& aNode, int x) { 
    if (!aNode) { 
    aNode = new Node(x); 
    aNode->next = aNode; 
    return; 
    } 

    Node *p = aNode; 
    Node *prev = NULL; 
    do { 
    prev = p; 
    p = p->next; 
    if (x <= p->data && x >= prev->data) break; // For case 1) 
    if ((prev->data > p->data) && (x < p->data || x > prev->data)) break; // For case 2) 
    } while (p != aNode); // when back to starting point, then stop. For case 3) 

    Node *newNode = new Node(x); 
    newNode->next = p; 
    prev->next = newNode; 
} 

什么是节点* &阳极?

我应该如何使用这个函数,我的意思是,我应该传递哪种类型的参数?

+3

我不认为这是有效的C.你应该重新编程为C++。 –

+0

@ denniston.t谢谢。 Yeas –

+1

循环排序列表?这甚至有可能吗? – Dani

回答

10

我觉得这个代码是C++,不C和Node *&aNode是一个指针引用到Node,所以你会传递一个Node*的功能,和功能将使该参考(所以内存位置的Node*指向可以改变)。

您可能会感兴趣the Wikipedia article on References (C++)

一个简单的例子:

#include <iostream> 
void addOneToValue(int num) { 
    ++num; 
} 

void addOneToRef(int &num) { 
    ++num; 
} 

int main() { 
    int num = 0; 

    // print 0 
    std::cout << num << std::endl; 

    // print 0 again (addOneToValue() has no effect) 
    addOneToValue(num); 
    std::cout << num << std::endl; 

    // print 1 (addOneToRef() changes the value of num) 
    addOneToRef(num); 
    std::cout << num << std::endl; 
} 

@ crashmstr的评论提醒我,我应该说,他们是如何从不同的指针。 Wikipedia does a better job that I could though

  • 在定义它之后不可能直接引用引用对象;其名称的任何出现都直接指向它所引用的对象。
  • 一旦创建了一个引用,就不能再引用另一个对象;它不能被重新安装。这通常是用指针完成的。
  • 引用不能为空,而指针可以;每个引用都指向某个对象,尽管它可能有效也可能不会有效。
  • 引用不能被初始化。由于不可能重新初始化引用,因此必须在创建引用后立即对其进行初始化。特别是,必须在定义它们的地方初始化本地和全局变量,并且作为类实例数据成员的引用必须在类的构造函数的初始化程序列表中初始化。
  • 大多数编译器都会支持空引用,没有太多抱怨,只有在尝试以某种方式使用引用时才会崩溃。
+2

在C中,你需要有'Node ** aNode'(指向指针的指针),并且在整个代码中会有更多*和&扩散。在C++ – crashmstr

+0

谢谢你参考一个指针可能不太容易出错。 @crashmstr –

+0

谢谢@Brendan长,清楚的解释。 –

相关问题