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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.86
doommer
1 / 1 / 0
Регистрация: 17.08.2010
Сообщений: 22
#1

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

20.08.2010, 13:12. Просмотров 1740. Ответов 23
Метки нет (Все метки)

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

C++ Список массивов (заменить все элем. каждого массива ср. знач. и отсортировать список)
C++ std::sort. Как сортировать список? (список указателей на объект)
C++ Сформировать список из вещественных чисел. Упорядочить список по возрастанию.
C++ Список: Как добавлять элемент в список, не в начало и не в конец, а между 1 и 2 элементами списка?
list. Cоздать список из результатов(с массивами), а потом просмотреть весь список C++
Описать функцию, которая формирует список Common, включив в него элементы, ко-торые входят одновременно в список М1 и М2 C++
C++ Написать программу, реализующую связный список с информацией о студентах и отображающую список в порядке убывания возраста студента
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
CheshireCat
Эксперт С++
2891 / 1240 / 78
Регистрация: 27.05.2008
Сообщений: 3,345
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
Эксперт С++
9454 / 5467 / 926
Регистрация: 25.07.2009
Сообщений: 10,490
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
Эксперт С++
9454 / 5467 / 926
Регистрация: 25.07.2009
Сообщений: 10,490
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
бжни
2445 / 1650 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
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
Эксперт С++
9454 / 5467 / 926
Регистрация: 25.07.2009
Сообщений: 10,490
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
Эксперт С++
9454 / 5467 / 926
Регистрация: 25.07.2009
Сообщений: 10,490
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
Эксперт С++
9454 / 5467 / 926
Регистрация: 25.07.2009
Сообщений: 10,490
24.08.2010, 15:47     Реверсированный список #15
Цитата Сообщение от doommer Посмотреть сообщение
Только я немного не понял,что в данном случае итератив?
две функции делают по сути одно и то же, только одна рекурсивная (сама себя вызывает), а вторая итеративная (в цикле элементы массива перебирает)...
doommer
1 / 1 / 0
Регистрация: 17.08.2010
Сообщений: 22
24.08.2010, 16:11  [ТС]     Реверсированный список #16
Ааааа... Т.е. если нам например нужно передать функции строку и символ, а она должна вернуть есть ли такой символ или нет... то тут использовать итеративную?! Я просто немного не разобрался сам, что от меня собственно хотят) особенно с символом)
easybudda
Эксперт С++
9454 / 5467 / 926
Регистрация: 25.07.2009
Сообщений: 10,490
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
Эксперт С++
9454 / 5467 / 926
Регистрация: 25.07.2009
Сообщений: 10,490
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     Реверсированный список
Еще ссылки по теме:

C++ Необходимо создать список, элемент которого может быть список
Создать список, после каждого отрицательного числа вставить в список 0 C++
Напечатать пронумерованный список список первых 10 наиболее популярных газет C++
C++ Реализовать кольцевой список. Как закольцевать список обычный?
C++ Вводится число N. Создать список его делителей и вывести список на экран

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

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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru