gpt4 book ai didi

C 链表/-> 运算符

转载 作者:行者123 更新时间:2023-12-02 01:59:43 26 4
gpt4 key购买 nike

所以我一直在努力理解链表的概念(一直在看一些示例代码,我在互联网上找到了这个。现在如果我能请别人确认我是否正确掌握了一些概念。我将绘制图表,说明我认为每个代码链接的作用。

#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 的结构的指针。我将链表想象成这样:

enter image description here

这是一种正确的可视化方式吗?


代码片段 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。所以我现在的可视化是这样的:

enter image description here

现在更多问题:

问题一:当我们最开始将指针指向NULL时,它指向什么都不正确?我们为什么要做这个?本来不是指向什么的吗?


片段 3:

   a.next = &b;
b.next = &c;

这让我们接下来在每个变量a,b(这是一个结构)分别指向b和c的地址内存位置。

我的可视化:enter image description here

问题:它如何做到这一点?结构本身不是存储在多个内存地址上吗(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 但不确定它到底做了什么。有人可以快速创建图表吗?

另外:如果有人有任何好的资源/链接(没有双关语)到一些有用的网站以帮助我更好地理解链接列表,请随时发布它们。

最佳答案

Q1:未初始化的指针不指向“无”。如果您不设置它的值,它可以(并且将)指向几乎任何,包括(但不限于)nul 值、越界内存或最后一个密码你进入了一个网站。

当你这样做时,这与询问你的计数器的值真的没有什么不同

int counter;
...
printf ("counter is %d\n", counter);

因此,将 next 指针设置为 NULL 有两个不同的目的。首先,您确定它是一个“已知”值,而不是任何随机值。其次,按照惯例,NULL 值意味着它不指向任何有效位置。

(这是一个“约定”,因为 NULL 有效地存储了数值“0”。这是一个内存地址——因为你在谈论指针—— - 完全有效。只是日常使用不多。)

关于C 链表/-> 运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17897352/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com