C中的结构用于链表

Ami*_*mar 1 c struct linked-list data-structures

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

struct Amit
{
  int a;
  struct Amit *link;
}
*start;
Run Code Online (Sandbox Code Playgroud)

这里既有*link*start用来指向一个链表的节点,但什么是这两个之间的差异为什么我们不能把*start结构体里面?

Jon*_*ler 5

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

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

你可以把start它放在结构中,但它会成为结构的一部分(比如link),你仍然需要声明结构类型的变量,或指向它们的指针.

这个想法是除了last之外的列表上的每个结构都包含link指向列表中下一个结构的指针.通常,列表中的最后一个结构有一个linkNULL(0)指针.在向下搜索列表时,您会查看值,当您需要下一个项目时,您可以按照link它来执行,当link为NULL 时停止.

struct Amit *item = start;
while (item != NULL && item->a != value_wanted)
    item = item->link;
Run Code Online (Sandbox Code Playgroud)

可以建立一个循环链表,它具有不同的停止标准.


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

创建列表的一种方法是:

struct Amit root = { 0, NULL };
struct Amit *start = &root;
Run Code Online (Sandbox Code Playgroud)

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

struct Amit next = { 1, NULL };
Run Code Online (Sandbox Code Playgroud)

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

next.link = start;
start = &next;
Run Code Online (Sandbox Code Playgroud)

创建列表的更合理的方法是动态分配节点,包括根节点.一致性是至关重要的,因为您必须释放动态分配的节点,并且动态分配一些节点而其他节点不是很混乱.(我假设该函数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;
Run Code Online (Sandbox Code Playgroud)

您通常会将这些内容打包成管理节点分配,初始化和链接的函数.

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);
Run Code Online (Sandbox Code Playgroud)

等等.