目前我有一个如下所示的节点结构:
struct Node {
int data;
Node* next;
};
我想实现一个函数,该函数将在给定元素列表的情况下制作链表并返回列表的头部。我目前有以下结构:
struct Node *make_list(int values[10]) {
struct Node *curr;
head = (struct Node*) malloc(sizeof(struct Node));
struct Node *head;
head->value = values[0];
head->next = NULL;
curr = head;
for (int i = 1; i < 10 i++) {
struct Node *tmp;
tmp->value=values[i];
curr->next=tmp;
}
return head;
}
出于某种原因,此代码始终返回 NULL 作为链表的头部,但在该 null 元素之后,10 个元素按顺序排列。有谁知道为什么会这样?
对于初学者来说,这个节点声明
struct Node {
int data;
Node* next;
};
在 C 中无效。你必须声明这样的结构
struct Node {
int data;
struct Node* next;
};
您的函数定义将无法编译,也没有多大意义。
例如,可以通过以下方式定义它
struct Node * make_list( const int values[], size_t n )
{
struct Node *head = NULL;
struct Node **current = &head;
for ( size_t i = 0; i < n; i++ )
{
*current = malloc( sizeof( struct Node ) );
( *current )->data = values[i];
( *current )->next = NULL;
current = &( *current )->next;
}
return head;
}
这是一个演示程序。
#include <stdio.h>
#include <stdlib.h>
struct Node
{
int data;
struct Node* next;
};
struct Node * make_list( const int values[], size_t n )
{
struct Node *head = NULL;
struct Node **current = &head;
for ( size_t i = 0; i < n; i++ )
{
*current = malloc( sizeof( struct Node ) );
( *current )->data = values[i];
( *current )->next = NULL;
current = &( *current )->next;
}
return head;
}
void out( struct Node *head )
{
for ( ; head != NULL; head = head->next )
{
printf( "%d -> ", head->data );
}
puts( "null" );
}
int main(void)
{
int a[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
const size_t N = sizeof( a ) / sizeof( *a );
struct Node *head = make_list( a, N );
out( head );
return 0;
}
它的输出是
0 -> 1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7 -> 8 -> 9 -> null
弗拉德答案的替代方案(我认为会更容易理解(:
struct Node *make_list(int values[10]) {
struct Node* head = (struct Node*) malloc(sizeof(struct Node));
head->value = values[0];
head->next = NULL;
struct Node *curr;
curr = head;
for (int i = 1; i < 10; i++) {
struct Node* tmp = (struct Node*) malloc(sizeof(struct Node));
tmp->value=values[i];
tmp->next = NULL;
curr->next=tmp;
curr = tmp;
}
return head;
}
必须始终将新内存分配给新节点
struct Node* tmp = (struct Node*) malloc(sizeof(struct Node));
否则,函数完成后它将丢失。
然后,必须确保新节点收到正确的值:
tmp->value=values[i];
tmp->next = NULL;
最后,您需要更新curr
节点,使其指向列表中的最后一项(通常我们称之为tail
(。
next=tmp;
curr = tmp;
你可以在这里尝试一下。