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 )
我发现了其他类似但不完全相同的问题,如果我弄错了请留下一个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 )