Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
Utkin53
0 / 0 / 0
Регистрация: 18.05.2013
Сообщений: 25
1

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

18.05.2013, 21:14. Просмотров 513. Ответов 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
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 ();
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.05.2013, 21:14
Ответы с готовыми решениями:

Динамический массив и указатель на указатель
Спасибо за внимание) Задача такова: нужно удалить элемент по индексу, при этом...

Динамический массив и указатель
Всем привет. Пытаюсь понять тему динамических массивов. Прошу помочь...

Указатель на динамический массив
Как сделать указатель на размер двухмерного динамического массива? Пробовал int...

Указатель на двухмерный динамический массив
Друзья, нужна Ваша помощь! Создаю одномерный динамический, создаю указатель на...

Умный указатель и динамический массив
Здравствуйте! Есть проблема со следующим заданием. Есть класс умного указателя,...

13
alsav22
5442 / 4837 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
18.05.2013, 21:47 2
begin, last объявите глобально.
0
Utkin53
0 / 0 / 0
Регистрация: 18.05.2013
Сообщений: 25
18.05.2013, 21:57  [ТС] 3
В этом случае теряется begin, ещё в функции add
0
alsav22
5442 / 4837 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
18.05.2013, 22:08 4
Цитата Сообщение от Utkin53 Посмотреть сообщение
В этом случае теряется begin, ещё в функции add
Как он может потеряться, если объявлен глобально?

Добавлено через 25 секунд
Покажите, как делаете.
0
MrCold
861 / 759 / 174
Регистрация: 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 ()
0
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 ();
}
и программа благополучно вылетает
0
alsav22
5442 / 4837 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
18.05.2013, 22:23 7
Если объявили указатели глобально, то не нужно ничего передавать в add() и ничего возвращать из неё.
0
Utkin53
0 / 0 / 0
Регистрация: 18.05.2013
Сообщений: 25
18.05.2013, 22:26  [ТС] 8
MrCold

я полагаю, это указатели,без которых функции внутри main не работают
0
MrCold
861 / 759 / 174
Регистрация: 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()
0
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
Дело в том, что в данном случае указатели нужны, без них функции даже с объявлением глобальных переменных не работают
0
alsav22
5442 / 4837 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
18.05.2013, 22:47 11
begin замените, например, на first, там конфликт имён.

Добавлено через 47 секунд
Цитата Сообщение от Utkin53 Посмотреть сообщение
Дело в том, что в данном случае указатели нужны, без них функции даже с объявлением глобальных переменных не работают
Ничего там не нужно. Нужно код нормально писать.
0
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, передать соответствующие функции?
0
alsav22
5442 / 4837 / 831
Регистрация: 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;
}
1
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 ();
}
0
19.05.2013, 07:54
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.05.2013, 07:54

Классы, указатель на динамический массив
Здравствуйте, Подскажите пожалуйста, в чем моя ошибка, у меня есть класс...

Нужно сделать указатель на динамический двумерний массив
Есть динамический массив, псевдо-код: #include &lt;iostream&gt; using namespace...

Не работает динамический массив в классе: что раньше, указатель или размер?
Подскажите пожалуйста где ошибка class arar { int*arr, size; public:...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

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