Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
0 / 0 / 0
Регистрация: 18.05.2013
Сообщений: 25

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

18.05.2013, 21:14. Показов 919. Ответов 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
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
18.05.2013, 21:14
Ответы с готовыми решениями:

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

Указатель на динамический массив
Как сделать указатель на размер двухмерного динамического массива? Пробовал int *size_ptr = size, при условии, что size - константный...

Динамический массив и указатель
Всем привет. Пытаюсь понять тему динамических массивов. Прошу помочь разобраться в следующем: Есть код (пример): int num = 5;...

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

Добавлено через 25 секунд
Покажите, как делаете.
0
873 / 771 / 173
Регистрация: 11.01.2012
Сообщений: 1,942
18.05.2013, 22:15
Utkin53, What is it ?
C++
1
void main (sp *begin,sp *list,sp *last)
Наверно все же
C++
1
int main ()
0
0 / 0 / 0
Регистрация: 18.05.2013
Сообщений: 25
18.05.2013, 22:17  [ТС]
Как-то так
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
5499 / 4894 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
18.05.2013, 22:23
Если объявили указатели глобально, то не нужно ничего передавать в add() и ничего возвращать из неё.
0
0 / 0 / 0
Регистрация: 18.05.2013
Сообщений: 25
18.05.2013, 22:26  [ТС]
MrCold

я полагаю, это указатели,без которых функции внутри main не работают
0
873 / 771 / 173
Регистрация: 11.01.2012
Сообщений: 1,942
18.05.2013, 22:34
Цитата Сообщение от Utkin53 Посмотреть сообщение
MrCold
я полагаю, это указатели,без которых функции внутри main не работают
Да к черту указатели
сигнатура main должна быть такой
C++
1
int main(int argc, char * argv[])
или такой
C++
1
int main()
0
0 / 0 / 0
Регистрация: 18.05.2013
Сообщений: 25
18.05.2013, 22:42  [ТС]
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
5499 / 4894 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
18.05.2013, 22:47
begin замените, например, на first, там конфликт имён.

Добавлено через 47 секунд
Цитата Сообщение от Utkin53 Посмотреть сообщение
Дело в том, что в данном случае указатели нужны, без них функции даже с объявлением глобальных переменных не работают
Ничего там не нужно. Нужно код нормально писать.
0
0 / 0 / 0
Регистрация: 18.05.2013
Сообщений: 25
18.05.2013, 23:01  [ТС]
Пишу как могу
Например если сделать так?
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
5499 / 4894 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
19.05.2013, 05:09
Цитата Сообщение от 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
0 / 0 / 0
Регистрация: 18.05.2013
Сообщений: 25
19.05.2013, 07:54  [ТС]
Благодарю, я нашёл этот указатель (вернул значение 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
19.05.2013, 07:54
Помогаю со студенческими работами здесь

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

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

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

Нужно сделать указатель на динамический двумерний массив
Есть динамический массив, псевдо-код: #include &lt;iostream&gt; using namespace std; const int x = 10; int main() { ...

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


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru