我正在尝试学习C中的数据结构,但我被我制作的第一个函数卡住了。如果我这样做,什么也不会发生
我没有收到任何错误,但程序没有打印任何内容。
#include <stdio.h>
#include <stdlib.h>
typedef struct node{
int data;
struct node *next;
}node;
void insert(int data, node *head){
node *new_node = malloc(sizeof(node));
new_node->data = data;
head = new_node;
}
int main(){
node *head = NULL;
insert(8, head);
printf("head.data: %dn", head->data);
}
但是,如果我把函数insert中的代码放在主函数中,它就可以工作了。
#include <stdio.h>
#include <stdlib.h>
typedef struct node{
int data;
struct node *next;
}node;
int main(){
node *head = NULL;
node *new_node = malloc(sizeof(node));
new_node->data = 5;
head = new_node;
printf("head.data: %dn", head->data);
}
我不知道如何在C中使用函数吗?或者我的第一个代码有什么问题?
在这个调用中
insert(8, head);
指针CCD_ 1按值传递给函数。
这意味着该函数处理指针值的副本。
在函数中更改副本不会反映指针的原始值。
您需要通过指向指针的指针通过引用传递指针,或者从函数返回指针的新值并将其分配给原始指针。
此外,您忘记将创建的节点的数据成员next
设置为NULL
,或者更精确地设置为head
。
给你。
int insert( node **head, int 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;
}
该函数被称为类似
insert( &head, 8 );
或
if ( !insert( &head, 8 ) )
{
puts( "Error: not enough memory." );
}
另一种方法是从函数返回指针头的新值。
例如
node * insert( node *head, int data )
{
node *new_node = malloc( sizeof( node ) );
if ( new_node != NULL )
{
new_node->data = data;
new_node->next = head;
}
return new_node;
}
在这种情况下,您需要谨慎使用该函数。
例如
node *tmp = insert( head, 8 );
if ( tmp != NULL )
{
head = tmp;
}
else
{
puts( "Error: not enough memory." );
}
main
中的变量head
和insert
中的变量head
是两个不同的变量。当在insert
中为该局部变量赋值时,它不会影响head
1中的变量head
。
你可以用不同的方法来解决这个问题。一种是将head
的地址传递给函数,因此insert
实际上可以修改该地址处的内容:
不是你的问题,但你也应该初始化new_node
:的next
成员
void insert(int data, node **headPtr){
node *new_node = malloc(sizeof(node));
new_node->data = data;
new_node->next = *headPtr;
*headPtr = new_node;
}
int main(){
node *head = NULL;
insert(8, &head);
printf("head.data: %dn", head->data);
}