用C ++理解链表?

时间:2016-03-09 05:17:30

标签: 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 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; 
    }
}

我想我不知道是什么 - &gt;运营商做的确切。我知道它与指针有关,我不确定for循环是如何工作的。

如果有人可以带我通过代码,或者他们可能有一个更好的例子来告诉我,如果还有更多信息我应该知道,请告诉我。我们将不胜感激。

1 个答案:

答案 0 :(得分:3)

我认为代码稍微不正确(或者可能只是糟糕的样式,因为它依赖于初始化后指针为NULL的事实),但我将尝试详细解释这一点。

首先,->运算符会计算为取消引用,后跟点.,因此root->num等同于(*root).num

链接列表(在您的情况下是单链表)是一个如下结构

NODE{1} --> NODE{3} --> NULL

这里的节点是一个struct对象,并且有一个指向另一个对象的指针。这些对象一起构成链表。如您所见,您需要某种指向指向链表中第一个元素的指针。在上面的示例中,该元素将是存储在其中的1的节点。这是您上面的代码中的根指针。

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

  1. http://www.cplusplus.com/doc/tutorial/dynamic/
  2. http://gribblelab.org/CBootcamp/7_Memory_Stack_vs_Heap.html
  3. http://www.tutorialspoint.com/cplusplus/cpp_dynamic_memory.htm
  4. 您还需要知道链接列表中的停止位置,即您需要知道哪个元素是最后一个元素。在上面的情况中,最后一个元素是其中包含3的节点。因此,此节点不会指向另一个Node对象,而是指向{C} 11和C ++ 14中的NULL0或首选nullptr也是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;
    }
    

    这有意义吗?