我一直在尝试理解链表的概念(看了一些示例代码,我在网上找到了这个。如果可以有人确认我是否正确掌握了一些概念,我会画出我认为每行代码所做的事情的图表。
#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"。然后,它将每个结构的第一个成员(data)分别设置为0、1、2,第二个成员(next)指向NULL。所以我的可视化现在是这样的:
现在有更多问题:
问题1:当我们最初将指针指向NULL时,它指向什么都没有,对吗?为什么要这样做?它最初不是指向什么的吗?
代码片段3:
a.next = &b;
b.next = &c;
这使得变量a、b(一个结构体)中的next分别指向b和c的内存地址。
我的想象:
问题:它是如何做到的?结构体本身不是存储在多个内存地址上的吗(例如int需要4个内存地址)?
代码片段 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,但不确定它到底是做什么的。有人能创建一个快速图解吗?
此外:如果有人有任何好的资源/链接(没有双关语)可以帮助我更好地理解链表,请随意发布它们。