在字符串结构中反转每个字符串

时间:2012-02-29 08:29:56

标签: c recursion structure

我必须编写一个程序,它将获取文本文件的内容并使用递归反转每一行。例如,这个文件:

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 :(得分: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)

我想,就像这样。如您的示例所示,数组的大小硬编码为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
  }
}

答案 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);
}