С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
34 / 10 / 2
Регистрация: 20.02.2016
Сообщений: 1,607
1

Как вывести данные из связного списка в порядке обратном введению?

01.04.2017, 10:34. Показов 2050. Ответов 5
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго времени суток!
Решал задачу по созданию связного списка. То есть, в память вносятся данные и ссылка на следующую ячейку памяти, в которую тоже вносятся данные и очередная ссылка и т. д. Память работает как стек, данные вначале вносят , потом выводят. Первыми выводят те, что были введены последними.
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
#include<iostream>
using namespace std;
struct link
{
    int d;
    link*prt;
};
class list
{
private:
    link*fst;
public:
    list(){ fst = NULL; }
    void g_add(int dd)
    {
        link*s1 = new link;
        s1->d = dd;
        s1->prt = fst;
        fst = s1;
    }
    void g_out()
    {
        link*curr = fst;
        while (curr)
        {
            cout << curr->d << endl;
            curr = curr->prt;
            
        }
            }
};
int main()
{
    list l1;
    l1.g_add(115);
    l1.g_add(124);
    l1.g_add(365);
    l1.g_add(85);
    l1.g_out();
    system("pause");
    return 0;
}
Как можно сделать так (если, вообще, это можно), чтобы выводились первыми те, которые были занесены первыми. Именно, выводились, а не заносились и в обратном порядке сохранялись в памяти.
то есть код ниже нужно поменять на какой-то другой. Можно ли это в принципе вообще сделать?
C++
1
2
3
4
5
6
7
link*curr = fst;
        while (curr)
        {
            cout << curr->d << endl;
            curr = curr->prt;
            
        }
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.04.2017, 10:34
Ответы с готовыми решениями:

Вывести элементы односвязного списка в обратном порядке
подскажите, пожалуйста, как вывести элементы односвязного списка в обратном порядке?

Список: Вывести символы списка в обратном порядке.
Здравствуйте ,нужна помощь с задачей,третий день сижу - идей ноль. Вот условие: С клавиатуры...

Вывести на экран элементы списка в обратном порядке
Вывести на экран элементы списка в обратном порядке. Входные данные: N – количество элементов...

Вывести элементы хвоста списка в обратном порядке используя рекурсию
Доброго времени суток. Решаю задачу уже 2 дня и нечего не выходит. Необходимо написать рекурсивную...

5
1272 / 1029 / 470
Регистрация: 25.12.2016
Сообщений: 3,333
01.04.2017, 12:15 2
Цитата Сообщение от Fatmarmelad Посмотреть сообщение
Как можно сделать так (если, вообще, это можно), чтобы выводились первыми те, которые были занесены первыми.
А зачем? Стек он на то и стек, чтобы извлекать данные в определённом порядке. Если это нужно для целей отладки, то можно переписать данные в другой контейнер (например в обычный вектор), а затем выводить их в нужном порядке.

Добавлено через 2 минуты
Другой вариант - добавлять данные в другом порядке:
C++
1
2
3
4
link* s1 = new link;
s1->d = dd;
s1->prt = nullptr;
fst->prt = s1;
0
34 / 10 / 2
Регистрация: 20.02.2016
Сообщений: 1,607
08.10.2018, 21:25  [ТС] 3
Добрый день!
Подскажите, пожалуйста, как код ниже можно переписать так, чтобы значения в связном списке при введении попадали в его самое начало, а не в "хвост".
Я насколько осведомлён , решение очень простое, но не могу сам дойти. Ещё раз код ниже

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
#include<iostream>
using namespace std;
struct link
{
    int d;
    link*prt;
};
class list
{
private:
    link*fst;
public:
    list(){ fst = NULL; }
    void g_add(int dd)
    {
        link*s1 = new link;
        s1->d = dd;
        s1->prt = fst;
        fst = s1;
    }
    void g_out()
    {
        link*curr = fst;
        while (curr)
        {
            cout << curr->d << endl;
            curr = curr->prt;
            
        }
            }
};
int main()
{
    list l1;
    l1.g_add(115);
    l1.g_add(124);
    l1.g_add(365);
    l1.g_add(85);
    l1.g_out();
    system("pause");
    return 0;
}
0
296 / 125 / 106
Регистрация: 30.10.2015
Сообщений: 690
08.10.2018, 21:34 4
Fatmarmelad, у нового добавляемого элемента next должен указывать на голову, а голова должна стать этим новым элементом. Попробуйте.
0
34 / 10 / 2
Регистрация: 20.02.2016
Сообщений: 1,607
09.10.2018, 20:50  [ТС] 5
Написал я код, так чтобы данные выводились в том порядке, в котором вводились. Но, в связи со слабыми знаниями С++, не могу замкнуть нормально эту цепь, не хватает последнего штриха.
В конце цепи выводится объект с неинициализированными полями. Может ввести деструктор, срабатывающий при определённых условиях?
В последнем созданном объекте указателю хочу присвоить NULL. Но как сделать, чтобы по умолчанию указатель имел это значение?
Я пытался сделать это через конструктор(ниже), но это, как я понял не работает.
C++
1
list(){ first = new link; first->prt=NULL;}
В итоге программа выводит список в том порядке, как хотелось, но в конце выводится не инициализированная переменная, которую тоже не знаю, как удалить.
Помогите довести её до конца, пожалуйста.
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
#include<iostream>
using namespace std;
struct link
{
    int d;
    link*prt;
};
class list
{
private:
    link*first;
    link*last;
public:
    list(){ first = new link; last = first;}
    void g_add(int dd)
    {
        
        first->d = dd;
        first->prt = new link;
        first = first->prt;
    }
    void g_out()
    {
        link*curr = last;
        while (curr)
        {
            cout << curr->d<<endl ;
            curr = curr->prt;
        }
    }
};
int main()
{
    list ls;
    ls.g_add(1);
    ls.g_add(2);
    ls.g_add(3);
    ls.g_add(4);
    ls.g_out();
    return 0;
}
0
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
12.10.2018, 20:19 6
Лучший ответ Сообщение было отмечено Fatmarmelad как решение

Решение

Цитата Сообщение от Fatmarmelad Посмотреть сообщение
То есть, в память вносятся данные и ссылка на следующую ячейку памяти, в которую тоже вносятся данные и очередная ссылка и т. д. Память работает как стек, данные вначале вносят , потом выводят. Первыми выводят те, что были введены последними.
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
#include <iostream>
 
using namespace std;
 
struct link
{
    int d;
    link*prt;
};
 
class list
{
private:
    link * head;
 
public:
    list() 
        : head()
    { }
    void g_add(int dd)
    {
        link * lnk = new link{dd};
        
        lnk->prt = head;
        head = lnk;
    }
    void g_out()
    {
        link * curr = head;
        while(curr)
        {
            cout << curr->d<<endl ;
            curr = curr->prt;
        }
    }
};
int main()
{
    list ls;
    ls.g_add(1);
    ls.g_add(2);
    ls.g_add(3);
    ls.g_add(4);
    ls.g_out();
    return 0;
}
Добавлено через 8 минут
Цитата Сообщение от Fatmarmelad Посмотреть сообщение
Написал я код, так чтобы данные выводились в том порядке, в котором вводились. Но, в связи со слабыми знаниями С++, не могу замкнуть нормально эту цепь, не хватает последнего штриха.
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
#include <iostream>
 
struct link
{
    int    d;
    link * prt;
};
 
class list
{
private:
    link * last;
    link * first;
public:
    list() : first(), last()
    { }
    void g_add(int dd)
    {
        link * lnk = new link{dd};
        if(last)
        {
            last->prt = lnk;
        }
        else
        {
            first = lnk;
        }
        last = lnk;
    }
    void g_out()
    {
        link * curr = first;
        while(curr)
        {
            std::cout << curr->d << std::endl ;
            curr = curr->prt;
        }
    }
};
int main()
{
    list ls;
    ls.g_add(1);
    ls.g_add(2);
    ls.g_add(3);
    ls.g_add(4);
    ls.g_out();
    return 0;
}
1
12.10.2018, 20:19
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.10.2018, 20:19
Помогаю со студенческими работами здесь

Вывести числа обратном порядке, при этом переставив все цифры в каждом числе в обратном порядке
Добрый день. Не могу понять алгоритм решения данной задачи, помогите пожалуйста. Заданы пять...

Вывести числа в обратном порядке, при этом переставив все цифры в каждом числе в обратном порядке
Чтобы Вовочка не скучал на уроке информатики, Иван Иваныч специально для него к каждому уроку...

Найти элементы заданного списка, имеющиеся во втором списке, и вывести таковые в порядке обратном их размещению
Всем доброго времени суток. Есть у меня програма для роботы с числами в списках, а мне нужно...

Требуется скопировать данные из одного файла в другой, но в обратном порядке. Вывести на экран все результаты
Задание: Требуется скопировать данные из одного файла в другой, но в обратном порядке. Вывести на...

Удалить из списка все парные элементы и поместить их в конец списка в обратном порядке
Доброго времени суток, уважаемие форумчани, помогите Создать список L , элементами которого...

Удалить из списка все отрицательные элементы и поместить их в конец списка в обратном порядке
Пожалуста, помогите решить задачку: Составит программу, которая создает список L елементами...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru