Как изменить рекурсивный оператор на оператор цикла while (т.е. итеративный)

#c #recursion #while-loop #linked-list #singly-linked-list

#c #рекурсия #цикл while #связанный список #односвязный список

Вопрос:

Я изучал код связанного списка и столкнулся с тем фактом, что помимо использования рекурсивного, также можно использовать цикл for или while. Поэтому я попытался изменить рекурсивный оператор на цикл while (т.Е. итеративный), но, похоже, моя логика совершенно неуместна..

Я просто хочу изменить listing функцию в следующем коде. Не могли бы вы мне помочь?

Рекурсивный код выглядит следующим образом (это код, который дает желаемый результат):

 #include <stdio.h>
#include <stdlib.h>

typedef struct linkedlist{
    char first;
    struct linkedlist *second;
}linkedlist;
typedef linkedlist *NODE;


NODE listing(char string[]){  //This is the function that needs to change using a loop.
    NODE head;
    if(string[0] == '')
    return NULL;
    else{
        head = (struct linkedlist *)malloc(sizeof(linkedlist));
        head -> first = string[0];
        head -> second = listing(string   1);
        return head;
    } 
} 

void print(NODE head){
    if(head == NULL)
    printf("NULLn");
    else{
        printf("%c -> ", head -> first);
        print(head -> second);
    }
}

int main(void){
    char in_string[10];
    NODE head;
    printf("insert a string : ");
    scanf("%s", in_string);
    head = listing(in_string);
    printf("result of the list...n");
    print(head);
    return 0;
}
 

Результатом рекурсивного кода является то, что если я введу trial , это даст мне результат t -> r -> i -> a -> l -> NULL .

Код, который я пытался изменить и в итоге привел к ошибке, выглядит следующим образом:

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

Я действительно борюсь с этим часами… Пожалуйста, не могли бы вы помочь мне, как изменить его, чтобы я получил те же результаты?

Комментарии:

1. Вы никогда не назначаете second нигде в своей итеративной функции, как вы ожидаете, что это сработает?

Ответ №1:

Определение нерекурсивной функции с использованием цикла while достаточно просто.

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

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

    return head; 
} 
 

Обратите внимание на это, используя typedef для указателей, подобных этому

 typedef linkedlist *NODE;
 

это не очень хорошая идея. Это может только запутать читателей кода.

Ответ №2:

Попробуйте что-то вроде этого :

 NODE listing(char string[]){ 
    NODE head;
    head = (struct linkedlist *)malloc(sizeof(linkedlist));
    NODE cur = head;
    int i = 0;
    while(string[i] != '')
    {
        cur->first = string[i];
        if (string[i 1] != '') 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;
}