Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
0 / 0 / 0
Регистрация: 21.09.2015
Сообщений: 23
1

Вывод списка, LIFO и FIFO

21.09.2015, 22:30. Показов 1201. Ответов 9
Метки нет (Все метки)

Программа создает два списка: один с числами, второй эти числа делит на четные и нечетные.
Но при создании или выводе второго списка нарушается последовательность чисел из первого списка.
Например:
первый список 1 2 3 4 5 6 7 8 9 10
второй список 10 8 6 4 2 1 3 5 7 9
а должен второй список быть таким 2 4 6 8 10 1 3 5 7 9

Т.е. при обработке числа считываются с права налево, а должно наоборот.
Вот код создания второго списка:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
ilist* list_move(ilist*& head, bool(*com)(int)){
    ilist *p, *h, *t, *m;
    if (head == NULL)
        return NULL;
 
    h = t = p = head;
    if ((p = p->next) != head){
        do {
            m = p;
            if ((*com)(m->data)){
                p = p->next;
                m->next = h;
                h = m;
            }
            else {
                t = t->next = m;
                p = p->next;
            }
        } while (p != head);
    }
    head = t->next = NULL;
    return h;
}
Вот выводы списков:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
ilist* cl;
    list_insert(cl, 20, 0);
 
    const ilist* p = cl;
    cout << "Список с рандомными числами:" << endl;
    
    do {
        cout << p->data << ' ';
        p = p->next;
    } while (p != cl);
    cout << endl << endl;
 
    cout <<"Новый список:"<< endl;
 
    ilist* ls = list_move(cl, &compare);
    for (const ilist* i = ls; i != NULL; i = i->next)
        cout << i->data<< ' ';
    cout << endl << endl;
    list_clear(ls);
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.09.2015, 22:30
Ответы с готовыми решениями:

1) сделать сортировку (любой) 2) защита по вводу символа 3) вывод LIFO, FIFO 4) лимит отображаемых симв.)
За основу брать этот пример . Не получается у меня(( #include &lt;iostream&gt; #include &lt;stdio.h&gt; ...

Множество, LIFO, FIFO
Добрый день. Дали список задач для курсача, но не могу понять что требуется в некоторых из них......

Список FIFO и LIFO
#include &lt;cstdlib&gt; #include &lt;iostream&gt; using namespace std; struct struc{ char a; ...

Реализация стека FIFO и LIFO
Собственно, если у кого-нить будет время посмотреть мои реализации FIFO и LIFO стеков, и высказать...

9
...
1799 / 1264 / 934
Регистрация: 12.02.2013
Сообщений: 2,058
22.09.2015, 08:26 2
AlexandrShestak, как-то странно, сказано о двух списках, а в реализации работаете с одним. Так вам что нужно, на базе первого сделать второй, или просто изменить последовательность узлов в первом списке?
0
0 / 0 / 0
Регистрация: 21.09.2015
Сообщений: 23
22.09.2015, 13:20  [ТС] 3
anmartex, на базе первого сделать второй, и вывести его в нормальном порядке. Может весь код скинуть?
0
2605 / 2195 / 234
Регистрация: 03.07.2012
Сообщений: 7,916
Записей в блоге: 1
22.09.2015, 14:53 4
А не проще самому отладчиком просмотреть, что и как [не] работает?
0
...
1799 / 1264 / 934
Регистрация: 12.02.2013
Сообщений: 2,058
22.09.2015, 17:23 5
Моя реализация функции:
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
ilist* list_move(ilist*& head, bool (*com)(int)) {
    ilist* a = NULL, * tail_a, * b = NULL, * tail_b;
    while (head) {
        // Отделяем очередной верхний узел
        ilist* node = head;
        head = head->next;
        node->next = NULL;
 
        // Определяем к какому списку будем добавлять узел
        bool is_com = com(node->data);
        ilist*& c = is_com ? a : b;
        ilist*& tail_c = is_com ? tail_a : tail_b;
 
        // Если в списке нет ни одного элемент то делаем
        // его первым и хвостовым
        if (c == NULL) {
            c = tail_c = node;
        }
        // Добавляем в хвост отделённый узел. Хвостом соответственно
        // становится добавленный узел
        else {
            tail_c->next = node;
            tail_c = node;
        }
    }
    head = a;
    if (head == NULL) {
        head = b;
    }
    else {
        tail_a->next = b;
    }
 
    return head;
}
Результат выполнения

Добавлено через 5 минут
Ой, это же изменение исходного!
1
0 / 0 / 0
Регистрация: 21.09.2015
Сообщений: 23
22.09.2015, 17:30  [ТС] 6
anmartex, выдает:
Ошибка 1 error C4703: используется потенциально неинициализированная локальная переменная-указатель "tail_a"
0
...
1799 / 1264 / 934
Регистрация: 12.02.2013
Сообщений: 2,058
22.09.2015, 17:32 7
Лучший ответ Сообщение было отмечено AlexandrShestak как решение

Решение

Исправляюсь:
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
ilist* list_move(const ilist* head, bool (*com)(int)) {
    ilist* a = NULL, * tail_a, * b = NULL, * tail_b;
    for (; head; head = head->next) {
        // Копируем верхний узел
        ilist* node = new ilist;
        node->data = head->data;
        node->next = NULL;
 
        // Определяем к какому списку будем добавлять узел
        bool is_com = com(node->data);
        ilist*& c = is_com ? a : b;
        ilist*& tail_c = is_com ? tail_a : tail_b;
 
        // Если в списке нет ни одного элемент то делаем
        // его первым и хвостовым
        if (c == NULL) {
            c = tail_c = node;
        }
        // Добавляем в хвост отделённый узел. Хвостом соответственно
        // становится добавленный узел
        else {
            tail_c->next = node;
            tail_c = node;
        }
    }
    if (a == NULL) {
        a = b;
    }
    else {
        tail_a->next = b;
    }
 
    return a;
}
Результат выполнения

Добавлено через 1 минуту
Цитата Сообщение от AlexandrShestak Посмотреть сообщение
anmartex, выдает:
Ошибка 1 error C4703: используется потенциально неинициализированная локальная переменная-указатель "tail_a"
Так в чём же проблема? Инициализируйте.
C++
1
ilist* a = NULL, * tail_a = NULL, * b = NULL, * tail_b = NULL;
0
0 / 0 / 0
Регистрация: 21.09.2015
Сообщений: 23
22.09.2015, 17:41  [ТС] 8
anmartex, теперь выдает это:
Ошибка 1 error LNK2019: ссылка на неразрешенный внешний символ "struct ilist * __cdecl list_move(struct ilist * &,bool (__cdecl*)(int))" (?list_move@@YAPAUilist@@AAPAU1@P6A_NH@Z@Z) в функции _main

Ошибка 2 error LNK1120: неразрешенных внешних элементов: 1

Неправильный вывод в main'е?
0
...
1799 / 1264 / 934
Регистрация: 12.02.2013
Сообщений: 2,058
22.09.2015, 17:53 9
AlexandrShestak, я не силён в мелкомягком компиляторе, но смею предположить, что у вас видать прототип функции указан как:
C++
1
ilist* list_move(ilist*& head, bool (*com)(int))
У меня же функция имеет немного другой вид:
C++
1
ilist* list_move(const ilist* head, bool (*com)(int))
Укажите правильный прототип, или приведите мою функцию согласно вашему объявлению.
0
0 / 0 / 0
Регистрация: 21.09.2015
Сообщений: 23
22.09.2015, 18:00  [ТС] 10
anmartex, разобрался. Спасибо!
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.09.2015, 18:00

Посчитать прибыль от сделок используя FIFO и LIFO
Здравствуйте, Нужно написать небольшую програмку для подсчета прибыли после проведения...

Реализовать пользовательские классы - дек, стек (LIFO), очередь (FIFO) на базе класса list библиотеки STL
Создать пользовательские классы - дек, стек (LIFO), очередь (FIFO) на базе класса list библиотеки...

Создание, просмотр и удаление элементов списка, организованного по принципу LIFO
Что делать? Программа просит идентификатор true, false. #include &quot;stdafx.h&quot; #include &lt;iostream&gt;...

Создать класс, для хранения стека чисел – списка, организованного по принципу LIFO
Создать класс, для хранения стека чисел – списка, организованного по принципу LIFO (последним...


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

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

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