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 个选项:
- 分配 link 然后用
defualt fields
初始化它,例如 - data =-1
- 在初始化之前不要在每个节点中分配和放置
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
我需要创建一个链表数组(如图所示),这是我目前所做的:
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 个选项:
- 分配 link 然后用
defualt fields
初始化它,例如 -data =-1
- 在初始化之前不要在每个节点中分配和放置
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