所以我一直在尝试理解链表的概念(一直在看一些示例代码,我在互联网上找到了这个。现在如果我可以请有人确认我是否正确掌握了一些概念。我会画我认为每个代码链接所做的图表。
#include <stdio.h>
#include <stdlib.h>
struct ListItem {
int data;
struct ListItem *next;
};
int main (int argc, char *argv[]){
struct ListItem a;
a.data = 0;
a.next = NULL;
struct ListItem b;
b.data = 1;
b.next = NULL;
struct ListItem c;
c.data = 2;
c.next = NULL;
a.next = &b;
b.next = &c;
int counter = 0;
struct ListItem *i;
for (i = &a; i != NULL; i = i->next){
printf("Item %d value is %d\n\r", counter, i->data);
counter++;
}
return 0;
}
代码 1 的片段:
struct ListItem {
int data;
struct ListItem *next;
};
这将创建一个名为 ListItems 的结构。该结构有两个组件,一个用于存储数据的组件和一个指向另一个 struct ListItem 类型的结构的指针。我将链表可视化如下:
这是一种正确的可视化方式吗?
代码片段2:
struct ListItem a;
a.data = 0;
a.next = NULL;
struct ListItem b;
b.data = 1;
b.next = NULL;
struct ListItem c;
c.data = 2;
c.next = NULL;
是的,我知道它可以缩短,但我只是这样做,看看我是否能理解这个概念。现在这个片段创建了一个类型为 struct ListItem 的变量“a”、“b”和“c”。然后它将每个结构的第一个成员(数据)分别设置为 0、1、2,并将第二个成员(下一个)指向 NULL。所以我现在的可视化是这样的:
现在有更多问题:
问题1:当我们最初将指针指向NULL时,它指向什么都正确?我们为什么要做这个?原来不是指什么都没有吗?
片段 3:
a.next = &b;
b.next = &c;
这让我们接下来在每个变量a、b(这是一个结构体)中分别指向b和c的地址内存位置。
我的可视化:
问题:它怎么能做到这一点?结构本身是否存储在多个内存地址上(4个用于int等)
片段4:
int counter = 0;
struct ListItem *i;
for (i = &a; i != NULL; i = i->next){
printf("Item %d value is %d\n\r", counter, i->data);
counter++;
}
这是我有点困惑的片段。现在,我们留出一个称为计数器的整数并将其初始化为零。此外,我们创建了一个名为 i 的变量,它指向类型 struct ListItem。现在有人可以向我解释 for 循环吗?我对它在做什么有点困惑。特别是i=i->next,这个我不熟悉。我知道它相当于 i=(*i).next 但不确定它的真正作用。有人可以创建一个快速图表吗?
还:如果有人有任何好的资源/链接(不是双关语)到一些有用的网站来帮助我更好地理解链接列表,请随时发布它们。