Переверните каждую строку в структуре строк - PullRequest
0 голосов
/ 29 февраля 2012

Мне нужно написать программу, которая будет принимать содержимое текстового файла и реверсировать каждую строку, используя рекурсию.Например, этот файл:

abc def ghi
jkl mno pqr

должен в конечном итоге выглядеть следующим образом:

ihg fed cba
rpq onm lkj

Я решил, что лучший способ сделать это - поместить содержимое в связанный список и затем повернуть вспять.каждая строка отдельно.Часть связанного списка работает просто отлично, за исключением того, что я не совсем уверен, как сделать часть обращения .. Это то, что я до сих пор:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
#define NODE struct list

void reverse(void);

struct list {
        char array[20];
        struct list *next;
};


int main(void)
{
        reverse();
        return 0;
}


void reverse(void)
{
        NODE *p;
        p = head;

        while (p != NULL)
        {
                reverse(p->array + sizeof(p->array));
                printf("%d", p->array);
        }

        return;
}

Ответы [ 4 ]

0 голосов
/ 29 февраля 2012

Решение этой проблемы с помощью рекурсии просто глупо.Лучше делать это итеративно.

В любом случае, вот некоторый псевдокод о том, как это сделать:

/* Recursive function to print a string backwards */
print_reverse(char first_char, char *rest_of_string) {
  if (rest_of_string[0]) {
    /* First print the rest of the strin backwards... */
    print_reverse(rest_of_string[0], rest_of_string + 1);
  }
  /* ... then print the first character in the string */
  print first char
}

for each line {
  print_reverse(line[0], line + 1);
}
0 голосов
/ 29 февраля 2012

Я думаю, что-то в этом роде. Размер массива жестко закодирован до 10, как в вашем примере. Использование рекурсии:

void reverse( struct list *p )
{
  if( p )
  {
    int i;
    reverse(p->next);
    for (i=0;i<10;++i)
    {
      char tmp=p->array[i];
      p->array[i]=p->array[i+10];
      p->array[i+10]=tmp;
    }
    p->array[19]=0; // to ensure 0 byte at string end
  }
}
0 голосов
/ 29 февраля 2012

Как я понял, вы должны использовать рекурсию. В этом случае вам не нужен связанный список. Вот псевдокод, чтобы перевернуть строку, таким образом, вы можете получить идею:

function reverse(text)
  if (text = empty) 
    return
  else
     call reverse(text but the first letter)
     print(first letter of text)
  endif
endfun
0 голосов
/ 29 февраля 2012

вы можете сделать инверсию строки на месте, используя что-то вроде этого:

void reverse_str(char* str)
{
    int len = strlen(str),i;
    for(i = 0; i < len / 2; i++)
    {
        char c = str[i];
        str[i] = str[len - 1 - i];
        str[len - 1 - i] = c;  
    }
}

Однако вышеприведенная функция на самом деле является рекурсивной, если вы хотите сделать ее рекурсивной, вы можете использовать двоичную рекурсию для перехода от внешних символов к внутренним, используя len, чтобы определить, когда остановиться.

затем, используя ваш связанный список, можете сделать (отредактировано, чтобы сделать рекурсивным ...):

void reverse(struct Node* p)
{
    if(!p)
       return;

    reverse_str(p->array);
    printf("%s",p->array);
    reverse(p->next);        
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...