Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何将递归语句更改为while循环语句(即迭代语句)_C_Recursion_While Loop_Linked List_Singly Linked List - Fatal编程技术网

C 如何将递归语句更改为while循环语句(即迭代语句)

C 如何将递归语句更改为while循环语句(即迭代语句),c,recursion,while-loop,linked-list,singly-linked-list,C,Recursion,While Loop,Linked List,Singly Linked List,我在研究一个链表代码时发现,除了使用递归外,还可以使用for或while循环。因此,我尝试将递归转换为while循环(即迭代),但我的逻辑似乎完全不合适 我只想在下面的代码中更改列表函数。你能帮我一下吗 递归代码如下所示(这是具有我想要的结果的代码): 我真的为此挣扎了好几个小时。。。请您帮助我如何更改它以获得相同的结果?尝试以下方法: NODE listing(char string[]){ NODE head; head = (struct linkedlist *)mal

我在研究一个链表代码时发现,除了使用递归外,还可以使用for或while循环。因此,我尝试将递归转换为while循环(即迭代),但我的逻辑似乎完全不合适

我只想在下面的代码中更改
列表
函数。你能帮我一下吗

递归代码如下所示(这是具有我想要的结果的代码):


我真的为此挣扎了好几个小时。。。请您帮助我如何更改它以获得相同的结果?

尝试以下方法:

NODE listing(char string[]){ 
    NODE head;
    head = (struct linkedlist *)malloc(sizeof(linkedlist));
    NODE cur = head;
    int i = 0;
    while(string[i] != '\0')
    {
        cur->first = string[i];
        if (string[i+1] != '\0') cur->second = (struct linkedlist *)malloc(sizeof(linkedlist));
        else cur->second = NULL;
        cur = cur->second;
        i++;
    } 
    return head;
}

int main(void){
    char in_string[10] = {0};
    memcpy(in_string, "trial", 5);
    NODE head = listing(in_string);
    print(head);     //==> t -> r -> i -> a -> l -> NULL
    return 0;
}

使用while循环定义非递归函数非常简单

NODE listing( const char string[] )
{
    NODE head = NULL;
    NODE *current = &head;

    while ( *string )
    {
        *current = ( struct linkedlist * )malloc( sizeof( linkedlist ) );
        ( *current ) -> first = *string++;
        ( *current ) -> second = NULL;
        current = &( *current )->second;
    }

    return head; 
} 
请注意,对这样的指针使用typedef

typedef linkedlist *NODE;

这不是个好主意。它只会让代码的读者感到困惑。

在迭代函数的任何地方,你都不会分配到
second
,你希望它如何工作?
NODE listing( const char string[] )
{
    NODE head = NULL;
    NODE *current = &head;

    while ( *string )
    {
        *current = ( struct linkedlist * )malloc( sizeof( linkedlist ) );
        ( *current ) -> first = *string++;
        ( *current ) -> second = NULL;
        current = &( *current )->second;
    }

    return head; 
} 
typedef linkedlist *NODE;