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

Array of Linked Lists in C: initializing and inserting?

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

enter image description here

1
2
3
4
5
6
7
8
9
10
11
12
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时,是否正在创建一个没有任何内容的Node?

我想初始化它以指向NULL。 我做到了

1
link[q] = NULL;

我说对了,这是对的吗?

| 1 | ->空

| 2 | ->空

| 3 | ->空

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

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

这是正确的吗?

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

感谢您的帮助!


据我了解您的程序,以下陈述是不必要的:

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

由于您需要从NULL指针开始,因此link [q] = NULL;很好

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

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

尽管我没有测试它,它应该可以工作。


这个循环

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

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

你可以写

1
Node* link[5] = { 0 };

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#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( '\
'
);
    }
}

#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;
}

程序输出为

1
2
3
4
5
a b NULL
c NULL
d NULL
NULL
NULL


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

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

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

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

当您要实际创建节点时,即需要分配它并将其链接到正确的列表中。


首先,最好的检查方法是不确定是否要看到它-打印它。

其次,您的代码中有错误-

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

在这里,您将新指针的大小设置为void *,其大小为struct Node,然后在将NULL保存到变量Link[i]中时丢失了它,您有2个选择:

  • 要分配链接,然后使用defualt fields对其进行初始化-例如data =-1
  • 在初始化之前,不要分配NULL并将其放入Everty节点
  • 我的建议,选择2,仅在需要添加新节点分配时使用。