理解C ++中的链接列表

时间:2015-03-06 19:12:11

标签: c++ linked-list

我试图理解链表的概念。到目前为止,这就是我所知道的以及我遇到问题的地方。

//create node
struct list
{
int id; //member var
list* next; //pointer to link next list item
}

//int main()

//create list head and set it to NULL
list* head = NULL;

//instantiate list node
list* newList = new list;

//insert a list
newList->id = 20;
newList->next = NULL;

我真的不明白发生了什么。

newList->next = head;
head = newList;

2 个答案:

答案 0 :(得分:6)

注意:我将在本答案中引用的内存“位置”纯粹是为了模仿这些指针可能或可能不会指向的实际位置。

在纸上绘制这些关系以显示结果。让我们按行分解。

list *head = NULL;

这是我们的可视化:

 *head (0x00)
+-----------+
|           |
|   NULL    |
|           |
+-----------+

现在,我们按照下一行:

list *newList = new list;
newList->id = 20;
newList->next = NULL;

那可视化:

 *head (0x00)      *newList (0x3a)
+-----------+     +----+------+
|           |     | id | next |
|   NULL    |     +----+------+
|           |     | 20 | NULL |
+-----------+     +----+------+

最后我们以你的最后一点结束:

newList->next = head;

这样就可以改变可视化(为了清晰起见重新排序):

 *newList (0x3a) +->*head (0x00)
+----+------+    | +-----------+
| id | next |    | |           |
+----+------+    | |   NULL    |
| 20 | head------+ |           |
+----+------+      +-----------+

这创建了一个“链接”,它给了一个LinkedList它的名字。您可以通过某种形式的引用将节点链接在一起。所以你所做的就是创建一个“头”或列表的开头,然后你在列表中创建了一个辅助节点并将其(逻辑上)放在head之前。通常,您会将对newList的引用重新分配给head,因为它是列表的新开头。

下一步可能是(而且我确定你对这个问题末尾我提出的错误信息的意思):

head = newList;

现在将可视化更改为:

 *head (0x3a)  +---> (0x00)
+----+------+  |   +-----------+
| id | next |  |   |           |
+----+------+  |   |   NULL    |
| 20 | 0x00----+   |           |
+----+------+      +-----------+

另外,以下几行怎么办?

head = n; // What is 'n'? Where did you get it from? It doesn't appear anywhere else in your sample

修改

我更改了可视化,以更准确地反映实际情况。当我发布原始答案时,我没有注意到我正在做的事情,感谢José和他的评论引起我的注意,可视化是不准确的。

除了改变视觉效果外,我还添加了更多信息,并希望进一步说明如何使用此链接列表循环显示它。

list *node = head;
while (node != NULL) {
    std::cout << "The id is " << node->id << std::endl;
    node = node->next;
}

答案 1 :(得分:1)

newList->next = head;
head = newList;

首先将head设置为NULL 然后,创建一个新节点,让它的下一个指向head,即NULL 然后,将head设置为新节点。现在,head指向一个包含一个项目的列表。