在C语言的链表中插入一个节点的函数
Function to insert a node in a linked list in C
我正在尝试学习 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: %d\n", 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: %d\n", head->data);
}
我不知道如何在 C 中使用函数还是我的第一个代码有什么问题?
main
中的变量head
和insert
中的变量head
是两个不同的变量。在 insert
中为该局部变量赋值时,它不会影响 main
中的变量 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: %d\n", head->data);
}
在本次通话中
insert(8, head);
指针head
按值传递给函数。
表示函数处理的是指针值的副本
在函数内更改副本不会反映指针的原始值。
您需要通过指向它的指针按引用传递指针,或者 return 来自函数的指针的新值并将其分配给原始指针。
您还忘记将创建节点的数据成员 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." );
}
另一种方法是return从函数中获取指针头的新值。
例如
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." );
}
我正在尝试学习 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: %d\n", 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: %d\n", head->data);
}
我不知道如何在 C 中使用函数还是我的第一个代码有什么问题?
main
中的变量head
和insert
中的变量head
是两个不同的变量。在 insert
中为该局部变量赋值时,它不会影响 main
中的变量 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: %d\n", head->data);
}
在本次通话中
insert(8, head);
指针head
按值传递给函数。
表示函数处理的是指针值的副本
在函数内更改副本不会反映指针的原始值。
您需要通过指向它的指针按引用传递指针,或者 return 来自函数的指针的新值并将其分配给原始指针。
您还忘记将创建节点的数据成员 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." );
}
另一种方法是return从函数中获取指针头的新值。
例如
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." );
}