2012-02-29 7 views
-1

テキストファイルの内容を受け取り、再帰を使用して各行を逆順にするプログラムを作成しなければなりません。たとえば、このファイル:文字列構造内の各文字列を逆転

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; 
} 
+2

このコードもコンパイルされません。私は良いCの本を手に入れ、基本から勉強し始めることをお勧めします...これは面接問題の可能性が高いことに対する答えをあなたに与えるだけの人には程遠いです。 – bdonlan

答えて

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

割り当てのように見えるコードを提供するための方法。 – Nim

+0

@ニム:これはおそらく彼の本の中のものです(半分はまあまあです)。しかし、私はおそらく非スプーンフィードルートに行ったはずですが、それは私に考えを与えるでしょう... – Necrolis

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 
    } 
} 
0

私が理解したように、再帰を使用する必要があります。この場合、リンクされたリストは必要ありません。ここ は、このようにあなたのアイデアを得ることができ、ラインを逆にする擬似コードである:再帰を使用してこの問題を解決する

function reverse(text) 
    if (text = empty) 
    return 
    else 
    call reverse(text but the first letter) 
    print(first letter of text) 
    endif 
endfun 
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); 
} 
+1

私あなたが "繰り返し"を意味すると思う。 – unwind

+0

ありがとう!訂正されました! –