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

Связанный лист - C++

Восстановить пароль Регистрация
 
__bool
 Аватар для __bool
284 / 225 / 6
Регистрация: 13.06.2010
Сообщений: 744
18.03.2011, 10:46     Связанный лист #1
Здравствуйте, не могу вывести все элементы связанного списка.. генерация проходит, а вывод нет..

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
#include <iostream>
using namespace std;
 
class Node
{
public:
        Node(){}
        ~Node(){}
        Node *Next;
        void SetValue(value){itsValue = value;}
        int GetValue()const {return itsValue;}
protected:
        int itsValue;
};
 
void ListGen(Node *temp, int i);
void ListOut(Node *temp);
 
int main()
{
        Node *First = new Node;
        
        ListGen(First,10);
        ListOut(First);
        getchar();
        return 0;
}
 
void ListGen(Node *temp, int i)
{
        if (i!=0)
        {
        temp->SetValue(i);
        temp->Next=new Node;
        temp=temp->Next;
        --i;
        ListGen(temp,i);
        }
        temp->Next=NULL;
}
 
void ListOut(Node *temp)
{
        if (temp!=NULL)
        {
        cout << temp->GetValue() << endl;
        temp = temp->Next;
        ListOut(temp);
        }
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.03.2011, 10:46     Связанный лист
Посмотрите здесь:

C++ Однонаправленный связанный список
Связанный двусторонний список C++
C++ Связанный список.
C++ Связанный список
Связанный список C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Dexter
 Аватар для Dexter
284 / 144 / 16
Регистрация: 13.10.2009
Сообщений: 164
18.03.2011, 11:16     Связанный лист #2
C++
1
2
3
4
5
6
7
8
9
10
11
12
void ListGen(Node *temp, int i)
{
    if (i!=0)
    {
        temp->SetValue(i);
        temp->Next=new Node;
        temp=temp->Next;
        --i;
        ListGen(temp,i);
    }
    else temp->Next=NULL;
}
Иначе, без else, у вас набор несвязанных узлов. Дальше думаю разберетесь (там в 0 элементе получите неинициализированную переменную)
__bool
 Аватар для __bool
284 / 225 / 6
Регистрация: 13.06.2010
Сообщений: 744
18.03.2011, 12:10  [ТС]     Связанный лист #3
Отлично.. благодарю за помощь.. поправил вывод и все норм..
Только не пойму почему не работало..

Ведь каждый раз условие выполнялось if (i!=0) кроме последнего раза..странно...
Dexter
 Аватар для Dexter
284 / 144 / 16
Регистрация: 13.10.2009
Сообщений: 164
18.03.2011, 13:04     Связанный лист #4
Объясню почему не работало:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void ListGen(Node *temp, int i)
{
        if (i!=0)
        {
                temp->SetValue(i);//присвоили значение
                temp->Next=new Node;//создали новый под-узел
                temp=temp->Next;//приняли значение под-узла
                --i;
                ListGen(temp,i);//делаем все тоже самое для под-узла
        }
        temp->Next=NULL;//а тут под-узел нашего под-узла становится NULL(ведь выполняется всегда),
                  //то есть остался главный узел и его под-узел, а дальше ссылка на NULL,
                 //потому на экран должно было выводить только 2 значения
}
__bool
 Аватар для __bool
284 / 225 / 6
Регистрация: 13.06.2010
Сообщений: 744
18.03.2011, 13:10  [ТС]     Связанный лист #5
Извиняюсь, но все равно не пойму.. индекс "i" ведь 10 раз не равен нулю, значит постоянно доходя до строчки ListGen(temp,i) все происходит с самого начала функции.. как же на 3 раз происходит выход из рекурсии?
Dexter
 Аватар для Dexter
284 / 144 / 16
Регистрация: 13.10.2009
Сообщений: 164
18.03.2011, 13:36     Связанный лист #6
Выход не происходит, я же с самого начала написал:
Иначе, без else, у вас набор несвязанных узлов.
Попытаюсь на примере показать:

Добавил вывод, чтобы было понятнее:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void ListGen(Node *temp, int i)
{
    if (i!=0)
    {
        temp->SetValue(i);
        temp->Next=new Node;
        cout<<"Node: "<<temp<<" Node->Next:"<<temp->Next<<" Value:"<<temp->GetValue()<<endl;
        temp=temp->Next;
        --i;
        ListGen(temp,i);
    }
    temp->Next=NULL;//Выполняется уже после того, как рекурсия завершилась
    cout<<"On exit Node: "<<temp<<" Node->Next:"<<temp->Next<<" Value:"<<temp->GetValue()<<endl;
}
Результат:
Node: 004D1418 Node->Next:004D1450 Value:10
Node: 004D1450 Node->Next:004D7E28 Value:9
Node: 004D7E28 Node->Next:004D7E60 Value:8
Node: 004D7E60 Node->Next:004D7E98 Value:7
Node: 004D7E98 Node->Next:004D7ED0 Value:6
Node: 004D7ED0 Node->Next:004D7F08 Value:5
Node: 004D7F08 Node->Next:004D7F58 Value:4
Node: 004D7F58 Node->Next:004D7F90 Value:3
Node: 004D7F90 Node->Next:004D7FC8 Value:2
Node: 004D7FC8 Node->Next:004D8000 Value:1
On exit Node: 004D8000 Node->Next:00000000 Value:-842150451
On exit Node: 004D8000 Node->Next:00000000 Value:-842150451
On exit Node: 004D7FC8 Node->Next:00000000 Value:1
On exit Node: 004D7F90 Node->Next:00000000 Value:2
On exit Node: 004D7F58 Node->Next:00000000 Value:3
On exit Node: 004D7F08 Node->Next:00000000 Value:4
On exit Node: 004D7ED0 Node->Next:00000000 Value:5
On exit Node: 004D7E98 Node->Next:00000000 Value:6
On exit Node: 004D7E60 Node->Next:00000000 Value:7
On exit Node: 004D7E28 Node->Next:00000000 Value:8
On exit Node: 004D1450 Node->Next:00000000 Value:9
10
9
Как мы видим в результате - все узлы создаются (рекурсивно все подряд), но, при выходе с функции, а это после того как рекурсия отработает, то для каждого узла Node->Next становится нулем, также видно что на выходе у нас не обнуляется только первый элемент (значение 10), почему я писал выше. В результате у вас остается first и ссылка на его узел, а вот у его узла уже ссылка на 0. А остальные остаются, просто вы с ними не связаны никак.

Блок схему лень рисовать, но если надо, можно попробовать))
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.03.2011, 14:06     Связанный лист
Еще ссылки по теме:

Связанный список C++
C++ Связанный список
C++ Связанный список (ООП)

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

Или воспользуйтесь поиском по форуму:
__bool
 Аватар для __bool
284 / 225 / 6
Регистрация: 13.06.2010
Сообщений: 744
18.03.2011, 14:06  [ТС]     Связанный лист #7
Спасибо огромное!! С рекурсией редко работаю, не учел, что когда функция вызывает саму себя, то потом, после выполнения всех итераций, она как бы обратно приходит к остальной своей части..
А я отнесся к рекурсии как к простому циклу...
Спасибо еще раз!
Yandex
Объявления
18.03.2011, 14:06     Связанный лист
Ответ Создать тему
Опции темы

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