C 中的链表数组:初始化和插入?

Array of Linked Lists in C: initializing and inserting?

我需要创建一个链表数组(如图所示),这是我目前所做的:

typedef struct Node {
    int data;
    struct Node *next;
} Node;

int main(void) {
    Node* link[5];
    for(int q = 0; q < 5; q++) {
        link[q] = malloc(sizeof(struct Node));
        link[q] = NULL;
    }
}

我已经有一段时间没有在 C 中使用链表了,所以我忘记了很多语法,而且我很难想象在编写链表代码时到底发生了什么。如果我没记错的话,当我在我的代码中调用 malloc 时,我正在创建一个什么都没有的节点?[​​=14=]

我想初始化它指向NULL。我用

做了这个
link[q] = NULL;

我说这是记忆中的样子对吗?

|1| -> 空

|2| -> 空

|3| -> 空


我的下一个问题是将数据插入链表。

(参考图片):如果我想插入另一个元素到数组的第三个索引([3]-> d -> NULL)

这是正确的吗?

Node* newNode = link[3];
newNode->data = 1;
link[3] = newNode;

感谢您的帮助!

您已经有一个包含 5 个指向节点的指针的数组,即 link。您可以通过以下操作将它们设置为不指向任何内容:

for (size_t i = 0; i < sizeof link / sizeof *link; ++i)
 link[i] = NULL;

在这里你不应该分配任何新的存储,因为你不需要实际的节点,你只需要指向节点的指针并且你已经有了它们。

您的代码首先分配,然后立即用 NULL 覆盖 malloc() 返回的指针,有效地永远失去该内存。不好。

当你真正想要创建一个节点时,就是你需要分配它并link它到正确列表中的时候。

据我了解你的程序,下面的语句是没有必要的:

link[q] = malloc(sizeof(struct Node));

由于需要从NULL指针开始,link[q] = NULL;就好了。

要在列表中插入项目,您应该为每个项目分配内存,所以它应该变成这样:

Node* newNode = malloc(sizeof(struct Node));
newNode->data = 1;
newNode->next = link[3];
link[3] = newNode;

应该可以,虽然我没有测试。

首先,如果您不确定要检查的内容,最好的办法就是查看它 - 打印出来。

其次,您的代码有误 -

    link[q] = malloc(sizeof(struct Node));
    link[q] = NULL;

在这里你创建了一个大小为 struct Node 的新指针 void* 然后当你在变量中保存 NULL 时你失去了他 Link[i] 你有 2 个选项:

  1. 分配 link 然后用 defualt fields 初始化它,例如 - data =-1
  2. 在初始化之前不要在每个节点中分配和放置 NULL

我的建议是,选择 2,并且仅在需要添加新节点时分配。

这个循环

Node* link[5];
for(int q = 0; q < 5; q++) {
    link[q] = malloc(sizeof(struct Node));
    link[q] = NULL;
}

导致内存泄漏,因为首先分配内存,然后指针被 NULL 覆盖。所以分配内存的地址丢失了。

你可以直接写

Node* link[5] = { 0 };

这是一个演示程序,展示了如何将节点添加到列表数组的元素中。 int 类型的数据成员 data 的 Insetad 我正在使用 char 类型的数据成员 data 以获得可见性。

#include <stdio.h>
#include <stdlib.h>

typedef struct Node 
{
    char data;
    struct Node *next;
} Node;


int push_front( Node **head, char data )
{
    Node *new_node = malloc( sizeof( Node ) );
    int success = new_node != NULL;

    if ( success )
    {
        new_node->data = data;
        new_node->next = *head;
        *head = new_node;
    }

    return success;
}

void output( Node **head )
{
    for( Node *current =*head; current != NULL; current = current->next )
    {
        printf( "%c ", current->data );
    }
    printf( "%s", "NULL" );
}

void display( Node **set, size_t n )
{
    for ( size_t i = 0; i < n; i++ )
    {
        output( set++ );
        putchar( '\n' );
    }
}

#define N   5

int main(void) 
{
    Node * link[N] = { 0 };

    push_front( &link[0], 'b' );
    push_front( &link[0], 'a' );
    push_front( &link[1], 'c' );
    push_front( &link[2], 'd' );

    display( link, sizeof( link ) / sizeof( *link ) );

    return 0;
}

程序输出为

a b NULL
c NULL
d NULL
NULL
NULL