C++ 用C+理解链表+;?

C++ 用C+理解链表+;?,c++,data-structures,linked-list,C++,Data Structures,Linked List,我认为链表是一种通过某种数组/列表/向量进行导航的方法。我想我还不完全了解这个概念。我看到一些图表解释了它们,但我似乎不明白它们是如何工作的。所以我想看看代码可能会有所帮助。(我的教授并没有认真研究代码) 我从一些视频中复制了这段代码 #include<iostream> using namespace std; struct node { int num; node *link; }*p; // i'm not sure how this pointer was

我认为链表是一种通过某种数组/列表/向量进行导航的方法。我想我还不完全了解这个概念。我看到一些图表解释了它们,但我似乎不明白它们是如何工作的。所以我想看看代码可能会有所帮助。(我的教授并没有认真研究代码)

我从一些视频中复制了这段代码

#include<iostream>
using namespace std;

struct node
{
    int num;
    node *link;
}*p; // i'm not sure how this pointer was declared  

void main()
{
    node *root;

    root = new node;
    root -> num = 5;
    root -> link = p;
    p = root;

    node *q;
    for (q = p; q != NULL; q = q -> link) 
    {
        cout << q -> num << endl; 
    }
}
#包括
使用名称空间std;
结构节点
{
int-num;
节点*链接;
}*p、 //我不确定这个指针是如何声明的
void main()
{
节点*根;
根=新节点;
根->数=5;
根->链接=p;
p=根;
节点*q;
对于(q=p;q!=NULL;q=q->link)
{

cout num我认为代码有点不正确(或者可能只是风格不好,因为它依赖于初始化后指针为
NULL
),但我将尝试详细解释这一点

首先,
->
运算符的计算结果是一个解引用,后跟一个点
,因此
根->num
相当于
(*root).num

链表(在您的例子中是单链表)的结构如下

NODE{1} --> NODE{3} --> NULL
这里,节点是一个结构对象,有一个指向另一个对象的指针。这些对象一起构成链表。正如您所看到的,您需要某种类型的指针来指向链表中的第一个元素。在上面的示例中,该元素将是存储有1的节点。这是代码中的根指针上面

new
是一种分配。您需要将链表中的对象放在内存中的某个位置,新操作符可以帮助您找到内存中的某个位置(特别是在您可以存储对象。然后它返回指向此位置的指针。了解堆的更多信息的最佳方法是在线研究此内容。这是一个介绍性概念(在实现级别有很多“上层”概念,但您目前不必担心)这在网上解释得很好。这可能比阅读我的解释要好,所以我不会在这里解释更多关于堆和堆栈的内容。不过,我认为以下链接应该会有所帮助

  • 您还需要知道在链表中的何处停止,即,您需要知道哪个元素是最后一个元素。在上面的情况下,最后一个元素是包含3的节点。因此,此节点将不会指向另一个
    节点
    对象,而是指向
    NULL
    0
    或C中首选的
    nullptr
    ++11和C++14(很快也将是C++17)。因此,您可以使用以下代码构建上面的链表

    #include <iostream>
    using std::cout;
    using std::endl;
    
    struct Node {
        int element;
        Node* next;
    };
    
    int main() {
        Node* root = new Node;
        root->element = 1;
        root->next = new Node;
        root->next->element = 3;
        root->next->next = NULL;
    
        for (auto i = root; i != NULL; i = i->next) {
            cout << i->element << endl;
        }
    
        return 0;
    }
    
    #包括
    使用std::cout;
    使用std::endl;
    结构节点{
    int元素;
    节点*下一步;
    };
    int main(){
    Node*root=新节点;
    根->元素=1;
    root->next=新节点;
    根->下一步->元素=3;
    root->next->next=NULL;
    for(自动i=root;i!=NULL;i=i->next){
    
    cout element a->b相当于(*a)。b掌握链表中发生的事情的最好方法是画一个。这是一个非常好的答案。删除我的和你的一样好。这非常有用,但现在我想起了我们讨论过的一件事。就像搜索链表的其他方法一样。