Комментарии по коду программы: 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Комментарии по коду программы:



В строках 4 — 10 мы создаем структуру. Чтобы ее объявить используем зарезервированное слово struct и даем ей любое, желательно логичное, имя. В нашем случае — building. С правилами именования переменных, вы можете ознакомиться в этой статье. Далее открываем фигурную скобку {, перечисляем 4 элемента структуры через точку с запятой;, закрываем фигурную скобку } и в завершении ставим точку с запятой;. Это будет нашим шаблоном (формой) структуры.

В строке 16 объявляем объект структуры. Как и для обычных переменных, необходимо объявить тип данных. В этом качестве выступит имя нашей созданной структуры — building.

Как же заполнить данными (инициализировать) элементы структуры? Синтаксис таков: Имя объекта далее оператор точка. и имя элемента структуры. Например: apartment1.owner. Таким образом, в строках 18-21 присваиваем данные элементам структуры.

И так, данные мы внесли. Следующий вопрос: «Как к ним обратиться, как работать и использовать их в программе?» Ответ — «Очень просто — так же, как и при инициализации, используя точку. и имя элемента структуры». В строках 23 — 26 выводим заполненные элементы структуры на экран.

И вот что мы увидим в результате, когда скомпилируем нашу программу:

 

Что ещё важно знать:

  • Объект структуры можно объявить до функции main(). Это выглядело бы так:

 

1 2 3 4 5 6 7 struct building { char *owner char *city; int amountRooms; float price; }apartment1; //объявление объекта типа building

 

Инициализировать структуру можно и таким способом:

building apartment1 = {"Денис", "Симферополь", 5, 150000};

 

но так делают крайне редко;

· Структуру можно вкладывать в другие структуры (это мы рассмотрим в следующем примере).

Дополним предыдущий пример, чтобы увидеть дополнительные возможности работы со структурами.

 

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 #include <iostream> using namespace std;   struct date //создаем еще одну структуру, чтобы вложить ее в структуру building // дата постройки { char *month; // Месяц постройки дома int year; // Год };   struct building { char *owner; char *city; int amountRooms; float price;   date built; //вкладываем одну структуру в определение второй };   void show(building object) //создаем функцию, которая принимает структуру, как параметр { cout << "Владелец квартиры: " << object.owner << endl; cout << "Квартира находится в городе: " << object.city << endl; cout << "Количество комнат: " << object.amountRooms << endl; cout << "Стоимость: " << object.price << " $" << endl; cout << "Дата постройки: " << object.built.month << ' ' << object.built.year << endl; }   int main() { setlocale (LC_ALL, "rus");   building apartment1;   apartment1.owner = "Денис"; apartment1.city = "Симферополь"; apartment1.amountRooms = 5; apartment1.price = 150000; apartment1.built.month = "январь"; apartment1.built.year = 2013;   struct building *pApartment; //это указатель на структуру pApartment = &apartment1;   //Обратите внимание, как нужно обращаться к элементу структуры через указатель //используем оператор -> cout << "Владелец квартиры: " << pApartment->owner << endl; cout << "Квартира находится в городе: " << pApartment->city << endl; cout << "Количество комнат: " << pApartment->amountRooms << endl; cout << "Стоимость: " << pApartment->price << " $" << endl; cout << "Дата постройки: " << pApartment->built.month << ' ' << pApartment->built.year << "\n\n\n";   building apartment2; //создаем и заполняем второй объект структуры   apartment2.owner = "Игорь"; apartment2.city = "Киев"; apartment2.amountRooms = 4; apartment2.price = 300000; apartment2.built.month = "январь"; apartment2.built.year = 2012;   building apartment3 = apartment2; //создаем третий объект структуры и присваиваем ему данные объекта apartment2   show(apartment3);   cout << endl << endl; return 0; }

 

Коментарии по коду программы:

Строка 17 — создание объекта built типа date в определении структуры building. Строки 42 — 43: создаем указатель на структуру struct building *pApartment; и далее присваиваем ему адрес уже созданного и заполненного данными объекта pApartment = &apartment1;. Обращаясь к элементам структуры через указатель мы используем оператор -> (тире и знак >). Это видно в строках 47 — 51.

В строке 62 показано, как можно инициализировать структуру. А именно, можно создать новый объект структуры и присвоить ему одним целым, уже созданный и заполненный данными, объект. В функцию show() передаем объект структуры, как параметр — строка 64. Результат:

 

 

Разобрав этот пример, мы увидели на практике следующее:

  • структуру можно вкладывать в другую структуру;
  • увидели, как создаётся указатель на структуру;
  • как нужно обращаться к элементу структуры через указатель. А именно, используя оператор ->; В примере это было так: apartment0->owner, но можно и так (*apartment0).owner. Круглые скобки, во втором случае, обязательны.
  • данные одной структуры можно присвоить другой структуре;
  • можно структуру передать в функцию, как параметр (кстати, элементы структуры так же можно передавать в функцию, как параметры).

В дополнение ко всему, следует отметить, что функции могут так же возвращать структуры в результате своей работы. Например:

 

1 2 3 4 5 6 7 8 building Set() { building object; // формирование объекта   //... код функции   return object; }

 

Списки

Линейный список — это динамическая структура данных, каждый элемент которой посредством указателя связывается со следующим элементом.

Из определения следует, что каждый элемент списка содержит поле данных (Data) (оно может иметь сложную структуру) и поле ссылки на следующий элемент (next). Поле ссылки последнего элемента должно содержать пустой указатель (NULL).

Так как ссылка всего одна (только на следующий элемент), то такой список является односвязным.

Когда говорят о линейном списке, то, как правило, подразумевают именно односвязный список.

Пример. Сформировать список, содержащий целые числа 3, 5, 1, 9.

Решение. При работе с динамическими структурами данных можно рекомендовать следующий порядок действий.

а) Прежде всего необходимо определить две структуры:

1. структура, содержащая характеристики данных, то есть все те поля с данными, которые необходимы для решения поставленной задачи (в нашем случае имеется всего одно поле целого типа). Назовём эту структуру Data;

2. структура, содержащая поле типа Data и поле — адрес последующего элемента next. Вторую структуру назовём List.

Тексты этих структур необходимо расположить в начале программы (до main() и других функций). Вот возможная реализация структур:

Struct Data

{

int a;

};

Struct List

{

Data d;

List *next;

};

Такой подход позволит в дальнейшем изменять в широких пределах структуру с собственно данными, никак не затрагивая при этом основную структуру List.

Итак, мы описали структурный тип, с помощью которого можно создать наш односвязный список. Графически создаваемый список можно изобразить так, как это показано на рисунке ниже:

 

б) В программе (обычно в функции main()) определяем указатель на начало будущего списка:

List *u = NULL;

Пока список пуст, и указатель явно задан равным константе NULL.

в) Выполняем первоначальное заполнение списка.

Создадим первый элемент:

u = new List; // Выделяем память под элемент списка

u->d.a = 3; // Заполняем поля с данными

// (здесь это всего одно поле)

u->next = NULL;// Указатель на следующий элемент пуст

После включения первого элемента список можно изобразить так:


Продолжим формирование списка, добавляя новые элементы в его конец. Для удобства заведём вспомогательную переменную-указатель, которая будет хранить адрес последнего элемента списка:

List *x;

x = u; // Сейчас последний элемент списка совпадает с его началом


Таким образом, к области памяти можно обратиться через два указателя.

Выделяем место в памяти для следующего элемента списка и перенаправляем указатель x на выделенную область памяти:

x->next = new List;

x = x->next;

Затем определяем значение этого элемента списка:

x->d.a = 5;

x->next = NULL;

Получилась такая схема:


Этот процесс продолжаем до тех пор, пока не будет сформирован весь список.



Поделиться:


Последнее изменение этой страницы: 2021-04-20; просмотров: 56; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.22.248.208 (0.021 с.)