C中的结构用于链表

时间:2011-01-10 05:40:39

标签: c data-structures struct linked-list

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

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

此处*link*start都用于指向链表的节点,但这两者之间有什么区别,为什么我们不能将*start放在结构中体?

4 个答案:

答案 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 == 0root.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)

这基本上定义了三件事:

  • a 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.)

希望有助于澄清。