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

Список: Каким образом одна структура связывается с другой? Может кто знающий объяснить?

14.06.2017, 22:22. Показов 1323. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Ребят, может кто подробно объяснить каким образом работают следующие функции?
Все хорошо работает, но никак не могу понять, каким образом создается список.
Я понимаю это так: bleah указывает на новую структуру данных, заполняется данными, после чего это структура указывает на NULL. Функция возвращает адрес bleah. Потом мы входим в функцию addPerson. Там мы копируем адрес bleah в параметр функции findEnd и находим конец списка. Вот именно тут я не понимаю что происходит дальше. Каким образом одна структура связывается с другой?
Может кто знающий объяснить?
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
struct AddressBook
{
    string name;
    string surname;
    long long phone;
    AddressBook* next;
};
 
AddressBook* createAddressBook()
{
    AddressBook* bleah = new AddressBook; 
 
    cin.get();
    cout << "Enter the name: ";
    getline(cin, bleah->name);
    cout << "Enter surname: ";
    getline(cin, bleah->surname);
    cout << "Enter phone: ";
    cin >> bleah->phone; 
    bleah->next = NULL;
 
    return bleah;
}
 
AddressBook*& findEnd(AddressBook*& head)
{
    if (head != NULL)
    {
        return findEnd(head->next); 
    }
    return head; 
}
 
AddressBook* addPerson(AddressBook*& head)
{
    findEnd(head) = createAddressBook();
 
    return head;
}
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
14.06.2017, 22:22
Ответы с готовыми решениями:

Кто может объяснить a = a + b?
Сейчас разбирал функцию for. Но суть не в этом. Меня застопорило такое уравнение: sum = sum + i. Я совершенно не могу понять его смысла и...

Кто может объяснить?
Кто может объяснить как это делать? Задание 1. В оперативной памяти вектор int X расположен, начиная с адреса B7F0. Какие значения примут...

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

6
1272 / 1029 / 470
Регистрация: 25.12.2016
Сообщений: 3,333
14.06.2017, 22:47
Функция findEnd возвращает указатель next последнего элемента списка, и этому указателю присваивается адрес нового элемента, который был только что создан и возвращён функцией createAddressBook. Вся магия основана на использовании ссылок: findEnd возвращает не просто адрес, а переменную, в которой хранится этот адрес, а значит в эту переменную мы можем записать новое значение.
0
95 / 0 / 1
Регистрация: 12.07.2016
Сообщений: 73
14.06.2017, 22:58  [ТС]
хорошо, а что если мы передаем в функцию addPerson NULL?
вот так:
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
int main()
{
    cout << "=============== My Address Book ===============\n\n";
    cout << "1. To add person\n";
    cout << "2. To display all\n";
    cout << "3. To delete person\n";
    cout << "4. To search person\n";
    cout << "5. Exit\n";
 
    AddressBook* head = NULL;
    string pName;
    int choice = 0;
 
    while (true)
    {
        cin >> choice;
        switch (choice)
        {
        case 1: addPerson(head);
            break;
        case 2: display(head);
            break;
        case 3: cin.get();
            cout << "Enter name of person: ";
            getline(cin, pName);
            delPerson(head, pName);
            break;
        case 4: cin.get();
            cout << "Enter name of person: ";
            getline(cin, pName);
            search(head, pName);
            break;
        case 5: return 0;
        default: return 0;
        }
        cout << "=============== My Address Book ===============\n\n";
        cout << "1. To add person\n";
        cout << "2. To display all\n";
        cout << "3. To delete person\n";
        cout << "4. To search person\n";
        cout << "5. Exit\n";
        cout << endl;
    }
    delMemory(head);
 
    return 0;
}
схематично я вижу это так:
вот вопрос, что происходит дальше?
когда я создаю новую структуру, то bleah уже указывает на новую структуру, так вот, как новая структура цепляется за старую?
Миниатюры
Список: Каким образом одна структура связывается с другой? Может кто знающий объяснить?  
0
1272 / 1029 / 470
Регистрация: 25.12.2016
Сообщений: 3,333
14.06.2017, 23:13
Цитата Сообщение от BazNick Посмотреть сообщение
хорошо, а что если мы передаем в функцию addPerson NULL?
Мы передаём не NULL, а ссылку на переменную, значением которой является NULL. А функция addPerson присваивает этой переменной адрес нового объекта.

Добавлено через 3 минуты
Цитата Сообщение от BazNick Посмотреть сообщение
как новая структура цепляется за старую?
С помощью присваивания lastElement->next = newElement (имена условные). В данной программе lastElement->next возвращается функцией findEnd, а newElement - функцией createAddressBook.
0
95 / 0 / 1
Регистрация: 12.07.2016
Сообщений: 73
14.06.2017, 23:23  [ТС]
ага, это я понял
а как вот условно это все выглядит?
ну графически, если не сложно конечно, просто не могу понять как происходит привязка одной структуры к другой в конкретном случае
0
1272 / 1029 / 470
Регистрация: 25.12.2016
Сообщений: 3,333
14.06.2017, 23:31
Лучший ответ Сообщение было отмечено BazNick как решение

Решение

Пусть у нас есть список: A1->A2->A3->NULL.
Теперь создаём новый элемент: A4 = new Element.
Находим конец списка: end = A3->next (который == NULL).
Присваиваем end = A4, а поскольку end это ссылка, то это равносильно A3->next = A4.
Теперь имеем список: A1->A2->A3->A4->NULL.
1
95 / 0 / 1
Регистрация: 12.07.2016
Сообщений: 73
14.06.2017, 23:35  [ТС]
Спасибо огромное!
Теперь все стало на свои места!

Просто не часто встретишь функции типа ссылки на указатель.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
14.06.2017, 23:35
Помогаю со студенческими работами здесь

Кто может объяснить Делфи?
На носу экзамен,преподаватель сказал что учить не хочет готовьтесь сами, кто может объяснить в скайпе с демонстрацией экрана или как то...

кто может объяснить синтаксис
кто может объяснить синтаксис при встрече в Барнауле, могу подъехать в любое время пм icq: 554091043

Кто может объяснить ошибку?
нужно найти сумму элементов нечетных столбцов, вроде все так, но ищет четных..в упор не вижу ошибку using System; using...

Кто нибудь может объяснить?
Посмотрите на глю! Кэто как?

Кто Может объяснить? Знания нулевые(
В общем , на семинарах ничего не рассказывали , только сказали сдать в следующий раз лабораторную. В программе ms sql я ничего не смысли:(...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru