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

Ввод вложенного односвязного линейного списка - C++

Восстановить пароль Регистрация
 
Kirill Losev
3 / 3 / 0
Регистрация: 01.10.2011
Сообщений: 249
30.05.2012, 21:22     Ввод вложенного односвязного линейного списка #1
Помогите, пожалуйста разобраться с вводом вложенного односвязного линейного списка.
Вот хотя бы на таком примере структур:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
struct Ingredient
{
    char NameIngr[size];
    float Sum;
    Ingredient *next;
};
 
struct Recipe
{
    char NameRecipe[size];
    struct Ingredient Ingr;
    int Number;
    Recipe *next;
};
Если тут в коде где-то ошибка, то укажите на нее, пожалуйста
Буду рад всему: просто советам, указаниям, ссылкам на книжки и так далее.

Заранее всем спасибо
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
rakota
35 / 35 / 1
Регистрация: 05.02.2012
Сообщений: 76
30.05.2012, 21:47     Ввод вложенного односвязного линейного списка #2
C++
1
2
3
4
    char NameRecipe[size];
    struct Ingredient Ingr;
    int Number;
    Recipe *next;
Вообще struct не обязателен в c++, в этом случае

Я немного не понял задачи: нужно ввести данные в список их структур такого типа, да?
Kirill Losev
3 / 3 / 0
Регистрация: 01.10.2011
Сообщений: 249
30.05.2012, 22:01  [ТС]     Ввод вложенного односвязного линейного списка #3
rakota, я в программе - надо моделировать процесс выпечки хлебобулочных изделий по рецептам - сначала вводу список сырья при помощи структуры Ingredient. Потом ввожу рецепт при помощи Recipe, но в рецепте ведь есть свой список ингредиентов, и я снова использую структуру Ingredient(вложенная получается). и я не совсем понимаю, как это синтаксически правильно осуществить)

Надеюсь, что стало понятнее
Ternsip
 Аватар для Ternsip
660 / 188 / 6
Регистрация: 10.05.2012
Сообщений: 595
30.05.2012, 22:10     Ввод вложенного односвязного линейного списка #4
Извините я не всёк, а зачем в struct Ingredient Ingr; слово struct ?! вы вроде просто должны объявить ingr типа Ingredient ...
Kirill Losev
3 / 3 / 0
Регистрация: 01.10.2011
Сообщений: 249
30.05.2012, 23:07  [ТС]     Ввод вложенного односвязного линейного списка #5
Ternsip, да, точно. спасибо.
еще вопрос как, например, при вводе обращаться к элементам вложенного списка?

Добавлено через 39 минут
Вот еще один простенький пример.
Тут еще один вопрос: для вложенных структур надо память выделять. А если у меня элементов типа вложенной структуры много? Как например ингредиентов в рецепте?

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
#include <iostream>
#include <windows.h>
using namespace std;
 
struct OneS
{
    char symvol;
    OneS *next;
};
 
struct TwoS
{
    OneS *One;
    int data;
    TwoS *next;
};
 
struct Form
{
    OneS *first;
    OneS *last;
 
    TwoS *begin;
    TwoS *end;
};
 
int InputInfo(Form &);
 
int main()
{
    setlocale(LC_ALL, "RUS");
    Form Card;
    Card.first = NULL;
    Card.last = NULL;
    Card.begin = NULL;
    Card.end = NULL;
 
    InputInfo(Card);
 
    cout << "\n";
    system("pause");
    return 0;
}
 
int InputInfo(Form &Card)
{
    OneS *Now = NULL;
    TwoS *Curr = NULL;
    Card.first = Now;
    Card.begin = Curr;
 
    do
    {
        Now = new OneS;
        cout << "Введите очередной элемент: ";
        cin >> Now->symvol;
        cout << "Вы ввели: " << Now->symvol << "\n";
        do
        {
            Curr = new TwoS;
            cout << "Введите символ нового элемента: ";
            cin >> Curr->One->symvol;
            cout << "Введите значение нового элемента: ";
            cin >> Curr->data;
            cout << "Для элемента \"" << Curr->One->symvol << "\" вы ввели значение: " << Curr->data << "\n";
            if(Card.begin == NULL && Card.end == NULL)
                Card.begin = Curr;
            else
                Card.end->next = Curr;
            Card.end = Curr;
            Card.end->next = NULL;
        } while(Curr->data >= 0);
        if(Card.first == NULL && Card.last == NULL)
            Card.first = Now;
        else
            Card.last->next = Now;
        Card.last = Now;
        Card.last->next = NULL;
    } while(Now->symvol != 'E');
    return 0;
}
alkagolik
 Аватар для alkagolik
1510 / 616 / 79
Регистрация: 15.07.2011
Сообщений: 3,552
30.05.2012, 23:18     Ввод вложенного односвязного линейного списка #6
Цитата Сообщение от Ternsip Посмотреть сообщение
Извините я не всёк, а зачем в struct Ingredient Ingr; слово struct ?! вы вроде просто должны объявить ingr типа Ingredient ...
это для Си обязательно. Вот пример на Си
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stdio.h>
 
struct s{
    int x;
    char *str;
};
 
int main() {
    struct s item1, *item2;
 
    item1.x = 12;
    item2 = &item1;
 
    printf( "%i\n", item2->x );
    return 0;
}
поэтому удобней "затайпдефить" структуру как тип
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stdio.h>
 
typedef struct s{
    int x;
    char *str;
} s_type;
 
int main() {
    s_type item1, *item2;
 
    item1.x = 12;
    item2 = &item1;
 
    printf( "%i\n", item2->x );
    return 0;
}
Kirill Losev
3 / 3 / 0
Регистрация: 01.10.2011
Сообщений: 249
30.05.2012, 23:22  [ТС]     Ввод вложенного односвязного линейного списка #7
alkagolik, спасибо. это полезно. но что-то я не понял где здесь вложенные списки? укажите, пожалуйста, если не трудно )
alkagolik
 Аватар для alkagolik
1510 / 616 / 79
Регистрация: 15.07.2011
Сообщений: 3,552
30.05.2012, 23:44     Ввод вложенного односвязного линейного списка #8
Kirill Losev, а какая собственно разница вложенные или не вложенные? реализуйте одноструктурный список с функциями элементами добавления и удаления звеньев и поймете принцип выделения памяти под списки. С вложенными структурами будет все точно так же.
Kirill Losev
3 / 3 / 0
Регистрация: 01.10.2011
Сообщений: 249
31.05.2012, 00:00  [ТС]     Ввод вложенного односвязного линейного списка #9
alkagolik, в том то и беда, что без вложенных я все более или менее понимаю, а с вложенными...... а как обращаться к элементам вложенных списков, не подскажете?

Добавлено через 4 минуты
ну, сейчас вроде(в предыдущем примере) получилось сделать.
Я убрал указатель из второй структуры на первую(строка 14) и поменял в строках 63 и 66
C++
1
Curr->One->symvol
на
C++
1
Curr->One.symvol
и все вроде заработало
спасибо всем за помощь
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.06.2012, 10:56     Ввод вложенного односвязного линейного списка
Еще ссылки по теме:

Спроектировать шаблон класса spisok для реализации односвязного линейного списка. Не работает сортировка C++
Гайд по сортировке односвязного линейного списка C++
Удаление элементов из односвязного списка списка C++

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

Или воспользуйтесь поиском по форуму:
Kirill Losev
3 / 3 / 0
Регистрация: 01.10.2011
Сообщений: 249
01.06.2012, 10:56  [ТС]     Ввод вложенного односвязного линейного списка #10
Хмммм... что-то не то. Как это исправить?

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
#include <iostream>
#include <windows.h>
using namespace std;
 
struct OneS
{
    int data;
    OneS *next;
};
 
struct TwoS
{
    OneS One;
    char Name;
    TwoS *next;
};
 
struct Form
{
    TwoS *first;
    TwoS *last;
 
    TwoS *begin;
    TwoS *end;
};
 
int InputInfo(Form &);
int OutputInfo(Form &);
 
int main()
{
    setlocale(LC_ALL, "RUS");
    Form Card;
    Card.first = NULL;
    Card.last = NULL;
    Card.begin = NULL;
    Card.end = NULL;
 
    InputInfo(Card);
    OutputInfo(Card);
 
    cout << "\n";
    system("pause");
    return 0;
}
 
int InputInfo(Form &Card)
{
    TwoS *Curr = NULL;
    Card.first = Curr;
    TwoS *Now = NULL;
    Card.begin = Now;
    do
    {
        Now = new TwoS;
        cout << "Введите имя внешнего элемента списка: ";
        cin >> Now->Name;
        if(Now->Name == 'E')
            break;
        do
        {
            Now = new TwoS;
            cout << "Введите значение для элемента внешнего списка: ";
            cin >> Now->One.data;
            if(Card.first == NULL && Card.last == NULL)
                Card.first = Now;
            else
                Card.last->next = Now;
            Card.last = Now;
            Card.last->next = NULL;
        } while(Now->One.data >= 0);
        if(Card.begin == NULL && Card.end == NULL)
            Card.begin = Now;
        else
            Card.end->next = Now;
        Card.end = Now;
        Card.end->next = NULL;
    } while(Now->Name != 'E');
 
    return 0;
}
 
int OutputInfo(Form &Card)
{
    TwoS *Now = NULL;
    Now = Card.begin;
    TwoS *Curr = NULL;
    Curr = Card.first;
    do
    {
        cout << Now->Name << ":";
        do
        {
            cout << " " << Now->One.data;
            Curr = Curr->next;
        } while(Curr != NULL);
        Now = Now->next;
        cout << "\n";
    } while(Now != NULL);
    return 0;
}
Yandex
Объявления
01.06.2012, 10:56     Ввод вложенного односвязного линейного списка
Ответ Создать тему
Опции темы

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