C ++从指针到指针的新指针?

时间:2011-03-29 04:46:37

标签: c++ pointers new-operator

我有一个模板linkedList,我想为...动态创建“head”指针。

我似乎无法使用任何语法..我最好的猜测是:

linkedList<int>** ptr;
ptr = new (linkedList<int>*)[1];

但它不起作用。我对C ++很新,所以任何帮助都表示赞赏!谢谢!

4 个答案:

答案 0 :(得分:3)

要获得指针,请执行:

T* ptr = new T;

其中T是您的类型 对于指针指针,请执行:

T** ptrptr = new T*;

为一个指针分配空间,仍然需要像第一个方法一样填充:

*ptrptr = new T;

现在你有了一个有效的指针指针。

答案 1 :(得分:1)

你有没有使用std :: list的原因? (或std :: forward_list)

查看std :: list或最近的C ++书籍的头文件,或者实际上 cppreference.com

您的链接列表类模板应具有返回列表头部的功能。在编译器的c ++库中查看std :: list :: begin()。 std :: list :: iterator类型是指向列表中任何内容的指针。 (即T *)

答案 2 :(得分:1)

虽然我不确定你的链接真的需要指针数组 对于just new构造,将编译以下表单。

ptr = new (linkedList<int>*[1]);

修改
这会分配指针数组:

linkedList<int>** ptr = new (linkedList<int>*[1]);

这会分配数组:

linkedList<int>* ptr = new linkedList<int>[1];

这会分配一个元素:

linkedList<int>* ptr = new linkedList<int>;

答案 3 :(得分:0)

通常,链表的头部看起来像是:

node<int> *head = NULL;

如果要创建和插入节点,可以使用以下内容:

insert(node<int> *&list, int value) { 
// insert new node containing `value` at head of `list`.

    node<int> *temp = new node(value);

    temp->next = list;
    list=temp;
}

您可以使用以下内容:

node<int> *list = NULL;

for (int i=0; i<10; i++)
    insert(list, i);

当然,除非这是家庭作业(或该订单上的某些内容),否则您应该立即停止工作,只需std::list(或boost::slist,如果您想要单链表)。

编辑:我在评论中添加了OP提到的更多细节。目前,avl_tree::insert 不会尝试保持平衡。它只是一个简单的非平衡插入,但它应足以证明我们目前关心的内容。

template <class T>
struct linked_list { 
    node *head;

    void insert(T v) {
        node<T> *n = new node(v, head);
        head = n;
    }

    linked_list() : head(NULL) {}

    template <class T>
    struct node { 
        node *next;
        T data;

        node(T const &v, node *n=NULL) : data(v), next(n) {}
    };
};

template <class keyType, class dataType>
class avl_tree { 
    struct node {
        node *left, *right;
        char balance;
        keyType key;
        dataType data;

        node(keyType const &k, dataType const &d) 
            : left(NULL), right(NULL), balance(0), key(k), data(d)
        { }

        bool operator<(node const &other) { 
            return key < other.key;
        }
    } *root;

    bool insert(node const *new_node, node *&tree) { 
        if (tree == NULL) {
            tree = new_node;
            return true;
        }
        else if (*new_node < *tree)
            return insert(new_node, tree->left);
        else if (*new_node > *tree)
            return insert(new_node, tree->right);
        else // new_node == tree
            return false; // couldn't insert -- already present.
    }

public:

    avl_tree() : root(NULL) {}

    void insert(keyType const &key, dataType const &data) { 
        node *temp = new node(key, data);
        insert(temp, root);
    }
};