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

Динамический список, беглый указатель - C++

Восстановить пароль Регистрация
 
Utkin53
0 / 0 / 0
Регистрация: 18.05.2013
Сообщений: 25
18.05.2013, 21:14     Динамический список, беглый указатель #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
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
104
105
106
107
#include <iostream>
#include <conio.h>
using namespace std;
struct sp
{
    int nomer;
    int versh[15];
    int kolvo;
    sp *up,*next;
};
sp *add () //объявление
{
    FILE *fi;
    int n,l,nm,kl=0,u=0,j; 
    static sp *begin=NULL,*last=NULL;//last-тот самый указатель на конец
    sp *list=NULL,*up=NULL;
    fi=fopen ("f_in.txt","rt");
    fscanf (fi,"%d",&n);
    for (l=0;l<n;l++)
    {
        list=new sp;
        if(begin==NULL)
        {
            begin=list;
        }
        list->up=up;
        fscanf (fi,"%d",&nm);
        list->nomer=nm;
        for (j=0;j<10;j++)
        {
            fscanf (fi,"%d",&u);
            if (u==-1)
                break;
            list->versh[j]=u;
            kl=kl+1;
        }
        list->kolvo=kl;
        kl=0;
        if(up!=NULL)
        {
            up->next=list;
        }
        up=list;
    }
    last=list;//здесь он ещё определён
    list->next=NULL;
    return begin;//примерно так я передал указатель на начало
}
 
void print (sp *begin,sp *list)//вывод списка
{
    int j;
    list=begin;
    while (list)
    {
        cout<<"\n nomer vershini "<<list->nomer<<"\tkolvo  "<<list->kolvo;
        cout<<"\tokrest ";
        for(j=0;j<list->kolvo;j++)
        {
            cout<<list->versh[j]<<" ";
        }
        list=list->next;
    }
}
sp* search (sp *begin,sp *list,sp *last) //функция, куда надо передать этот last
{
    sp *max=NULL;
    int maxi=0;
    list=begin;
    while (list)
    {
        if (list->kolvo>maxi)
        {
            max=list;
            maxi=list->kolvo;
        }
        list=list->next;
    }
    cout<<"\n max kolvo"<<max->kolvo;
    list=max;
        if(list==begin)
    {
        begin=list->next;
    }
    else
    {
        if (list!=last)
        {
        list=list->up;
        list->next=list->next->next;
        list->next->up=list;
        }
        else
        {
            last=list->up;
        }
    }
    return begin;
}
void main (sp *begin,sp *list,sp *last)
{
    begin=add ();//определение указателя на начало
    print (begin,list);
    begin=search (begin,list,last);
    print (begin,list);
    getch ();
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.05.2013, 21:14     Динамический список, беглый указатель
Посмотрите здесь:

Указатель на двухмерный динамический массив C++
Динамический массив и указатель на указатель C++
Нужно сделать указатель на динамический двумерний массив C++
Указатель на список в элементе списка C++
C++ Функция принимает указатель на динамический массив и возвращает его же, но без чисел полиндромов (читается с обоих сторон одинаково - 234432)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
18.05.2013, 21:47     Динамический список, беглый указатель #2
begin, last объявите глобально.
Utkin53
0 / 0 / 0
Регистрация: 18.05.2013
Сообщений: 25
18.05.2013, 21:57  [ТС]     Динамический список, беглый указатель #3
В этом случае теряется begin, ещё в функции add
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
18.05.2013, 22:08     Динамический список, беглый указатель #4
Цитата Сообщение от Utkin53 Посмотреть сообщение
В этом случае теряется begin, ещё в функции add
Как он может потеряться, если объявлен глобально?

Добавлено через 25 секунд
Покажите, как делаете.
MrCold
851 / 749 / 71
Регистрация: 11.01.2012
Сообщений: 1,942
18.05.2013, 22:15     Динамический список, беглый указатель #5
Utkin53, What is it ?
C++
1
void main (sp *begin,sp *list,sp *last)
Наверно все же
C++
1
int main ()
Utkin53
0 / 0 / 0
Регистрация: 18.05.2013
Сообщений: 25
18.05.2013, 22:17  [ТС]     Динамический список, беглый указатель #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
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
#include <iostream>
#include <conio.h>
using namespace std;
struct sp
{
    int nomer;
    int versh[15];
    int kolvo;
    sp *up,*next;
};
sp *begin=NULL,*last=NULL;//объявляю переменные
sp *add (sp *begin,sp *last) //объявление, загрузка переменных для работы
{
    FILE *fi;
    int n,l,nm,kl=0,u=0,j; 
    sp *list=NULL,*up=NULL;
    fi=fopen ("f_in.txt","rt");
    fscanf (fi,"%d",&n);
    for (l=0;l<n;l++)
    {
        list=new sp;
        if(begin==NULL)
        {
            begin=list;
        }
        list->up=up;
        fscanf (fi,"%d",&nm);
        list->nomer=nm;
        for (j=0;j<10;j++)
        {
            fscanf (fi,"%d",&u);
            if (u==-1)
                break;
            list->versh[j]=u;
            kl=kl+1;
        }
        list->kolvo=kl;
        kl=0;
        if(up!=NULL)
        {
            up->next=list;
        }
        up=list;
    }
    last=list;//здесь он ещё определён
    list->next=NULL;
    return begin;//примерно так я передал указатель на начало, возможно здесь проблема
}
 
void print (sp *begin,sp *list)//вывод списка
{
    int j;
    list=begin;
    while (list)
    {
        cout<<"\n nomer vershini "<<list->nomer<<"\tkolvo  "<<list->kolvo;
        cout<<"\tokrest ";
        for(j=0;j<list->kolvo;j++)
        {
            cout<<list->versh[j]<<" ";
        }
        list=list->next;
    }
}
sp* search (sp *begin,sp *list,sp *last) //функция, куда надо передать этот last
{
    sp *max=NULL;
    int maxi=0;
    list=begin;
    while (list)
    {
        if (list->kolvo>maxi)
        {
            max=list;
            maxi=list->kolvo;
        }
        list=list->next;
    }
    cout<<"\n max kolvo"<<max->kolvo;
    list=max;
        if(list==begin)
    {
        begin=list->next;
    }
    else
    {
        if (list!=last)
        {
        list=list->up;
        list->next=list->next->next;
        list->next->up=list;
        }
        else
        {
            last=list->up;
        }
    }
    return begin;
}
void main (sp *begin,sp *list,sp *last)
{
    begin=add (begin,last);//определение указателя на начало 
    print (begin,list);
    begin=search (begin,list,last);
    print (begin,list);
    getch ();
}
и программа благополучно вылетает
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
18.05.2013, 22:23     Динамический список, беглый указатель #7
Если объявили указатели глобально, то не нужно ничего передавать в add() и ничего возвращать из неё.
Utkin53
0 / 0 / 0
Регистрация: 18.05.2013
Сообщений: 25
18.05.2013, 22:26  [ТС]     Динамический список, беглый указатель #8
MrCold

я полагаю, это указатели,без которых функции внутри main не работают
MrCold
851 / 749 / 71
Регистрация: 11.01.2012
Сообщений: 1,942
18.05.2013, 22:34     Динамический список, беглый указатель #9
Цитата Сообщение от Utkin53 Посмотреть сообщение
MrCold
я полагаю, это указатели,без которых функции внутри main не работают
Да к черту указатели
сигнатура main должна быть такой
C++
1
int main(int argc, char * argv[])
или такой
C++
1
int main()
Utkin53
0 / 0 / 0
Регистрация: 18.05.2013
Сообщений: 25
18.05.2013, 22:42  [ТС]     Динамический список, беглый указатель #10
alsav22
при объявлении в глобальных переменных в add выдаёт ошибку, что begin не является однозначным
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
104
105
106
107
#include <iostream>
#include <conio.h>
using namespace std;
struct sp
{
    int nomer;
    int versh[15];
    int kolvo;
    sp *up,*next;
};
sp *begin=NULL,*last=NULL;//объявление
sp *add () 
{
    FILE *fi;
    int n,l,nm,kl=0,u=0,j; 
    sp *list=NULL,*up=NULL;
    fi=fopen ("f_in.txt","rt");
    fscanf (fi,"%d",&n);
    for (l=0;l<n;l++)
    {
        list=new sp;
        if(begin==NULL)
        {
            begin=list;
        }
        list->up=up;
        fscanf (fi,"%d",&nm);
        list->nomer=nm;
        for (j=0;j<10;j++)
        {
            fscanf (fi,"%d",&u);
            if (u==-1)
                break;
            list->versh[j]=u;
            kl=kl+1;
        }
        list->kolvo=kl;
        kl=0;
        if(up!=NULL)
        {
            up->next=list;
        }
        up=list;
    }
    last=list;//здесь он ещё определён
    list->next=NULL;
    return begin;//примерно так я передал указатель на начало
}
 
void print (sp *begin,sp *list)//вывод списка
{
    int j;
    list=begin;
    while (list)
    {
        cout<<"\n nomer vershini "<<list->nomer<<"\tkolvo  "<<list->kolvo;
        cout<<"\tokrest ";
        for(j=0;j<list->kolvo;j++)
        {
            cout<<list->versh[j]<<" ";
        }
        list=list->next;
    }
}
sp* search (sp *begin,sp *list,sp *last) //функция, куда надо передать этот last
{
    sp *max=NULL;
    int maxi=0;
    list=begin;
    while (list)
    {
        if (list->kolvo>maxi)
        {
            max=list;
            maxi=list->kolvo;
        }
        list=list->next;
    }
    cout<<"\n max kolvo"<<max->kolvo;
    list=max;
        if(list==begin)
    {
        begin=list->next;
    }
    else
    {
        if (list!=last)
        {
        list=list->up;
        list->next=list->next->next;
        list->next->up=list;
        }
        else
        {
            last=list->up;
        }
    }
    return begin;
}
void main (sp *begin,sp *list,sp *last)
{
    begin=add ();//определение указателя на начало
    print (begin,list);
    begin=search (begin,list,last);
    print (begin,list);
    getch ();
}
Добавлено через 1 минуту
MrCold
Дело в том, что в данном случае указатели нужны, без них функции даже с объявлением глобальных переменных не работают
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
18.05.2013, 22:47     Динамический список, беглый указатель #11
begin замените, например, на first, там конфликт имён.

Добавлено через 47 секунд
Цитата Сообщение от Utkin53 Посмотреть сообщение
Дело в том, что в данном случае указатели нужны, без них функции даже с объявлением глобальных переменных не работают
Ничего там не нужно. Нужно код нормально писать.
Utkin53
0 / 0 / 0
Регистрация: 18.05.2013
Сообщений: 25
18.05.2013, 23:01  [ТС]     Динамический список, беглый указатель #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
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
#include <iostream>
#include <conio.h>
using namespace std;
struct sp
{
    int nomer;
    int versh[15];
    int kolvo;
    sp *up,*next;
};
sp *last=NULL;//объявление этого указателя глобально
sp *add () //объявление
{
    FILE *fi;
    int n,l,nm,kl=0,u=0,j; 
    static sp *begin=NULL;//last-тот самый указатель на конец
    sp *list=NULL,*up=NULL;
    fi=fopen ("f_in.txt","rt");
    fscanf (fi,"%d",&n);
    for (l=0;l<n;l++)
    {
        list=new sp;
        if(begin==NULL)
        {
            begin=list;
        }
        list->up=up;
        fscanf (fi,"%d",&nm);
        list->nomer=nm;
        for (j=0;j<10;j++)
        {
            fscanf (fi,"%d",&u);
            if (u==-1)
                break;
            list->versh[j]=u;
            kl=kl+1;
        }
        list->kolvo=kl;
        kl=0;
        if(up!=NULL)
        {
            up->next=list;
        }
        up=list;
    }
    last=list;//здесь он ещё определён
    list->next=NULL;
    return begin;//примерно так я передал указатель на начало
}
 
void print (sp *begin,sp *list)//вывод списка
{
    int j;
    list=begin;
    while (list)
    {
        cout<<"\n nomer vershini "<<list->nomer<<"\tkolvo  "<<list->kolvo;
        cout<<"\tokrest ";
        for(j=0;j<list->kolvo;j++)
        {
            cout<<list->versh[j]<<" ";
        }
        list=list->next;
    }
}
sp* search (sp *begin,sp *list,sp *last) //функция, куда надо передать этот last
{
    sp *max=NULL;
    int maxi=0;
    list=begin;
    while (list)
    {
        if (list->kolvo>maxi)
        {
            max=list;
            maxi=list->kolvo;
        }
        list=list->next;
    }
    cout<<"\n max kolvo"<<max->kolvo;
    list=max;
        if(list==begin)
    {
        begin=list->next;
    }
    else
    {
        if (list!=last)
        {
        list=list->up;
        list->next=list->next->next;
        list->next->up=list;
        }
        else
        {
            last=list->up;
        }
    }
    return begin;
}
void main (sp *begin,sp *list,sp *last)
{
    begin=add ();//определение указателя на начало
    print (begin,list);
    begin=search (begin,list,last);
    print (begin,list);
    getch ();
}
Тогда каким образом, по аналогии с begin, передать соответствующие функции?
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
19.05.2013, 05:09     Динамический список, беглый указатель #13
Цитата Сообщение от Utkin53 Посмотреть сообщение
Пишу как могу
Это понятно. Тут многое неправильно, поэтому и не работает. Вот, например, загадочный указатель list, который передаётся в функции. Зачем нужено передавать этот указатель в функцию, если в функции ему сразу же присваивается некое значение? Нужен в функции указатель - создавайте его в функции. Так же, если нужны указатели в main(), то не передают их через параметры main(), а просто объявляют в самой main():
C++
1
2
3
4
5
6
7
8
9
10
11
int main()
{
    sp *begin, *list, *last;
    begin = add();
    print(begin,list);
    begin = search(begin, list, last);
    print(begin,list);
    
    getch ();
    return 0;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.05.2013, 07:54     Динамический список, беглый указатель
Еще ссылки по теме:

C++ Динамический массив и указатель
C++ Динамический список
C++ В функцию передается несколько целых чисел. Создать из всех параметров динамический массив и вернуть указатель

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

Или воспользуйтесь поиском по форуму:
Utkin53
0 / 0 / 0
Регистрация: 18.05.2013
Сообщений: 25
19.05.2013, 07:54  [ТС]     Динамический список, беглый указатель #14
Благодарю, я нашёл этот указатель (вернул значение last в функции print.)
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
sp* print (sp *begin,sp *list,sp *last)
{
    int j;
    list=begin;
    while (list)
    {
        cout<<"\n nomer vershini "<<list->nomer<<"\tkolvo  "<<list->kolvo;
        cout<<"\tokrest ";
        for(j=0;j<list->kolvo;j++)
        {
            cout<<list->versh[j]<<" ";
        }
        last=list;
        list=list->next;
    }
    return last;//вот он, беглец
}
//..............................
void main ()
{
    sp *begin=NULL,*list=NULL,*last=NULL;
    begin=add ();
    last=print (begin,list,last);//пойман!
    list=search (begin,list,last);
    print (begin,list,last);
    getch ();
}
Yandex
Объявления
19.05.2013, 07:54     Динамический список, беглый указатель
Ответ Создать тему
Опции темы

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