Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/152.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 嵌套结构和指针_C++_Pointers_Struct - Fatal编程技术网

C++ 嵌套结构和指针

C++ 嵌套结构和指针,c++,pointers,struct,C++,Pointers,Struct,我正在学习嵌套结构,遇到了以下代码: // Stack.h #ifndef STACK_H #define STACK_H struct Stack{ struct Link{ void* data; Link* next; void initialize(void* dat, Link* nxt); }* head; void initialize(); void push(void* dat); vo

我正在学习嵌套结构,遇到了以下代码:

// Stack.h

#ifndef STACK_H
#define STACK_H

struct Stack{
    struct Link{
        void* data;
        Link* next;
        void initialize(void* dat, Link* nxt);
    }* head;
    void initialize();
    void push(void* dat);
    void* peek();
    void* pop();
    void cleanup();
};

#endif // STACK_H
链接结构在Stack的范围内,要访问链接,我必须使用Stack::Link

我对在}之后声明的指针头有点困惑,以关闭链接结构

这是否意味着堆栈范围内有一个名为head的链接指针变量

将头部指针定义为以下内容的效果是什么:

};
Link* head;
vs


没有区别。这两个声明都会导致类型为
Stack::Link*
Stack::head
成员

这是否意味着在
堆栈
范围内有一个名为head的
链接
指针变量

是的,完全正确


至于你的第二个问题,这两种类型的声明在语义上没有区别。

这只是语义的简写。就像我们如何使用
+=
。 是的,你有一个局部指针变量

struct Stack{
    struct Link{
        void* data;
        Link* next;
        void initialize(void* dat, Link* nxt);
    };

    Link* head;  //Same as code as in your program
    void initialize();
    void push(void* dat);
    void* peek();
    void* pop();
    void cleanup();
};

旁注:您真的想使用链表来实现堆栈吗?我只是在学习C++,这就是我在数据结构和算法中使用过的内容。class@H2CO3您建议如何实现堆栈?首先,
std::vector
可以用作堆栈,因此实际上不需要实现。但是,如果您想这样做,可以使用数组或封装的
std::vector
。由于您将仅从末尾插入和删除,因此对于数组和向量,这是
O(1)
。相反,遍历链接列表然后从末尾删除是
O(n)
(除非您足够聪明,可以插入到头部,即向后使用列表)。此外,数组和向量使用一个连续的内存块,因此它们更紧凑,并且它们还可以防止%遍历指针,从而降低缓存未命中的可能性。我建议你看一下比亚恩·斯特劳斯特鲁普(Bjarne Stroustrup)在YouTube上的题为“为什么你应该避免链接列表”的演讲。
struct Stack{
    struct Link{
        void* data;
        Link* next;
        void initialize(void* dat, Link* nxt);
    };

    Link* head;  //Same as code as in your program
    void initialize();
    void push(void* dat);
    void* peek();
    void* pop();
    void cleanup();
};