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

Двусвязные структуры - C++

Восстановить пароль Регистрация
 
auditseo
55 / 55 / 0
Регистрация: 10.03.2014
Сообщений: 73
25.04.2014, 18:28     Двусвязные структуры #1
Помогите разобарться:

1)Компилятор выдает ошибку в строке
C++
1
(*first)->pred = tmp;
, но не понимаю, почему...
2)И правильное ли я написал добавление элемента в двусвязный список? Легко ли будет при такой реализации сортировать и т.д.
3)И не могли бы немного пояснить как происходит передача указателей например тут
C++
1
(*first)->pred = tmp;
и в чем отличие от передаче по ссылке и зачем
C++
1
**first
указатель на указатель?


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
#include <iostream>
#include <cstring>
#include <ctime>
#include <dos.h>
#include <cstdio>
using namespace std;
struct Film{
    char name[20];
    char director[20];
    char mainActor[20];
    char country[3];
    short int yearOut;
    unsigned int budget;
    unsigned int cashDues;
    float rating;
    Film *next, *pred;
};
 
void inputFilm(Film **first)
{
    Film *tmp = new Film;
    cout << "Vvedi nazvanie filma:\n";
    cin >> tmp->name;
    cout << "Vvedi nazvanie rezhissera:\n";
    cin >> tmp->director;
    cout << "Vvedi glavnogo aktera:\n";
    cin >> tmp->mainActor;
    cout << "Vvedi stranu vypuska filma:\n";
    cin >> tmp->country;
    cout << "Vvedi god vypuska:\n";
    cin >> tmp->yearOut;
    cout << "Vvedi bydget:\n";
    cin >> tmp->budget;
    cout << "Vvedi kassovye sbory:\n";
    cin >> tmp->cashDues;
    cout << "Vvedi reyting filma:\n";
    cin >> tmp->rating;
    (*first)->pred = tmp;
    tmp->next = *first;
    tmp->pred = 0;    
    *first = tmp;
}
 
void main()
{
    Film *first = NULL;
    char menuItem;
    do{
        cout<<"Vyberite odin iz punktov menu:\n";
        cout<<"0. Vyhod.\n";
        cout<<"\nRabota so spiskom:\n";
        cout<<"1. Dobavit' nivyy element v spisok.\n";
        cout<<"2. Prosmotr vsego spiska.\n";
        cout<<"3. Udalenie elementa iz spiska po parametry.\n";
        cout<<"4. Udalenie spiska.\n";
        cout<<"5. Vygruzit' spisok v fail.\n";
        cout<<"\nStatistika:\n";
        cout<<"6. Sredniy budget vseh filmov.\n";
        cout<<"7. Samyy neudachnyy film po versii BVT-11.\n";
        cout<<"8. Film s naibol'shim i naimen'shim reytimgom.\n";
        cout<<"9. Film s naibol'shim i naimen'shim bydzhetom.\n";
        cout<<"10. Film s naibol'shim i naimen'shim kassovym sborom.\n";
        cout<<'>';
        cin>>menuItem;  
        switch (menuItem)
        {
        case '1' :
            system("cls");
            inputFilm(&first);
            break;
 
        }
        system("cls");
    }
    while (menuItem != '0');
}
Добавлено через 34 минуты
В чем главная ошибка при передаче указателя на первый элемент?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.04.2014, 18:28     Двусвязные структуры
Посмотрите здесь:

ДВУСВЯЗНЫЕ СПИСКИ C++
C++ ДВУСВЯЗНЫЕ СПИСКИ!!!
двусвязные списки C++
Двусвязные списки C++
Двусвязные списки в с++ C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zer0mail
2187 / 1870 / 187
Регистрация: 03.07.2012
Сообщений: 6,650
Записей в блоге: 1
25.04.2014, 18:41     Двусвязные структуры #2
Цитата Сообщение от auditseo Посмотреть сообщение
(*first)->pred = tmp;
Так не правильно.
Надо либо (*first).pred=tmp либо эквивалентное: first->pred=tmp;

Также неверно tmp->next = *first;
слева указатель на объект, справа сам объект.

Как-то ТС щедро расставляет звездочки...
d_shablov
0 / 0 / 0
Регистрация: 25.04.2014
Сообщений: 3
25.04.2014, 18:41     Двусвязные структуры #3
Я тоже не понимаю зачем вы сделали указатель на указатель. Достаточно и простого обычного указателя.

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
#include <iostream>
#include <cstring>
#include <ctime>
#include <dos.h>
#include <cstdio>
using namespace std;
 
struct Film{
    char name[20];
    char director[20];
    char mainActor[20];
    char country[3];
    short int yearOut;
    unsigned int budget;
    unsigned int cashDues;
    float rating;
    Film *next, *pred;
};
 
void inputFilm(Film *first)
{
    Film *tmp = new Film;
    cout << "Vvedi nazvanie filma:\n";
    cin >> tmp->name;
    cout << "Vvedi nazvanie rezhissera:\n";
    cin >> tmp->director;
    cout << "Vvedi glavnogo aktera:\n";
    cin >> tmp->mainActor;
    cout << "Vvedi stranu vypuska filma:\n";
    cin >> tmp->country;
    cout << "Vvedi god vypuska:\n";
    cin >> tmp->yearOut;
    cout << "Vvedi bydget:\n";
    cin >> tmp->budget;
    cout << "Vvedi kassovye sbory:\n";
    cin >> tmp->cashDues;
    cout << "Vvedi reyting filma:\n";
    cin >> tmp->rating;
 
    if (first == NULL)
    {
        first = tmp;
    }
    else
    {
        Film *t = first;
        while (t->next != NULL)
        {
             t = t->next;
        }
        t->next = tmp;
        tmp->pred = t;
    }
}
 
void main()
{
    Film *first = NULL;
    char menuItem;
    do{
        cout<<"Vyberite odin iz punktov menu:\n";
        cout<<"0. Vyhod.\n";
        cout<<"\nRabota so spiskom:\n";
        cout<<"1. Dobavit' nivyy element v spisok.\n";
        cout<<"2. Prosmotr vsego spiska.\n";
        cout<<"3. Udalenie elementa iz spiska po parametry.\n";
        cout<<"4. Udalenie spiska.\n";
        cout<<"5. Vygruzit' spisok v fail.\n";
        cout<<"\nStatistika:\n";
        cout<<"6. Sredniy budget vseh filmov.\n";
        cout<<"7. Samyy neudachnyy film po versii BVT-11.\n";
        cout<<"8. Film s naibol'shim i naimen'shim reytimgom.\n";
        cout<<"9. Film s naibol'shim i naimen'shim bydzhetom.\n";
        cout<<"10. Film s naibol'shim i naimen'shim kassovym sborom.\n";
        cout<<'>';
        cin>>menuItem;  
        switch (menuItem)
        {
        case '1' :
            system("cls");
            inputFilm(first);
            break;
 
        }
        system("cls");
    }
    while (menuItem != '0');
}
auditseo
55 / 55 / 0
Регистрация: 10.03.2014
Сообщений: 73
25.04.2014, 19:07  [ТС]     Двусвязные структуры #4
Цитата Сообщение от zer0mail Посмотреть сообщение
Так не правильно.
Надо либо (*first).pred=tmp либо эквивалентное: first->pred=tmp;
Также неверно tmp->next = *first;
слева указатель на объект, справа сам объект.
Как-то ТС щедро расставляет звездочки...
Согласен, но немного переделав, программа нормально работает, привожу код:

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
#include <iostream>
#include <cstring>
#include <ctime>
#include <dos.h>
#include <cstdio>
using namespace std;
struct Film{
    char name[20];
    char director[20];
    char mainActor[20];
    char country[20];
    short int yearOut;
    unsigned int budget;
    unsigned int cashDues;
    float rating;
    Film *next, *pred;
} *first = NULL;
 
void inputFilm(Film **first)
{
    Film *tmp = new Film;
    cout << "Vvedi nazvanie filma:\n";
    cin >> tmp->name;
    cout << "Vvedi nazvanie rezhissera:\n";
    cin >> tmp->director;
    cout << "Vvedi glavnogo aktera:\n";
    cin >> tmp->mainActor;
    cout << "Vvedi stranu vypuska filma:\n";
    cin >> tmp->country;
    cout << "Vvedi god vypuska:\n";
    cin >> tmp->yearOut;
    cout << "Vvedi bydget:\n";
    cin >> tmp->budget;
    cout << "Vvedi kassovye sbory:\n";
    cin >> tmp->cashDues;
    cout << "Vvedi reyting filma:\n";
    cin >> tmp->rating;
    if(*first == NULL){
        tmp->next = 0; //По данному нулю отслеживается конец списка
        tmp->pred = 0;
        *first = tmp;
    }
    (*first)->pred = tmp;
    tmp->next = *first;
    tmp->pred = 0;    
    *first = tmp;
}
 
void main()
{
    char menuItem;
    do{
        cout<<"Vyberite odin iz punktov menu:\n";
        cout<<"0. Vyhod.\n";
        cout<<"\nRabota so spiskom:\n";
        cout<<"1. Dobavit' nivyy element v spisok.\n";
        cout<<"2. Prosmotr vsego spiska.\n";
        cout<<"3. Udalenie elementa iz spiska po parametry.\n";
        cout<<"4. Udalenie spiska.\n";
        cout<<"5. Vygruzit' spisok v fail.\n";
        cout<<"\nStatistika:\n";
        cout<<"6. Sredniy budget vseh filmov.\n";
        cout<<"7. Samyy neudachnyy film po versii BVT-11.\n";
        cout<<"8. Film s naibol'shim i naimen'shim reytimgom.\n";
        cout<<"9. Film s naibol'shim i naimen'shim bydzhetom.\n";
        cout<<"10. Film s naibol'shim i naimen'shim kassovym sborom.\n";
        cout<<'>';
        cin>>menuItem;  
        switch (menuItem)
        {
        case '1' :
            system("cls");
            inputFilm(&first);
            break;
 
        case '2' :
            system("cls");
            display(first);
            break;
 
            break;
        }
        system("cls");
    }
    while (menuItem != '0');
}
Yandex
Объявления
25.04.2014, 19:07     Двусвязные структуры
Ответ Создать тему
Опции темы

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