繁体   English   中英

C中的链表结构

[英]Structure In C for linked list

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

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

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

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

start是类型为“指向struct Amit的指针”的变量。 在任何给定时间,最多只能有一个变量称为start visible。

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

想法是,列表中除最后一个结构外的每个结构都包含指向列表中下一个结构的link指针。 通常,列表上的最后一个结构的link指针为NULL(0)。 向下搜索列表时,将查看值,当需要下一项时,将跟随该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 };

我们可以将其添加到列表的startstart指向:

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);

等等。

这基本上定义了三件事:

  • struct (顺便说一下,不要将其大写为Struct)
  • 结构中的成员变量,名为link
  • 名为start的结构外部的变量

您可以通过将struct的定义与start变量的声明分开来减少混乱,如下所示:

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

struct Amit *start;

起点指向列表的顶部,并且在您的程序中全局可用。 而链接仅跟踪下一项,并且在引用特定的“节点”时可用。 看到此图,可能有助于您直观地理解!

链接在内部跟踪以下项目,该项目跟踪下一个组件的位置,因为它不一定与数组的方式连续。

+------+     +------+     +------+
| data |     | data |     | data |
+------+     +------+     +------+
| link |---->| link |---->| link |----> NULL
+------+     +------+     +------+
   ^
   |
 START (Keep track of the whole list.)

希望有助于澄清。

如果将“链接”重命名为“下一个”,则可以帮助您更好地理解它。 链接列表就像一条链-您的“开始”(或通常称为列表“ head”)是链的第一个环,而链的下一个环通过“下一个”指针(在您的情况下,您的“链接”指针)。 您知道当没有其他环(链接为NULL)时,您到达链上的最后一个项目。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM