Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
3 / 3 / 2
Регистрация: 01.10.2011
Сообщений: 249
1

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

30.05.2012, 21:22. Просмотров 1547. Ответов 9
Метки нет (Все метки)


Помогите, пожалуйста разобраться с вводом вложенного односвязного линейного списка.
Вот хотя бы на таком примере структур:

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;
};
Если тут в коде где-то ошибка, то укажите на нее, пожалуйста
Буду рад всему: просто советам, указаниям, ссылкам на книжки и так далее.

Заранее всем спасибо
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.05.2012, 21:22
Ответы с готовыми решениями:

Проход по элементам односвязного линейного списка
Допустим у меня существует класс линейного односвязного списка. Надо пройти по его элементам и...

Сортировка односвязного линейного списка по алфавиту
Всем здравствуйте! Имеется линейный список. Помогите, пожалуйста, написать сортировку студентов...

Гайд по сортировке односвязного линейного списка
Посоветуйте пожалуйста толковый гайд по сортировке. Уже столько всего перерыл, прочитал, но понять...

Найти наименьший элемент односвязного линейного списка
Найти наименьший элемент односвязного линейного списка. Сценарий: обходя список найти минимальное...

__________________
Помогаю в написании студенческих работ здесь.
Записывайтесь на профессиональные курсы C++ разработчиков
9
35 / 35 / 12
Регистрация: 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++, в этом случае

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

Надеюсь, что стало понятнее
0
667 / 195 / 29
Регистрация: 10.05.2012
Сообщений: 595
30.05.2012, 22:10 4
Извините я не всёк, а зачем в struct Ingredient Ingr; слово struct ?! вы вроде просто должны объявить ingr типа Ingredient ...
1
3 / 3 / 2
Регистрация: 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;
}
0
Заблокирован
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;
}
1
3 / 3 / 2
Регистрация: 01.10.2011
Сообщений: 249
30.05.2012, 23:22  [ТС] 7
alkagolik, спасибо. это полезно. но что-то я не понял где здесь вложенные списки? укажите, пожалуйста, если не трудно )
0
Заблокирован
30.05.2012, 23:44 8
Kirill Losev, а какая собственно разница вложенные или не вложенные? реализуйте одноструктурный список с функциями элементами добавления и удаления звеньев и поймете принцип выделения памяти под списки. С вложенными структурами будет все точно так же.
1
3 / 3 / 2
Регистрация: 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
и все вроде заработало
спасибо всем за помощь
0
3 / 3 / 2
Регистрация: 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;
}
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.06.2012, 10:56

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

Удалить из односвязного линейного списка определенный узел
Построить односвязный список из входной последовательности целых чисел. Написать программу, которая...

Задать двумерный массив с помощью линейного односвязного списка
Помогите решить задачу: &quot;Задать двумерный массив с помощью линейного односвязного списка&quot;. Может...

Реализовать стек вещественных чисел на основе односвязного линейного списка
Реализовать стек вещественных чисел на основе односвязного линейного списка написать программу

Спроектировать шаблон класса spisok для реализации односвязного линейного списка. Не работает сортировка
Здравствуйте! Очень нужна помощь в реализации программы. Задание: Спроектировать шаблон класса...


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

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

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