我发现其他问题相似但不完全相同,如果我弄错了请留下链接:)
我一直在尝试使用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;
}
}
如果你可以指出我正确的方向或者告诉我我错了什么会很棒。
答案 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;
}