2013-11-15 2 views
0

Мне нужно написать программу, которая хранит строку, введенную пользователем в связанный список, а затем печатает ее в обратном порядке - если пользователь вводит Hello. выход должен быть .olleH.Чтение строки в связанном списке

Я не совсем понимаю идею списков, однако я придумал что-то, будет очень признателен за любую обратную связь.

typedef struct L { 
char c; 
struct L *next; 
}List; 

List *getInput(void) { 
    List *t = calloc(1, sizeof(List)); 
    int i; 
    for (i=0; getchar() != '.'; i++) { 
     t->c = getchar(); 
     t->next = NULL; 
     printf("%c", t->c); 
     t = t->c; 
     t->next = t->next->next; 
    } 
    return t; 
} 

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

На данный момент я просто попытался сохранить его в списке t, символом символом, используя getchar(). Затем я хотел бы распечатать его, используя другой цикл, отсчитывающий назад. По некоторым причинам это не работает, хотя и я (не полностью понимая концепцию списков) не может понять, почему.

Цените любую помощь, ребята!

+2

Почему C# тег? –

+1

Согласен, извините за те теги. Это C действительно – user2997781

+2

@ Manu343726 'printf',' NULL' и 'calloc' все существуют на C++, нравятся они вам или нет. (Не то, что я думаю, что это должно быть помечено как C++, но это _is_ почти допустимо C++, отличное от того, чтобы не отбрасывать возвращаемое значение 'calloc'.) –

ответ

1

Как вы хотите напечатать строку ввода в обратном порядке, проще всего сохранить строку в связанном списке в обратном порядке, то есть добавить символы, когда они будут прочитаны в начале («голова») списка. Таким образом, в начале список будет пустым, тогда он будет содержать «H», затем «eH», «leH» и т. Д. Вот samblo код:

List *getInput(void) 
{ 
    List *l = NULL; // list head, we'll prepend nodes here 
    int c;   // variable for current read character 

    while ((c = getchar()) != EOF) {  // read characters one by ine, until end-of-file 
     List *n = calloc(1, sizeof(List)); // create new list node 
     n->c = c;  // store read character in that node 
     n->next = l; // prepend newly created node to our list 
     l = n;  // store newly created node as head of list 
    } 

    return l; 
} 

Вот как вы можете распечатать список:

void printList (List *l) 
{ 
    while (l != NULL) { // while we have not reached end of list 
     putchar(l->c); // print character stored in list 
     l = l->next; // and advance to next list node 
    } 
} 
Смежные вопросы