Форум программистов, компьютерный форум CyberForum.ru

Реверсированный список - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.86
doommer
1 / 1 / 0
Регистрация: 17.08.2010
Сообщений: 22
20.08.2010, 13:12     Реверсированный список #1
Ребятки, хелпаните! Через указатели желательно, надо не по простому варианту) Написать списочек, в который мы вводим данные, а на выходе у нас введенные данные, но в обратном порядке.. Я как понял надо еще один список создать для данных, которые выходять в обратном порядке?!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.08.2010, 13:12     Реверсированный список
Посмотрите здесь:

Список: связный список, в котором информация о книгах сортируется по убыванию стоимости. C++
C++ 3 класса: список, стек(как список), очередь(как список)
list. Cоздать список из результатов(с массивами), а потом просмотреть весь список C++
C++ создать список л3 из элементов входящих и в список л1 и в список л2
C++ Необходимо создать список, элемент которого может быть список
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
CheshireCat
Эксперт С++
2907 / 1235 / 78
Регистрация: 27.05.2008
Сообщений: 3,307
20.08.2010, 13:19     Реверсированный список #2
Ничего не понял.... Что означает "на выходе" ??? На выходе - чего?
Dzhej-Dzhej
Заблокирован
20.08.2010, 13:31     Реверсированный список #3
а может это стeк?
doommer
1 / 1 / 0
Регистрация: 17.08.2010
Сообщений: 22
20.08.2010, 17:21  [ТС]     Реверсированный список #4
Ок,сори,видимо плохо написал... Еще раз... Нужно написать программульку, которая читает список и печатает его в обратном порядке, вот как то так... Через указатели(

Добавлено через 3 часа 46 минут
Ребяяяяята!! ПОМОГИТЕ пожалуйста!
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9372 / 5422 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
20.08.2010, 18:37     Реверсированный список #5
Цитата Сообщение от doommer Посмотреть сообщение
вот как то так... Через указатели
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#include <stdio.h>
#include <stdlib.h>
 
typedef struct NODE {
    int val;
    struct NODE * next;
} node_t;
 
int push(node_t ** top, int val){
    node_t * n;
    
    if ( ( n = (node_t*)malloc(sizeof(node_t)) ) == NULL )
        return 1;
    n->val = val;
    n->next = *top;
    *top = n;
    return 0;
}
 
int pop(node_t ** top, int * val){
    node_t * next;
    
    if ( ! top || ! *top )
        return 1;
    *val = (*top)->val;
    next = (*top)->next;
    free ( *top );
    *top = next;
    return 0;
}
 
#define BUF_LEN 32
 
int main(void){
    char buf[BUF_LEN];
    int val;
    node_t * stack;
    
    stack = NULL;
    printf("Enter some numbers. Empty string - finish.\n");
    while ( printf("> ") && fgets(buf, BUF_LEN, stdin) && *buf != '\n' ){
        if ( push(&stack, atoi(buf)) ){
            fprintf(stderr, "Memory error!\n");
            exit(EXIT_FAILURE);
        }
    }
    
    if ( ! stack ){
        fprintf(stderr, "Stack is empty!\n");
        exit(EXIT_FAILURE);
    }
    
    while ( stack ){
        if ( pop(&stack, &val) ){
            fprintf(stderr, "Stack error!\n");
            exit(EXIT_FAILURE);
        }
        printf("> %d\n", val);
    }
    
    exit(EXIT_SUCCESS);
}
Реверсированный список
doommer
1 / 1 / 0
Регистрация: 17.08.2010
Сообщений: 22
20.08.2010, 19:42  [ТС]     Реверсированный список #6
Благодарю! А можно поподробнее про две строчки! Что за */int pop/* и */#define BUF_LEN 32/*

Расскажите об этом, если не сложно.
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9372 / 5422 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
20.08.2010, 19:50     Реверсированный список #7
Цитата Сообщение от doommer Посмотреть сообщение
#define BUF_LEN 32
константа для определения размера буфера (читайте про макроопределения)

Цитата Сообщение от doommer Посмотреть сообщение
int pop
функции push() и pop() - традиционные функции для работы со стеком. push() помещает значение в стек, pop() - извлекает зеачение из стека. В моём варианте обе они возвращают результат работы: 0 - удачно, 1 - нет. Кстати, функцию push() для кошерности чуть подправить надо
C
1
2
3
4
5
6
7
8
9
10
11
12
int push(node_t ** top, int val){
    node_t * n;
    
    if ( ! top )
        return 1;
    if ( ( n = (node_t*)malloc(sizeof(node_t)) ) == NULL )
        return 1;
    n->val = val;
    n->next = *top;
    *top = n;
    return 0;
}
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
20.08.2010, 20:11     Реверсированный список #8
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <list>
#include <iterator>
#include <iostream>
 
using namespace std;
 
int main(){
  list<int> l;
  copy( istream_iterator<int>(cin), istream_iterator<int>(), back_inserter( l ) );
  copy( l.rbegin(), l.rend(), ostream_iterator<int>(cout," ") );
  return 0;
}
doommer
1 / 1 / 0
Регистрация: 17.08.2010
Сообщений: 22
20.08.2010, 20:12  [ТС]     Реверсированный список #9
Спасибо за помощь!
doommer
1 / 1 / 0
Регистрация: 17.08.2010
Сообщений: 22
23.08.2010, 15:10  [ТС]     Реверсированный список #10
Возникла одна мысль по поводу этого же задания, как такое же сделать, НО используя рекурсивную функцию... Если не сложно,расскажите.
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9372 / 5422 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
23.08.2010, 15:46     Реверсированный список #11
Цитата Сообщение от doommer Посмотреть сообщение
как такое же сделать, НО используя рекурсивную функцию...
Не совсем политкорректно, но работает. Да и незачем в принципе так делать, если количество входных данных не известно - стек-то не резиновый...
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>
 
void reverse_numbers_print(void){
    int val;
    if ( scanf("%d", &val) != 1 )
        return;
    reverse_numbers_print();
    printf("%d\n", val);
}
 
int main(void){
    printf("Enter some numbers one by row. The single sign symbol - finish.\n");
    reverse_numbers_print();
    return 0;
}
Реверсированный список
doommer
1 / 1 / 0
Регистрация: 17.08.2010
Сообщений: 22
24.08.2010, 14:03  [ТС]     Реверсированный список #12
Спасибо!
Полностью с Вами согласен, но всетаки мысль возникла))) надо материально обставить ее))

Добавлено через 20 часов 42 минуты
easybudda!

Скажите пожалуйста, как можно вывести строку,а не цифры... Т.е. мы вводим "abcd" в функция возвращает "dcba" примерно тоже что и с числами.. мне сказали писать через *char, не используя std::string
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9372 / 5422 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
24.08.2010, 14:58     Реверсированный список #13
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <stdio.h>
 
void rec_reverse(const char * s){
    if ( ! *s )
        return;
    rec_reverse(s + 1);
    putchar(*s);
}
 
void it_reverse(const char * s){
    const char * p;
    for ( p = s; *p; ++p )
        ;
    while ( p > s )
        putchar(*--p);
}
 
int main(void){
    char buf[BUFSIZ];
 
    printf("String: ");
    scanf("%[^\n]%*c", buf);
    printf("Recursive: ");
    rec_reverse(buf);
    printf("\nIterative: ");
    it_reverse(buf);
    printf("\n");
 
    return 0;
}
doommer
1 / 1 / 0
Регистрация: 17.08.2010
Сообщений: 22
24.08.2010, 15:29  [ТС]     Реверсированный список #14
Ох, спасибо! Выручаете меня постоянно!

Только я немного не понял,что в данном случае итератив?!
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9372 / 5422 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
24.08.2010, 15:47     Реверсированный список #15
Цитата Сообщение от doommer Посмотреть сообщение
Только я немного не понял,что в данном случае итератив?
две функции делают по сути одно и то же, только одна рекурсивная (сама себя вызывает), а вторая итеративная (в цикле элементы массива перебирает)...
doommer
1 / 1 / 0
Регистрация: 17.08.2010
Сообщений: 22
24.08.2010, 16:11  [ТС]     Реверсированный список #16
Ааааа... Т.е. если нам например нужно передать функции строку и символ, а она должна вернуть есть ли такой символ или нет... то тут использовать итеративную?! Я просто немного не разобрался сам, что от меня собственно хотят) особенно с символом)
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9372 / 5422 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
24.08.2010, 16:32     Реверсированный список #17
Цитата Сообщение от doommer Посмотреть сообщение
Я просто немного не разобрался сам, что от меня собственно хотят
Вы уж определитесь как-нибудь, а то я Вам так всю стандартную библиотеку в рекурсивной версии перепишу...
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>
 
char * rec_strchr(const char * s, char c){
    return ( *s == '\0' ) ? NULL : ( *s == c ) ? (char*)s : rec_strchr(++s, c);
}
 
int main(void){
    char * text = "This is a good day to die.";
    char c, * found;
 
    printf("String: %s\n", text);
    printf("Character to find in: ");
    scanf("%c", &c);
    if ( found = rec_strchr(text, c) )
        printf("Yes, it's a %d(th) from begin.\n", found - text + 1);
    else
        printf("Character '%c' not found.\n", c);
 
    return 0;
}
doommer
1 / 1 / 0
Регистрация: 17.08.2010
Сообщений: 22
25.08.2010, 15:05  [ТС]     Реверсированный список #18
Полностью с Вами согласен! Надо взяться за голову)

Добавлено через 21 час 52 минуты
Что-то меня обругали за эти программки)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <stdio.h>
 
void rec_reverse(const char * s){
    if ( ! *s )
        return;
    rec_reverse(s + 1);
    putchar(*s);
}
 
void it_reverse(const char * s){
    const char * p;
    for ( p = s; *p; ++p )
        ;
    while ( p > s )
        putchar(*--p);
}
 
int main(void){
    char buf[BUFSIZ];
 
    printf("String: ");
    scanf("%[^\n]%*c", buf);
    printf("Recursive: ");
    rec_reverse(buf);
    printf("\nIterative: ");
    it_reverse(buf);
    printf("\n");
 
    return 0;
}
Сказали, что не так понял задание( "Надо было написать функцию, которой дают строку, а она ее переворачивает. Тут такой функции нет. Тут есть программа, которая что-то читает и пишет."
Budda подскажите,плз, как исправить?
Вторую программку переделал уже, а вот с этой какая-то морока.
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9372 / 5422 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
25.08.2010, 17:12     Реверсированный список #19
Цитата Сообщение от doommer Посмотреть сообщение
Надо было написать функцию, которой дают строку, а она ее переворачивает.
Вот нет бы сразу так
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <stdio.h>
 
char * strreverse(char * s){
    char * pHead, * pTail, c;
 
    for ( pTail = s; *pTail; ++pTail )
        ;
    for ( --pTail, pHead = s; pHead < pTail; ++pHead, --pTail ){
        c = *pHead;
        *pHead = *pTail;
        *pTail = c;
    }
 
    return s;
}
 
int main(void){
    char buf[BUFSIZ];
 
    printf("String:  ");
    scanf("%[^\n]%*c", buf);
    printf("Reverse: %s\n", strreverse(buf));
 
    return 0;
}
Цитата Сообщение от doommer Посмотреть сообщение
Написать списочек, в который мы вводим данные, а на выходе у нас введенные данные, но в обратном порядке..
На будующее - списком в С обычно называют набор из однотипных данных (структур), последовательно связанных между собой указателями.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.08.2010, 16:21     Реверсированный список
Еще ссылки по теме:

Создать список, после каждого отрицательного числа вставить в список 0 C++
Сформировать список из 10 работников, используя динамическую структуру данных двусвязный список C++
C++ Сформировать список из 10 книг, используя динамическую структуру данных односвязный список

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
doommer
1 / 1 / 0
Регистрация: 17.08.2010
Сообщений: 22
29.08.2010, 16:21  [ТС]     Реверсированный список #20
Здравствуйте, Будда)

Я нашел мааааленькую ошибочку)) В этой программульке функция меняет данную строку, должна ее не трогать, а просто выводить новую строку...
Перепишите пожалуйста)
Yandex
Объявления
29.08.2010, 16:21     Реверсированный список
Ответ Создать тему
Опции темы

Текущее время: 10:21. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru