C - 创建链表的函数只返回第一个节点

时间:2017-11-23 11:30:45

标签: c linked-list singly-linked-list

我发现其他问题相似但不完全相同,如果我弄错了请留下链接:)

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

我的解析功能在返回整个列表时出现问题。我在创建新节点时使用tmp节点继续移动,但是当我想返回原始头部时,接下来是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;
    }
}

如果你可以指出我正确的方向或者告诉我我错了什么会很棒。

4 个答案:

答案 0 :(得分:1)

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并给了空间,但你从来没有初始化它并在初始化它之前返回它

答案 1 :(得分:1)

该函数没有意义,因为每个已分配节点的下一个数据成员未初始化。它是在循环中更改的变量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;
}

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

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 )

答案 2 :(得分:0)

在将其分配给tmp之前,您需要malloc tmp-&gt;,如下所示:

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

答案 3 :(得分:-1)

创建一个新节点,在其旁边指定tmp-&gt;然后将tmp移动到前进。

node* foo()
{
    node* head=malloc(sizeof(node));
    head->next = NULL;
    head->data = 0;   // initialise head data 
    node* tmp=head;
    int i;
    for(i=1;i<5;i++)
    {
        node *newNode =malloc(sizeof(node));
        newNode->data=i;
        newNode->next = NULL;
        tmp->next = newNode;
        tmp = tmp->next;
    }
    return head;
}