在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中的变量headinsert中的变量head是两个不同的变量。在 insert 中为该局部变量赋值时,它不会影响 main 中的变量 head

您可以通过不同的方式解决这个问题。一种是将head地址传递给函数,这样insert实际上可以修改那个地址的内容:

不是你的问题,但你也应该初始化 new_nodenext 成员:

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." );
}