2012-02-29 83 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 2012-02-29 08:35:04

回答

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

tsk tsk tsk用於爲看起來像任務的代碼提供代碼。 – Nim 2012-02-29 08:46:17

+0

@Nim:這可能是他的書中的內容(如果它的一半體面),只是更具可讀性,但我同意我應該可能走了非「勺子飼料」路線,但這給了我一個主意...... – Necrolis 2012-02-29 08:56:30

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

I認爲你的意思是「迭代」。 – unwind 2012-02-29 09:25:41

+0

謝謝!更正! – 2012-02-29 13:32:02