- •2) Константы
- •13) Массивы-конечная совокупность данных одного типа
- •19) Сегмент данных для хранения констант
- •3.14159265 Позволяет использовать в программе имя p1 вместо константы 3.14159265. Обратите внимание, что
- •Void main()
- •32) Перечислимые типы
- •Void constr_list(dyn_list &l)
- •37) Объединения
- •Режимы открытия и их назначение
Void constr_list(dyn_list &l)
{
l.head = NULL;
}
// Проверка списка на пустоту
bool chk_empty(dyn_list l)
{
return (l.head==NULL);
}
Видим, что все просто. Конечно, тип, описывающий список можно было оформи как класс, а функцию, создающую
его сделать конструктором данного класса, но я оставлю это вам в качестве домашнего задания :. Теперь в
функции main() описываем переменную типа dyn_list и создаем пустой список. Затем переходим к следующему
пункту.
dyn_list vars; // Динамический список
constr_list(vars);
Операции с компонентами списка Ну, перед тем, как проводить какие-то операции с компонентами, их необходимо добавить в список, чем мы
сейчас и займемся. Прежде всего, нам необходимо создать новый компонент и заполнить его информационную
часть. Так как мы будем помещать его в конец списка, то ссылочная часть узла будет иметь значение NULL.
Теперь давайте поймем, что должно происходить со ссылками head и tail при этой операции. Здесь
рассматриваются 2 случая - наш список пуст или в нем есть хотя бы один компонент. Если пуст, то и head и tail
будут указывать на только что созданный компонент. Если же узлы в списке присутствуют, очевидно, что сначала
нужно последний узел связать с добавляемым (для этого ссылочной части компонента, на который указывает tail,
присвоить адрес того, который хотим добавить), а затем "передвинуть" tail. Вот как просто все это выглядит на
С++:
// Включение в список нового компонента
void comp_in(dyn_list &l, char* n, char* v)
{
comp* c = new comp();
strcpy_s(c->name, 20, n);
strcpy_s(c->value, 10, v);
c->next = NULL;
if (chk_empty(l))
l.head = c;
else
l.tail->next = c;
l.tail = c;
}
Теперь займемся поиском компонента. Искать будет по имени переменной, по желанию вы можете искать и по
значению. В качестве аргументов, функции поиска передаем сам список и искомый текст. Возвращать наша
функция будет адрес найденного узла или NULL, если ничего не найдено. Искать начнем с компонента, на
который указывает head и, двигаясь вперед, сравнивать имя текущей переменной с искомым. В функции поиска
мы можем не боясь, передвигать ссылку head, так как передаем ее не по ссылке.
// Поиск компонента в списке по имени
comp* search(dyn_list l, char *n)
{
while (l.head != NULL)
{
if (!strcmp(l.head->name,n))
return l.head;
l.head = l.head->next;
}
return l.head;
}
А сейчас удалим компонент. В качестве аргумента, передаем по ссылке список, а также ссылку на компонент,
который собираемся удалить. В самой же функции рассматриваем 2 случая. Первый случай простой: если
компонент является первым (то есть на него указывает head), то достаточно лишь переместить ссылку на первый
элемент вперед. В противном случае, нам понадобится рабочая переменная-узел, которую мы будем
использовать для движения по списку. Двигаться будем до тех пор, пока следующий за текущим узел не будет
тем, который мы собираемся удалить. Ну а после этого, "перепрыгиваем" удаляемый компонент, присваивая
ссылочной части предшествующего удаляемому компоненту адрес следующего за удаляемым. Все эти слова
умещаются буквально в несколько строк исходного кода:
// Удаление компонента из списка
void comp_del(dyn_list &l, comp* c)
{
if (c == l.head)
{
l.head = c->next;
return;
}
comp* r = new comp();
r = l.head;
while (r->next != c)
r = r->next;
r->next = c->next; delete c;
}
Последняя и самая простая операция - это изменение значения информационной части узла. Менять будем поле
value. В качестве параметров, по ссылке передадим адрес компонента, а также новое значение изменяемого
поля. Ну и в одну строчку все изменим. Вот как просто это выглядит:
// Изменение значения компонента
void comp_edit(comp &c, char* v)
{
strcpy_s(c.value, 10, v);
}
36) Инициализация структур.
Инициализация структуры в языке си ( c ) происходит так же, как и при инициализации массива. Вот
пример инициализации структуры:
struct klass a = {"Sergey", 'B', 4.5 };
Т.е. мы создаем переменную типа struct klass и присваиваем всем трем полям, которые у нас определенны
в структуре, значения. Порядок очень важен при инициализации структуры, так как компьютер сам не
может отсортировывать данные. Если какое-либо поле у вас будет не заполненным, то оно автоматом
заполнится 0 - для целочисленных типов; NULL - для указателей; \0 (ноль-терминатор) - для строковых
типов.
