
- •Конспект лекций по курсу
- •Абстрактные структуры данных
- •Определение
- •Базовые структуры данных
- •Очереди и стеки
- •Деревья
- •Внутренние структуры данных
- •Отображение абстрактных структур данных на внутренние
- •Строка-вектор
- •1. Функция сцепления двух строк
- •2. Функция поэлементного сравнения двух строк
- •3. Функция разбиения строки.
- •4. Функция нахождения подстроки в строке
- •Строка-список
- •1. Сцепление двух строк
- •2. Поэлементное сравнение двух строк
- •3. Разбиение строки на части
- •4. Функция нахождения подстроки в строке
- •Стек-вектор
- •Стек-список
- •Очереди
- •Очередь-вектор
- •Очередь-список
- •Деревья
- •Классификация таблиц
- •Способ работы с таблицей
- •Способ доступа к таблице
- •Просматриваемые таблицы
- •Статическая просматриваемая таблица-вектор
- •Динамическая просматриваемая таблица-вектор
- •Просматриваемая таблица-список
- •Упорядоченные таблицы
- •Упорядоченная таблица-вектор
- •Динамическая упорядоченная таблица – вектор
- •Упорядоченная таблица – двоичное дерево
- •Перемешанные таблицы
- •Открытое перемешивание
- •Перемешивание сцеплением
1. Функция сцепления двух строк
Результатом данной функции является строка, в начале которой размещены символы первой строки, а за ними – символы второй строки. При реализации данной функции возникает вопрос о том, где будет размещена результирующая строка. Возможны два способа реализации операции:
а) функция формирует новую строку. Память для результирующей строки может выделяться вне функции и передаваться ей с помощью соответствующего аргумента или внутри функции, и тогда функция в качестве своего результата возвращает значение указателя на выделенную память;
б) функция модифицирует первую строку, добавляя в ее конец символы второй строки. В этом случае память, выделенная для первой строки, должна иметь достаточный размер для формирования результата. Такой подход применен в библиотечной функции сцепления строк strcat(). Эта функция в качестве результата возвращает указатель на первый символ результирующей (т.е. первой) строки.
Рассмотрим возможный способ реализации библиотечной функции сцепления строк. Текст функции приводится ниже и в файле stringv.cpp.
char * concat(char *first, char *second)
{
char *tmp;
/* вычислим значение указателя на последний символ (нуль-байт) первой строки;
* в дальнейшем он будет заменен первым символом второй строки.
*/
for(tmp = first; *tmp; tmp ++)
;
/* добавление символов второй строки в конец первой; как только будет скопирован
* нуль-байт, цикл завершится. Полученная строка также будет нуль ограниченной.
*/
while(*tmp ++ = *second ++)
;
return first;
}
Следует отметить, что функция не может проверить достаточность выделенной памяти под результирующую строку; ответственность за это несет вызывающая функция, в которой первая строка должна иметь достаточную память для размещения еще и символов второй строки.
2. Функция поэлементного сравнения двух строк
Строки представляют собой символьные нуль ограниченные строки; результат сравнения:
0, если строки одинаковые,
< 0, если первая строка "меньше" второй (в лексикографическом смысле, т.е. первый несовпадающий символ первой строки предшествует в алфавитном порядке соответствующему символу второй строки);
> 0, если первая строка "больше" второй в лексикографическом смысле.
Текст функции приводится ниже и в файле stringv.cpp.
int compare(char *first, char *second)
{
while(*first == * second && *first)
first ++, second ++;
return *first - *second;
}
Доступ к элементам строки, представленной вектором, осуществляется при помощи указателей.
В заголовке цикла записано выражение, обеспечивающее выполнение цикла, пока строки равны (символы строк совпадают) и еще не закончились. В теле цикла в выражении использованы операция «запятая», что позволило записать только один оператор и поэтому не использовать фигурные скобки (для обозначения составного оператора; эквивалентной записью было бы {first ++; second ++;}).
Цикл завершится, если нарушается хотя бы одно из двух условий:
найдены несовпадающие символы (*first != *second); это означает, что строки не равны, и результат функции определяется как разность между кодами двух не совпавших символов;
символы строк совпадают (*first == *second) и равны нулю (*first == 0, а, следовательно, и*second == 0); следовательно, результатом функции будет 0.