Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
OOP2 (1).doc
Скачиваний:
1
Добавлен:
01.04.2025
Размер:
350 Кб
Скачать
☆

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 (ноль-терминатор) - для строковых

типов.

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