Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.60/10: Рейтинг темы: голосов - 10, средняя оценка - 4.60
doommer
1 / 1 / 0
Регистрация: 17.08.2010
Сообщений: 22
#1

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

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

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

Создать список L3 из элементов, входящих и в список L1 и в список L2
создать список л3 из элементов входящих и в список л1 и в список л2

3 класса: список, стек(как список), очередь(как список)
препод дал задание: написать 3 класса (список, стек, очередь), методы: вывод,...

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

Список: связный список, в котором информация о книгах сортируется по убыванию стоимости.
Друзья помогите с реализацией списка. Нужно запрограммировать связный список, в...

Вводится число N. Создать список его делителей и вывести список на экран
#include<iostream> #include<stdio.h> #include<malloc.h> #include<string.h>...

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

Добавлено через 3 часа 46 минут
Ребяяяяята!! ПОМОГИТЕ пожалуйста!
0
easybudda
Модератор
Эксперт CЭксперт С++
10029 / 5952 / 1486
Регистрация: 25.07.2009
Сообщений: 11,251
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);
}
Реверсированный список
1
doommer
1 / 1 / 0
Регистрация: 17.08.2010
Сообщений: 22
20.08.2010, 19:42  [ТС] #6
Благодарю! А можно поподробнее про две строчки! Что за */int pop/* и */#define BUF_LEN 32/*

Расскажите об этом, если не сложно.
0
easybudda
Модератор
Эксперт CЭксперт С++
10029 / 5952 / 1486
Регистрация: 25.07.2009
Сообщений: 11,251
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;
}
1
alex_x_x
бжни
2455 / 1661 / 134
Регистрация: 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;
}
2
doommer
1 / 1 / 0
Регистрация: 17.08.2010
Сообщений: 22
20.08.2010, 20:12  [ТС] #9
Спасибо за помощь!
0
doommer
1 / 1 / 0
Регистрация: 17.08.2010
Сообщений: 22
23.08.2010, 15:10  [ТС] #10
Возникла одна мысль по поводу этого же задания, как такое же сделать, НО используя рекурсивную функцию... Если не сложно,расскажите.
0
easybudda
Модератор
Эксперт CЭксперт С++
10029 / 5952 / 1486
Регистрация: 25.07.2009
Сообщений: 11,251
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;
}
Реверсированный список
1
doommer
1 / 1 / 0
Регистрация: 17.08.2010
Сообщений: 22
24.08.2010, 14:03  [ТС] #12
Спасибо!
Полностью с Вами согласен, но всетаки мысль возникла))) надо материально обставить ее))

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

Скажите пожалуйста, как можно вывести строку,а не цифры... Т.е. мы вводим "abcd" в функция возвращает "dcba" примерно тоже что и с числами.. мне сказали писать через *char, не используя std::string
0
easybudda
Модератор
Эксперт CЭксперт С++
10029 / 5952 / 1486
Регистрация: 25.07.2009
Сообщений: 11,251
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;
}
1
doommer
1 / 1 / 0
Регистрация: 17.08.2010
Сообщений: 22
24.08.2010, 15:29  [ТС] #14
Ох, спасибо! Выручаете меня постоянно!

Только я немного не понял,что в данном случае итератив?!
0
easybudda
Модератор
Эксперт CЭксперт С++
10029 / 5952 / 1486
Регистрация: 25.07.2009
Сообщений: 11,251
24.08.2010, 15:47 #15
Цитата Сообщение от doommer Посмотреть сообщение
Только я немного не понял,что в данном случае итератив?
две функции делают по сути одно и то же, только одна рекурсивная (сама себя вызывает), а вторая итеративная (в цикле элементы массива перебирает)...
1
doommer
1 / 1 / 0
Регистрация: 17.08.2010
Сообщений: 22
24.08.2010, 16:11  [ТС] #16
Ааааа... Т.е. если нам например нужно передать функции строку и символ, а она должна вернуть есть ли такой символ или нет... то тут использовать итеративную?! Я просто немного не разобрался сам, что от меня собственно хотят) особенно с символом)
0
easybudda
Модератор
Эксперт CЭксперт С++
10029 / 5952 / 1486
Регистрация: 25.07.2009
Сообщений: 11,251
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;
}
1
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 подскажите,плз, как исправить?
Вторую программку переделал уже, а вот с этой какая-то морока.
0
easybudda
Модератор
Эксперт CЭксперт С++
10029 / 5952 / 1486
Регистрация: 25.07.2009
Сообщений: 11,251
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 Посмотреть сообщение
Написать списочек, в который мы вводим данные, а на выходе у нас введенные данные, но в обратном порядке..
На будующее - списком в С обычно называют набор из однотипных данных (структур), последовательно связанных между собой указателями.
1
doommer
1 / 1 / 0
Регистрация: 17.08.2010
Сообщений: 22
29.08.2010, 16:21  [ТС] #20
Здравствуйте, Будда)

Я нашел мааааленькую ошибочку)) В этой программульке функция меняет данную строку, должна ее не трогать, а просто выводить новую строку...
Перепишите пожалуйста)
0
29.08.2010, 16:21
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.08.2010, 16:21

list. Cоздать список из результатов(с массивами), а потом просмотреть весь список
Подскажите пожалуйста как мне создать список из моих результатов(с массивами)...

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

Создать список, после каждого отрицательного числа вставить в список 0
задание такое, создать список, после каждого отрицательного числа вставить в...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

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