很抱歉提出这么愚蠢的问题,但我真的很困惑。
struct Amit
{
int a;
struct Amit *link;
}
*start;
此处*link
和*start
都用于指向链表的节点,但这两者之间有什么区别,为什么我们不能将*start
放在结构中体?
答案 0 :(得分:5)
link
是结构类型的成员。 struct Amit
类型的每个结构都有一个。
start
是'指向struct Amit
'的类型的变量。在任何给定时间,最多可以有一个名为start
的变量。
你可以把start
放在结构中,但它会成为结构的一个成员(比如link
),你仍然需要声明结构类型的变量,或指向它们的指针
这个想法是除了last之外的列表上的每个结构都包含指向列表中下一个结构的link
指针。通常,列表中的最后一个结构具有NULL(0)的link
指针。在向下搜索列表时,您会查看值,当您需要下一个项目时,请按link
进行操作,在link
为NULL时停止。
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);
等
答案 1 :(得分:2)
这基本上定义了三件事:
struct
(顺便说一下,不要把它作为结构化大写)link
start
您可以通过将结构的定义与start
变量的声明分开来减少混淆,如下所示:
struct Amit
{
int a;
struct Amit *link;
};
struct Amit *start;
答案 2 :(得分:0)
如果您将“link”重命名为“next”,它可能会帮助您更好地理解它。链表就像一个链 - 你的“开始”(或通常称为“head”列表)是链的第一个环,链的下一个环通过你的“下一个”指针链接到它(在你的情况下,你的“链接”指针)。当没有其他环(链接为NULL)时,你知道链接到链上的最后一项。
答案 3 :(得分:0)
起始点指向列表顶部,可在全局程序中使用。链接只是跟踪下一个项目,并且在引用特定的“节点”时可用。请参阅此图表,它可以帮助您通过视觉来理解!
link内部跟踪以下项目,该项目跟踪下一个组件的位置,因为它不一定与数组的方式连续。
+------+ +------+ +------+
| data | | data | | data |
+------+ +------+ +------+
| link |---->| link |---->| link |----> NULL
+------+ +------+ +------+
^
|
START (Keep track of the whole list.)
希望有助于澄清。