我需要创建一个链接列表数组(如图所示),这是我到目前为止所做的:
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。我用
做到了这一点link[q] = NULL;
我是否正确地说这就是它在记忆中的样子?
| 1 | - &GT; NULL
| 2 | - &GT; NULL
| 3 | - &GT; NULL
我的下一个问题是将数据插入链表。
(参考图片):如果我想插入另一个元素来说明数组的第3个索引([3] - &gt; d - &gt; NULL)
这是正确的吗?
Node* newNode = link[3];
newNode->data = 1;
link[3] = newNode;
感谢您的帮助!
答案 0 :(得分:3)
据我了解您的程序,以下声明不是必需的:
link [q] = malloc(sizeof(struct Node));
因为你需要从NULL指针开始,链接[q] = NULL;很好。
要在列表中插入项目,您应该为每个项目分配内存,因此它应该是这样的:
Node* newNode = malloc(sizeof(struct Node));
newNode->data = 1;
newNode->next = link[3];
link[3] = newNode;
它应该可以工作,虽然我没有测试它。
答案 1 :(得分:2)
你已经拥有一个包含5个指向节点的数组,即link
。你可以通过以下方式将它们设置为无效:
for (size_t i = 0; i < sizeof link / sizeof *link; ++i)
link[i] = NULL;
这里你不应该分配任何新的存储,因为你不想要实际的节点,你只需要指向节点的指针,你已经拥有它们。
您的代码首先分配,然后立即用malloc()
覆盖NULL
返回的指针,从而有效地永久丢失该内存。不好。
当您想要实际创建节点时,需要分配它并将其链接到正确的列表中。
答案 2 :(得分: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 };
这是一个演示程序,显示如何将节点添加到列表数组的元素中。 data
类型的数据成员int
的插入内容我使用data
类型的数据成员char
来查看。
#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
答案 3 :(得分:1)
首先,如果您不确定是否可以查看,最好的办法是打印 - 打印出来。
其次,您的代码中存在错误 -
link[q] = malloc(sizeof(struct Node));
link[q] = NULL;
这里你创建一个大小为struct Node
的新指针void *然后当你在变量Link[i]
中保存NULL时你失去了他有两个选项:
defualt fields
初始化,例如 - data =-1
NULL
醇>
我的建议,请选择2,只有当您需要添加新节点时才会分配。