我认为链表是某种通过某种数组/列表/矢量排序导航的方式。我认为我不完全了解这个概念。我已经看到一些图表解释它们,但我似乎不明白它们是如何工作的。所以我认为实际看代码可能有所帮助。 (我的教授并没有真正重复这些代码)
我从某些视频中复制了此代码。
#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循环是如何工作的。
如果有人可以带我通过代码,或者他们可能有一个更好的例子来告诉我,如果还有更多信息我应该知道,请告诉我。我们将不胜感激。
答案 0 :(得分:3)
我认为代码稍微不正确(或者可能只是糟糕的样式,因为它依赖于初始化后指针为NULL
的事实),但我将尝试详细解释这一点。
首先,->
运算符会计算为取消引用,后跟点.
,因此root->num
等同于(*root).num
。
链接列表(在您的情况下是单链表)是一个如下结构
NODE{1} --> NODE{3} --> NULL
这里的节点是一个struct对象,并且有一个指向另一个对象的指针。这些对象一起构成链表。如您所见,您需要某种指向指向链表中第一个元素的指针。在上面的示例中,该元素将是存储在其中的1的节点。这是您上面的代码中的根指针。
new
是一个分配。您需要将链表的对象放在内存中的某个位置,新的运算符可以帮助您在内存中找到一些位置(特别是heap上的某个位置),您可以存储对象。然后它返回一个指向这个位置的指针。了解堆的更多信息的最佳方法是在线研究。这是一个介绍性概念(在实现级别上有很多“上层”概念,但您现在不必担心这一点),这在网上得到了很好的解释。这可能比阅读我的解释更好,所以我不会在这里解释有关堆和堆栈的更多信息。不过我认为以下链接应该会有所帮助
您还需要知道链接列表中的停止位置,即您需要知道哪个元素是最后一个元素。在上面的情况中,最后一个元素是其中包含3的节点。因此,此节点不会指向另一个Node
对象,而是指向{C} 11和C ++ 14中的NULL
,0
或首选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;
}
这有意义吗?