Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Проектирование программ и программирование на С++ Часть 1. Структурное.pdf
Скачиваний:
18
Добавлен:
15.11.2022
Размер:
3.8 Mб
Скачать

s t r u c t

 

 

 

 

{

 

 

 

 

 

i n t

a : 10;

//д л и н а

п оля

10

бит

i n t

b :1 4 ;

//д л и н а

поля

14

бит

} хх , *рхх;

х х . а = 1; рхх = &хх;

рхх->Ь = 8;

Битовые поля могут быть любого целого типа. Они используют­ ся для плотной упаковки данных. Например, с их помощью удобно реализовать флажки типа «да» / «нет».

Особенностью битовых полей является то, что нельзя получить их адрес. Размещение битовых полей в памяти зависит от компилято­ ра и аппаратуры.

18.3.3. Объединения

Объединение (u n io n ) - это частный случай структуры. Все поля

объединения располагаются по одному и тому же адресу. Длина объе­ динения равна наибольшей из длин его полей. В каждый момент вре­ мени в такой переменной может храниться только одно значение. Объ­ единения применяют для экономии памяти, если известно, что более одного поля не потребуется. Также объединение обеспечивает доступ

к одному участку памяти с помощью переменных разного типа,

 

u n io n

 

 

{

 

 

 

c h a r

 

s [1 0 ];

 

i n t

x;

 

} u l ;

 

 

0

1

2 | 3

9

х - занимает 2 байта

 

s - занимает 10 байтов

 

Рис. 14. Расположение объединения в памяти

И s, и х располагаются на одном участке памяти (рис. 14). Размер такого объединения будет равен 10 байтам.

//использование объединений

enum paytype{CARD,CHECK}; //тип оплаты struct

{

/*поле, которое определяет, с каким полем объ­ единения будет выполняться работа*/

paytype ptype; union

{

c h a r c a r d [2 5 ]; lo n g c h e c k ;

};

} info;

switch (infо .ptype)

{

case CARD:cout«"\nOrLnaTa по карте: "«info, card; break;

case CHECK:со и « < "\п О п л ата чеком: " « i n f o , check; b reak ;

}

19. ДИНАМИЧЕСКИЕ СТРУКТУРЫ ДАННЫХ

Во многих задачах требуется использовать данные, у которых конфигурация, размеры и состав могут меняться в процессе выпол­ нения программы. Для их представления используют динамические информационные структуры. К таким структурам относят:

-линейные списки;

-стеки;

-очереди;

-бинарные деревья.

Они отличаются способом связи отдельных элементов и допус­ тимыми операциями. Динамическая структура может занимать не­ смежные участки динамической памяти.

Наиболее простой динамической структурой является линейный однонаправленный список, элементами которого служат объекты структурного типа (рис. 15).

Beg - начало списка

Рис. 15. Линейный однонаправленный список

Описание простейшего элемента такого списка выглядит сле­ дующим образом:

struct имя_типа

{

информационное поле;

адресное поле;

}; - информационное поле - это поле любого, ранее объявленного

или стандартного, типа; - адресное поле - это указатель на объект того же типа, что

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

Информационных полей может быть несколько.

//пример 1

 

 

struct

point

 

 

{

 

 

поле

int key; //информационное

point*

next;

//адресное

поле

};

 

 

 

//пример 2

 

 

struct

person

 

 

{

 

//информационное поле

char* name;

int age; //информационное

поле

person*

next;

//адресное

поле

};

Каждый элемент списка содержит ключ, который идентифици­ рует этот элемент. Ключ обычно бывает либо целым числом (при­ мер 1), либо строкой (пример 2).

Над списками можно выполнять следующие операции:

-начальное формирование списка (создание первого элемента);

-добавление элемента в конец списка;

-добавление элемента в начало списка;

-поиск элемента с заданным ключом;

-удаление элемента с заданным ключом;

-удаление элемента с заданным номером;

-добавление элемента с заданным номером и т.д.

Рассмотрим основные операции над списком из примера 1.

19.1. Создание элемента списка

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

#include <iostream.h>

//описание структуры

struct point

{

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]