我必须编写一个程序,它将获取文本文件的内容并使用递归反转每一行。例如,这个文件:
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;
}
答案 0 :(得分:0)
您可以使用以下内容进行就地字符串反转:
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);
}
答案 1 :(得分:0)
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
}
}
答案 2 :(得分:0)
据我所知,你必须使用递归。在这种情况下,您不需要链接列表。 这是一个反转一行的伪代码,因此你可以得到这个想法:
function reverse(text)
if (text = empty)
return
else
call reverse(text but the first letter)
print(first letter of text)
endif
endfun
答案 3 :(得分:0)
使用递归解决这个问题简直太愚蠢了。最好迭代地做。
无论如何,这里有一些关于如何做的伪代码:
/* 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);
}