gpt4 book ai didi

c - C中链表的结构

转载 作者:太空宇宙 更新时间:2023-11-04 00:42:02 24 4
gpt4 key购买 nike

很抱歉问了这么个愚蠢的问题,但我真的很困惑。

struct Amit
{
int a;
struct Amit *link;
}
*start;

这里*link*start都是用来指向链表的一个节点,但是这两者有什么区别,为什么不能放*start 在结构体内?

最佳答案

link是结构类型的成员。每种结构类型 struct Amit有一个。

start是类型为“指向struct Amit的指针”的变量'.在任何给定时间,最多可以有一个名为 start 的变量。可见。

你可以把start在结构内部,但它将成为结构的成员(如 link ),您仍然需要声明结构类型的变量或指向它们的指针。

这个想法是,除了最后一个之外,列表中的每个结构都包含一个link。指向列表中下一个结构的指针。通常,列表中的最后一个结构具有 link为 NULL (0) 的指针。向下搜索列表时,您会查看值,当您需要下一项时,您会遵循 link。到它,停止时 link为空。

struct Amit *item = start;
while (item != NULL && item->a != value_wanted)
item = item->link;

可以改为构建一个循环链表,它具有不同的停止条件。


看看评论,再解释一下......

创建列表的一种方法是:

struct Amit root = { 0, NULL };
struct Amit *start = &root;

变量root是用 root.a == 0 初始化的结构和 root.link == NULL (或者,等效地,root.link == 0)。指针变量start指向(存储地址)root .给定一个新节点:

struct Amit next = { 1, NULL };

我们可以将其添加到列表的前面 start指向:

next.link = start;
start = &next;

创建列表的更合理的方法是动态分配节点,包括根节点。一致性是至关重要的,因为您必须释放动态分配的节点,并且让一些节点动态分配而其他节点不动态分配是困惑的。 (我假设函数 void *emalloc(size_t nbytes);malloc() 的覆盖函数,它从不返回空指针 - 所以它会为我进行错误检查。)

// Create the empty list
start = emalloc(sizeof(*start));
start->a = 0;
start->link = NULL;

// Create a node
struct Amit *node = emalloc(sizeof(*node));
node->a = 42;
node->link = NULL:

// Add the node to the font of the list
node->link = start;
start = node;

您通常会将这些东西打包到管理节点的分配、初始化和链接的函数中。

struct Amit *add_node(struct Amit *start, int value)
{
struct Amit *node = emalloc(sizeof(*node));
node->a = value;
node->link = start;
return start;
}

start = add_node(start, 42);
start = add_node(start, 30);
start = add_node(start, 18);

for (node = start; node->link != 0; node = node->link)
printf("Node: %d (%p)\n", node->a, node->link);

等等

关于c - C中链表的结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4643987/

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