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

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

Войти
Регистрация
Восстановить пароль
 
viktorius
2 / 2 / 2
Регистрация: 24.02.2013
Сообщений: 105
#1

список (в программе обнуляются указатели на структуры) - C++

18.07.2013, 06:56. Просмотров 458. Ответов 12
Метки нет (Все метки)

здравствуйте помогите найти ошибку, при возврате указателя на структуру из функции в функцию майн он обнуляется, это меня сбивает с толку разве указатель не сохраняет значение это же всего лишь адрес на объект
вот код мною написанный


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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
#include<iostream>
using namespace std;
struct myst
{
    char name[10];
    int money;
    myst *next;
};
void print(myst *list)
{
    if(list==0)
        cout<<"not in the list of elements"<<endl;
    else
        while(list)
        {
            cout<<list->name<<endl
                <<list->money<<endl;
            list=list->next;
        }
}
myst *create_input(myst *list)
{
    list=new myst;
    list->next=0;
    cout<<"Enter the name and the amount of money"<<endl;
    cin>>list->name>>list->money;
    return list;
}
void create_list(myst *list,myst *beg,myst *end)
{
    list=create_input(list);
    beg=end=list;
    print(beg);
}
void first_list(myst *list,myst *beg,myst *end)
{
    list=create_input(list);
    list->next=beg;
    beg=0;
    beg=list;
    print(beg);
}
void last_list(myst *list,myst *beg,myst *end)
{
    list=create_input(list);
    end->next=list;
    end=0;
    end=list;
    print(beg);
}
int main()
{
    int n;
    char c=0;
    myst *list=0,*beg=0,*end=0;
    while(c!='0')
    {
        cout<<"press the action key"<<endl
        <<"exit '0'"<<endl
        <<"create a list '1'"<<endl
        <<"add an item to the top of the list '2'"<<endl
        <<"add an element to the end of the list '3'"<<endl;
        cin>>c;
        switch(c)
        {
        case '0':cout<<"the program is completed"<<endl;
            break;
        case '1':create_list(list,beg,end);
            break;
        case '2':first_list(list,beg,end);
            break;
        case '3':last_list(list,beg,end);
            break;
        case '4':;
        default: cout<<"mistake! Select a valid action"<<endl;
        }
    }
    return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.07.2013, 06:56     список (в программе обнуляются указатели на структуры)
Посмотрите здесь:

Указатели и динамические структуры данных C++
Указатели и динамические структуры данных C++
Указатели на структуры C++
C++ Указатели и структуры
C++ Структуры, содержащие указатели на самих себя
C++ Структуры и указатели
ассоциативный массив MAP хранящий указатели на векторы определенной структуры C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zer0mail
2321 / 1947 / 192
Регистрация: 03.07.2012
Сообщений: 6,970
Записей в блоге: 1
18.07.2013, 07:10     список (в программе обнуляются указатели на структуры) #2
Что значит "Он обнуляется"? Фукция вовращает указатель, но кому он присваивается?
viktorius
2 / 2 / 2
Регистрация: 24.02.2013
Сообщений: 105
18.07.2013, 07:20  [ТС]     список (в программе обнуляются указатели на структуры) #3
Цитата Сообщение от zer0mail Посмотреть сообщение
Что значит "Он обнуляется"? Фукция вовращает указатель, но кому он присваивается?
указателю list присваивается возвращенное значение а дальше возвращаюсь в main и там все три указателя равны 0
zer0mail
2321 / 1947 / 192
Регистрация: 03.07.2012
Сообщений: 6,970
Записей в блоге: 1
18.07.2013, 07:24     список (в программе обнуляются указатели на структуры) #4
То , что присвоено переменной из стека остается в стеке и на внешние переменные не влияет.
Надо писать комментарии, что должна делать функция. Понять по коду, особенно ошибочному, это затруднительно да и лень время тратить.
alsav22
5415 / 4811 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
18.07.2013, 07:29     список (в программе обнуляются указатели на структуры) #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
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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
#include<iostream>
using namespace std;
 
struct myst
{
    char name[10];
    int money;
    myst *next;
};
 
void print(myst *list)
{
    if(list==0)
        cout<<"not in the list of elements"<<endl;
    else
        while(list)
        {
            cout<<list->name<<endl
                <<list->money<<endl;
            list=list->next;
        }
}
 
void create_input(myst *&list)
{
    list=new myst;
    list->next=0;
    cout<<"Enter the name and the amount of money"<<endl;
    cin>>list->name>>list->money;
}
 
void create_list(myst *&list,myst *&beg,myst *&end)
{
    create_input(list);
    beg=end=list;
    print(beg);
}
 
void first_list(myst *&list,myst *&beg,myst *&end)
{
    create_input(list);
    list->next=beg;
    beg=0;
    beg=list;
    print(beg);
}
 
void last_list(myst *&list,myst *&beg,myst *&end)
{
    create_input(list);
    end->next=list;
    end=0;
    end=list;
    print(beg);
}
 
int main()
{
    int n;
    char c=0;
    myst *list=0,*beg=0,*end=0;
    while(c!='0')
    {
        cout<<"press the action key"<<endl
        <<"exit '0'"<<endl
        <<"create a list '1'"<<endl
        <<"add an item to the top of the list '2'"<<endl
        <<"add an element to the end of the list '3'"<<endl;
        cin>>c;
        switch(c)
        {
        case '0':cout<<"the program is completed"<<endl;
            break;
        case '1':create_list(list,beg,end);
            break;
        case '2':first_list(list,beg,end);
            break;
        case '3':last_list(list,beg,end);
            break;
        case '4':;
        default: cout<<"mistake! Select a valid action"<<endl;
        }
    }
    return 0;
}
viktorius
2 / 2 / 2
Регистрация: 24.02.2013
Сообщений: 105
18.07.2013, 07:36  [ТС]     список (в программе обнуляются указатели на структуры) #6
вот код с коментариями


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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
#include<iostream>//односвязный список
using namespace std;
struct myst
{
    char name[10];
    int money;
    myst *next;
};
void print(myst *list)//печать списка
{
    if(list==0)
        cout<<"not in the list of elements"<<endl;
    else
        while(list)
        {
            cout<<list->name<<endl
                <<list->money<<endl;
            list=list->next;
        }
}
myst *create_input(myst *list)//промежуточная ф. создание и ввод данных в элемент списока
{
    list=new myst;
    list->next=0;
    cout<<"Enter the name and the amount of money"<<endl;
    cin>>list->name>>list->money;
    return list;
}
void create_list(myst *list,myst *beg,myst *end)//создание первого элемента в списке
{
    list=create_input(list);
    beg=end=list;
    print(beg);
}
void first_list(myst *list,myst *beg,myst *end)//добавление элемента в начало списка
{
    list=create_input(list);
    list->next=beg;
    beg=0;
    beg=list;
    print(beg);
}
void last_list(myst *list,myst *beg,myst *end)//добавление элеммента в конец списка
{
    list=create_input(list);
    end->next=list;
    end=0;
    end=list;
    print(beg);
}
int main()
{
    int n;
    char c=0;
    myst *list=0,*beg=0,*end=0;
    while(c!='0')
    {
        cout<<"press the action key"<<endl
        <<"exit '0'"<<endl
        <<"create a list '1'"<<endl
        <<"add an item to the top of the list '2'"<<endl
        <<"add an element to the end of the list '3'"<<endl;
        //<<"remove one element '4'"<<endl;
        cin>>c;
        switch(c)
        {
        case '0':cout<<"the program is completed"<<endl;//выйти
            break;
        case '1':create_list(list,beg,end);//создание первого элемента в списке
            break;
        case '2':first_list(list,beg,end);//добавление элемента в начало списка
            break;
        case '3':last_list(list,beg,end);//добавление элеммента в конец списка
            break;
        //case '4':;//удалить 1 элемент
        default: cout<<"mistake! Select a valid action"<<endl;
        }
    }
    return 0;
}
Добавлено через 4 минуты
Цитата Сообщение от alsav22 Посмотреть сообщение
Если так:
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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
#include<iostream>
using namespace std;
 
struct myst
{
    char name[10];
    int money;
    myst *next;
};
 
void print(myst *list)
{
    if(list==0)
        cout<<"not in the list of elements"<<endl;
    else
        while(list)
        {
            cout<<list->name<<endl
                <<list->money<<endl;
            list=list->next;
        }
}
 
void create_input(myst *&list)
{
    list=new myst;
    list->next=0;
    cout<<"Enter the name and the amount of money"<<endl;
    cin>>list->name>>list->money;
}
 
void create_list(myst *&list,myst *&beg,myst *&end)
{
    create_input(list);
    beg=end=list;
    print(beg);
}
 
void first_list(myst *&list,myst *&beg,myst *&end)
{
    create_input(list);
    list->next=beg;
    beg=0;
    beg=list;
    print(beg);
}
 
void last_list(myst *&list,myst *&beg,myst *&end)
{
    create_input(list);
    end->next=list;
    end=0;
    end=list;
    print(beg);
}
 
int main()
{
    int n;
    char c=0;
    myst *list=0,*beg=0,*end=0;
    while(c!='0')
    {
        cout<<"press the action key"<<endl
        <<"exit '0'"<<endl
        <<"create a list '1'"<<endl
        <<"add an item to the top of the list '2'"<<endl
        <<"add an element to the end of the list '3'"<<endl;
        cin>>c;
        switch(c)
        {
        case '0':cout<<"the program is completed"<<endl;
            break;
        case '1':create_list(list,beg,end);
            break;
        case '2':first_list(list,beg,end);
            break;
        case '3':last_list(list,beg,end);
            break;
        case '4':;
        default: cout<<"mistake! Select a valid action"<<endl;
        }
    }
    return 0;
}
я новичек в с и с++ что значит *& просто первый раз вижу
zer0mail
2321 / 1947 / 192
Регистрация: 03.07.2012
Сообщений: 6,970
Записей в блоге: 1
18.07.2013, 07:42     список (в программе обнуляются указатели на структуры) #7
Сам проверить не можешь?
Кроме того, какой смысл в последовательностях типа:
beg=0;
beg=list;

Если первый раз видишь - читай учебники, разбирайся с тем, как передаются параметры, что такое указатели и ссылки. Метод изучения "Ну ее, теорию - лучше сяду и напишу программу" для С++ не прокатит...
viktorius
2 / 2 / 2
Регистрация: 24.02.2013
Сообщений: 105
18.07.2013, 07:49  [ТС]     список (в программе обнуляются указатели на структуры) #8
Цитата Сообщение от zer0mail Посмотреть сообщение
Сам проверить не можешь?
Кроме того, какой смысл в последовательностях типа:
beg=0;
beg=list;

Если первый раз видишь - читай учебники, разбирайся с тем, как передаются параметры, что такое указатели и ссылки. Метод изучения "Ну ее, теорию - лучше сяду и напишу программу" для С++ не прокатит...
list для манипуляций т.е. постоянно меняется а beg должен указывать на первый

читаю разбираюсь только в учебниках в общих чертах пишут, хорошо у Страуструпа написано, но у него эту операцию *& не втречал, я его учебник только на 30% прочитал, до этого Герберт Шилт краткий курс, погуглю, и на этом спасибо)
alsav22
5415 / 4811 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
18.07.2013, 07:50     список (в программе обнуляются указатели на структуры) #9
Цитата Сообщение от viktorius Посмотреть сообщение
я новичек в с и с++ что значит *& просто первый раз вижу
Ссылки знаете? Ссылка на указатель.
viktorius
2 / 2 / 2
Регистрация: 24.02.2013
Сообщений: 105
18.07.2013, 07:57  [ТС]     список (в программе обнуляются указатели на структуры) #10
Цитата Сообщение от alsav22 Посмотреть сообщение
Ссылки знаете? Ссылка на указатель.
да ссылки знаю, но ссылку на указатель на объявлял, почитаю побольше про это, ну вообще у меня цель со списками разобраться далее с деревьями
alsav22
5415 / 4811 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
18.07.2013, 08:04     список (в программе обнуляются указатели на структуры) #11
Цитата Сообщение от viktorius Посмотреть сообщение
да ссылки знаю, но ссылку на указатель на объявлял
В данном случае их объявлять не нужно, в функции указатели передаются по ссылке. Тогда всё, что происходит с указателями в функциях, будет происходить с указателями, объявленными в main().
zer0mail
2321 / 1947 / 192
Регистрация: 03.07.2012
Сообщений: 6,970
Записей в блоге: 1
18.07.2013, 08:09     список (в программе обнуляются указатели на структуры) #12
*& не операция.
X *Y означает, что Y указатель на объект типа X (X* Y нагляднее)
X &Y означает, что Y ссылка на объект типа X
X *&Y означает, что Y ссылка на объект, который указатель на X (X* &Y нагляднее)

Список книг есть в начале раздела - Липманн, Дейтел, Эккель, Страуструп, Лаптев (это только начало)
Лучше пробежаться по всем и понять, у кого что понятнее.

Но главное - понять для чего тебе С++ - для общего представления или для профессонального программирования. Для молодого, способного и настойчивого, желающим стать профессиональным программистом С++ будет очень полезен. Но это точно не самый простой путь для "WEB, 1С или Бейсик-программистов"
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.07.2013, 08:49     список (в программе обнуляются указатели на структуры)
Еще ссылки по теме:

C++ Указатели на структуры
C++ Указатели и структуры
Структуры и указатели C++
Указатели,нужно разобраться в программе C++
Почему не обнуляются элементы массива? (функции, массивы, указатели) C++

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

Или воспользуйтесь поиском по форуму:
alsav22
5415 / 4811 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
18.07.2013, 08:49     список (в программе обнуляются указатели на структуры) #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
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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
#include<iostream>
using namespace std;
 
struct myst
{
    char name[10];
    int money;
    myst *next;
};
 
void print(myst *list)
{
    if(list==0)
        cout<<"not in the list of elements"<<endl;
    else
        while(list)
        {
            cout<<list->name<<endl
                <<list->money<<endl;
            list=list->next;
        }
}
 
void create_input(myst **list)
{
    *list=new myst;
    (*list)->next=0;
    cout<<"Enter the name and the amount of money"<<endl;
    cin>>(*list)->name>>(*list)->money;
}
 
void create_list(myst **list,myst **beg,myst **end)
{
    create_input(list);
    *beg=*end=*list;
    print(*beg);
}
 
void first_list(myst **list,myst **beg,myst **end)
{
    create_input(list);
    (*list)->next=*beg;
    *beg=0;
    *beg=*list;
    print(*beg);
}
 
void last_list(myst **list,myst **beg,myst **end)
{
    create_input(list);
    (*end)->next=*list;
    *end=0;
    *end=*list;
    print(*beg);
}
 
int main()
{
    int n;
    char c=0;
    myst *list=0,*beg=0,*end=0;
    while(c!='0')
    {
        cout<<"press the action key"<<endl
        <<"exit '0'"<<endl
        <<"create a list '1'"<<endl
        <<"add an item to the top of the list '2'"<<endl
        <<"add an element to the end of the list '3'"<<endl;
        cin>>c;
        switch(c)
        {
        case '0':cout<<"the program is completed"<<endl;
            break;
        case '1':create_list(&list,&beg,&end);
            break;
        case '2':first_list(&list,&beg,&end);
            break;
        case '3':last_list(&list,&beg,&end);
            break;
        case '4':;
        default: cout<<"mistake! Select a valid action"<<endl;
        }
    }
    return 0;
}
Добавлено через 38 минут
Перед созданием новго списка, нужно освобождать память под старым:
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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
#include<iostream>
#include<cstdlib>
using namespace std;
 
struct myst
{
    char name[10];
    int money;
    myst *next;
};
 
void print(myst *list)
{
    if(list==0)
        cout<<"not in the list of elements"<<endl;
    else
        while(list)
        {
            cout<<list->name<<endl
                <<list->money<<endl;
            list=list->next;
        }
}
 
void delete_list(myst **list,myst **beg,myst **end)
{
    myst *temp = *list;
    while (*list)
    {
        temp = (*list) ->next;
        delete *list;
        *list = temp;
    }
    *list = *beg = *end = 0;
}
 
void create_input(myst **list)
{
    *list=new myst;
    (*list)->next=0;
    cout<<"Enter the name and the amount of money"<<endl;
    cin>>(*list)->name>>(*list)->money;
}
 
void create_list(myst **list,myst **beg,myst **end)
{
    if (*list != 0) delete_list(list, beg, end);
    create_input(list);
    *beg=*end=*list;
    print(*beg);
}
 
void first_list(myst **list,myst **beg,myst **end)
{
    create_input(list);
    (*list)->next=*beg;
    *beg=0;
    *beg=*list;
    print(*beg);
}
 
void last_list(myst **list,myst **beg,myst **end)
{
    create_input(list);
    (*end)->next=*list;
    *end=0;
    *end=*list;
    print(*beg);
}
 
int main()
{
    int n;
    char c=0;
    myst *list=0,*beg=0,*end=0;
    while(c!='0')
    {
        cout<<"press the action key"<<endl
        <<"exit '0'"<<endl
        <<"create a list '1'"<<endl
        <<"add an item to the top of the list '2'"<<endl
        <<"add an element to the end of the list '3'"<<endl;
        cin>>c;
        switch(c)
        {
        case '0':cout<<"the program is completed"<<endl;
            break;
        case '1':create_list(&list,&beg,&end);
            break;
        case '2':first_list(&list,&beg,&end);
            break;
        case '3':last_list(&list,&beg,&end);
            break;
        case '4':;
        default: cout<<"mistake! Select a valid action"<<endl;
        }
    }
    
    delete_list(&list,&beg,&end);
    
    system("pause");
    return 0;
}
Yandex
Объявления
18.07.2013, 08:49     список (в программе обнуляются указатели на структуры)
Ответ Создать тему
Опции темы

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