C - 仅创建链表的函数 returns 第一个节点

C - function that creates linked list only returns first node

我发现了其他类似但不完全相同的问题,如果我弄错了请留下一个link :)

我一直在尝试用 C 实现 shell,在考虑使用管道进行解析时,我考虑过使用 linked 的 char** args 列表。

我的解析函数在 return 整个列表时有问题。我使用 tmp 节点在创建新节点时继续移动,但是当我想 return 原始头部时,它的下一个是 NULL,我认为指向我头部的指针 tmp 应该只是一个指针并且改变了必须在我头上做。

这是仅包含问题的简化代码。

#include <stdio.h>
#include <stdlib.h>
typedef struct node
{
    int data;
    struct node* next;
} node ;
node* foo()
{
    node* head=malloc(sizeof(node));
    node* tmp=head;
    int i=0;
    for(i=0;i<5;i++)
    {
        tmp=tmp->next;
        tmp=malloc(sizeof(node));
        tmp->data=i;
    }
    return head;
}
int main()
{
    node* list=foo();
    while(list)
    {
        printf("this is your %d\n",list->data);
        list=list->next;
    }
}

如果你能给我指出正确的方向或告诉我我哪里做错了那就太好了。

你需要malloc tmp->next 然后再分配给tmp,像这样:

for(i=0;i<5;i++)
{
    tmp->next = malloc(sizeof(node));
    tmp=tmp->next;
    tmp->data=i;
    tmp->next = NULL;
}

这输出:

this is your 0
this is your 0
this is your 1
this is your 2
this is your 3
this is your 4
node* head=malloc(sizeof(node));
node* tmp=head;
int i=0;
for(i=0;i<5;i++)
{
    tmp=tmp->next;
    tmp=malloc(sizeof(node));
    tmp->data=i;
}
return head;

这里你已经创建了head并给了space,但是你从来没有初始化它并在你初始化它之前返回它

该函数没有意义,因为每个分配节点的数据成员next 都没有初始化。它是在循环中被改变的变量tmp

函数可以看成下面的样子

node* foo()
{
    const int N = 5;
    node *head = NULL;

    node **current = &head;

    for ( int i = 0; i < N; i++ )
    {
        *current = malloc(sizeof( node ) );

        if ( *current )
        {
            ( *current )->data = i;
            ( *current )->next = NULL;
            current = &( *current )->next;
        }
    }

    return head;
}

与其使用幻数5,不如指定应在列表中创建多少个节点,并将初始值作为函数参数。

例如

node* foo( size_t n, int init_value )
{
    node *head = NULL;

    node **current = &head;

    for ( size_t i = 0; i < n; i++ )
    {
        *current = malloc(sizeof( node ) );

        if ( *current )
        {
            ( *current )->data = init_value++;
            ( *current )->next = NULL;
            current = &( *current )->next;
        }
    }

    return head;
}

考虑到在 main 中指针列表在循环中被覆盖。因此您将无法再访问列表,因为头节点的地址将丢失。使用中间变量。例如

int main( void )
{
    node *list = foo();
    for ( node *current = list; current != NULL; current = current->next )
    {
        printf("this is your %d\n", current->data);
    }
}

并且根据 C 标准,不带参数的函数 main 应声明为

int main( void )