#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;
}