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

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

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

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

18.07.2013, 06:56. Просмотров 471. Ответов 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++
Собственно сам код. его действия: В главной функции tmain выполняется функция innfunc, а функция innfunc вызывает функцию innfunc1. ...

Указатели на структуры - C++
Подскажите в чем ошибка...Дело в том когда я в вожу в каждое поле по 1 значению все нормально выводит,но если при в вводе в поле я пишу два...

Структуры и указатели - C++
Задался парой вопросов. Возможно, уже где-то задавались, поэтому прошу прощения заранее. Ниже описана структура для однонаправленного...

Структуры и указатели - C++
Привет форумчане, столкнулся вот с такой вот задачкой на структуры: 1. Описать структуру с именем PRICE, содержащую следующие поля: -...

Указатели и структуры - C++
Здравия желаю. Подскажите пожалуйста каким образом осуществляется доступ к полю структуры, если оно является указателем?

Указатели на структуры - C++
type celltype = record elетеt: integer; next: ^celltype end; DICTIONARY = array of ^celltype; какой аналог этой записи...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
zer0mail
2332 / 1958 / 192
Регистрация: 03.07.2012
Сообщений: 7,021
Записей в блоге: 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
2332 / 1958 / 192
Регистрация: 03.07.2012
Сообщений: 7,021
Записей в блоге: 1
18.07.2013, 07:24 #4
То , что присвоено переменной из стека остается в стеке и на внешние переменные не влияет.
Надо писать комментарии, что должна делать функция. Понять по коду, особенно ошибочному, это затруднительно да и лень время тратить.
alsav22
5417 / 4813 / 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
2332 / 1958 / 192
Регистрация: 03.07.2012
Сообщений: 7,021
Записей в блоге: 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
5417 / 4813 / 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
5417 / 4813 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
18.07.2013, 08:04 #11
Цитата Сообщение от viktorius Посмотреть сообщение
да ссылки знаю, но ссылку на указатель на объявлял
В данном случае их объявлять не нужно, в функции указатели передаются по ссылке. Тогда всё, что происходит с указателями в функциях, будет происходить с указателями, объявленными в main().
zer0mail
2332 / 1958 / 192
Регистрация: 03.07.2012
Сообщений: 7,021
Записей в блоге: 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С или Бейсик-программистов"
alsav22
5417 / 4813 / 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;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.07.2013, 08:49
Привет! Вот еще темы с ответами:

Указатели и структуры - C++
Здравствуйте. Подскажите, пожалуйста, почему не меня среда ругается. error C2440: =: невозможно преобразовать &quot;Book *&quot; в...

Структуры и указатели на структуры - C++
Так ли я сделал? #include &lt;iostream&gt; struct S { int i; }; void f1(S*s1,int k=0){ s1-&gt;i=k;};

Указатели и динамические структуры данных - C++
Задание 1. Дан указатель P1 на вершину стека (если стек пуст, то P1 = nil). Из- влечь из стека все элементы и вывести их...

Указатели и динамические структуры данных - C++
В данный момент занимаюсь изучением динамических структур данных и указателей, и вот вот возник вопрос, есть ли разница изучать эту тему в...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
18.07.2013, 08:49
Ответ Создать тему
Опции темы

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