Void List::Create ( unsigned N )
// Удаляет существующий список и создает новый список из N элементов { if (Count) // Если в списке есть элементы, то удаляем их Clear (); for (unsigned i = 1; i <= N; ++ i) // Добавляем к пустому списку N элементов AddItem (); // Добавляем в конец списка новый элемент } // ---------------------------------------------- Void List:: Clear () // Очищает динамическую память от списка из Count элементов { unsigned N = Count; for (unsigned i = 1; i <= N; ++ i) // N раз удаляем из списка первый // элемент (элемент с индексом 0) DelItem (0); } // ---------------------------------------------- Unsigned List:: ItemCount () //Возвращает количество элементов в списке { return Count; } // ---------------------------------------------- Bool List::ItemExists (unsigned Index) // Проверка наличия элемента с индексом Index (значения индекса от 0 до Count - 1) { if (Index >= Count) // Если значение индекса некорректное { // Выводим сообщение об ошибке cout << "Элемент с индексом " << Index << " отсутствует!\ n"; return 0; // Возвращаем значение false } return 1; // Элемент с заданным индексом существует. Возвращаем значение true } // ---------------------------------------------- t_Item *List::Item (unsigned Index) // Функция возвращает адрес элемента с индексом Index (значения индекса // от 0 до Count - 1). Если такого элемента нет, выводится сообщение об // ошибке и функция возвращает нулевой адрес { if (! ItemExists (Index)) // Если элемент с заданным индексом // отсутствует, выводим сообщение об ошибке, return 0; // возвращаем нулевой адрес if (Index == Count – 1) // Если нужен последний элемент списка, return End; // возвращаем адрес последнего элемента
// Начиная с начала списка перемещаемся по списку до элемента // с заданным индексом t_ Item * Curr = Items; // Делаем адрес очередного элемента равным // адресу первого элемента while (Index --) // Цикл продолжается Index раз Curr = Curr-> Adr; // Делаем адрес очередного элемента // равным адресу следующего элемента return Curr; // Возвращаем адрес элемента с заданным индексом } // ---------------------------------------------- T_Inf List::GetItem (unsigned Index) // Функция возвращает информационную часть элемента с индексом Index, // если такой элемент имеется. Если такого элемента нет, выводится // сообщение об ошибке, и функция возвращает значение // информационной части равное DefVal { t_ Item * Curr = Item (Index); // Получаем адрес элемента с заданным индексом if (! Curr) // Если адрес нулевой return DefVal; // Возвращаем значение по умолчанию return Curr-> Inf; // Возвращаем значение информационной части } // ---------------------------------------------- Void List::PutItem (unsigned Index, t_Inf Val) // Функция устанавливает значение информационной части элемента // с индексом Index, если такой элемент имеется, в значение Val. // Если такого элемента нет, выводится сообщение об ошибке, // а информационная часть элемента остается без изменения { t_ Item * Curr = Item (Index); // Получаем адрес элемента с заданным индексом if (! Curr) // Если адрес нулевой return; // Выходим из функции Curr-> Inf = Val; / / Информационной части найденного элемента // присваиваем значение Val } // ---------------------------------------------- Void List::AddItem (t_Inf Val) // Функция добавляет новый элемент в конец списка и
// делает значение информационной части этого элемента равной Val { t_ Item * NewItem = new t_ Item; // NewItem - адрес нового созданного // элемента списка NewItem-> Inf = Val; / / Присваиваем информационной части этого // элемента значение Val NewItem-> Adr = 0; // Поскольку элемент добавляется в конец списка, // в его адресную часть заносим 0 if (Count) // Если в списке уже были эементы (Count > 0), End-> Adr = NewItem; // адресной части последнего элемента // присаиваем адрес нового элемента else // Иначе (Count = 0 - список был пуст) Items = NewItem; // делаем адрес первого элемента списка // равным адресу нового элемента End = NewItem; // Теперь адрес последнего элемента списка // делаем равным адресу добавленного элемента ++ Count; // Увеличиваем количество элементов списка на 1 } // ---------------------------------------------- t_Item *List::ExtractItem (unsigned Index) // Функция выделяет элемент списка с индексом Index, исключая его из списка, // но не удаляет его из динамической памяти. Возвращает адрес // выделенного элемента, если такой элемент есть. Если такого элемента нет – // выводит сообщение об ошибке и возвращает нулевой адрес { if (! ItemExists (Index)) // Если элемент с заданным индексом отсутствует, // выводим сообщение об ошибке, return 0; // возвращаем нулевой адрес t_ Item * DItem, // Переменная для адреса выделяемого элемента * Pred = 0; // Переменная для адреса элемента // предшествующего выделяемому if (Index == 0) // Если выделяется первый элемент списка,
{ DItem = Items; // адрес выделяемого элемента делаем равным адресу // первого элемента списка, Items = Items-> Adr; // изменяем адрес первого элемента равным адресу // следующего элемента } else // Иначе (выделяется не первый элемент списка) { Pred = Item (Index – 1); // находим адрес элемента, который расположен // перед удаляемым, DItem = Pred-> Adr; // делаем адрес выделяемого элемента равным // адресной части предыдущего, Pred-> Adr = DItem-> Adr; // и в адресную часть предыдущего элемента // записывем адрес элемента, следующего // за выделяемым (тем самым исключаем // выделяемый элемент из списка). } if (DItem == End) // Если выделяемый элемент является // последним элементом списка, End = Pred; // корректируем адрес последнего элемента, делая его // равным адресу предыдущего -- Count; // Уменьшаем количество элементов в списке на 1 return DItem; // Возвращаем адрес выделенного элемента } // ---------------------------------------------- Void List::DelItem (unsigned Index) // Функция удаляет элемент с индексом Index из списка и освобождает // от него динамическую память. Если такого элемента нет, то выводится // сообщение об ошибке, а список остается без изменений { t_ Item * DItem = ExtractItem (Index); // Выделяем заданный элемент из списка if (DItem) // Если адрес выделенного элемента не равен 0,
delete DItem; // освобождаем от него динамическую память } // ----------------------------------------------
Воспользуйтесь поиском по сайту: ©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|