Студопедия

Главная страница Случайная страница

КАТЕГОРИИ:

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Разбиение строки на несколько частей.






В результате разбиения строки исходный список разбивается на несколько подсписков. Количество подсписков определяется тем, сколько раз в исходной строке встретился символ-разделитель (следует учитывать, что в конце исходной строки символ-разделитель может отсутствовать). Символы-разделители в подсписки не входят. Функция формирует NULL-ограниченный массив указателей на выделенные подсписки и в качестве результата возвращает указатель на его первый элемент.

Данная функция также сначала определяет количество подсписков, а затем выделяет требуемую память под результат и формирует подсписки и массив указателей на них. Принципы работы данной функции иллюстрируются рис. II-19.

Рис. II‑ 19.

Схема алгоритма приведена на рис. II-20.

Рис. II‑ 20.

Текст функции приводится ниже и в файле Programs/stringl.cpp.

Item **split(struct Item *head, char fs)

{

int i, cnt;

Item **pa, *ptr, *cur;

/* подсчитать количество подсписков; при подсчете учитываем,

* что последним символом в списке может быть символ-разделитель

*/

for(cur = head, cnt = 1; cur; cur = cur-> next)

if(cur-> s == fs & & cur-> next)

cnt++;

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

* плюс NULL-указатель

*/

pa = new (Item *)[cnt + 1];

for(i = 0; i < cnt; i++){ /* не все подсписки сформированы */

/* сформировать указатель на очередной подсписок */

pa[i] = head;

/* найти последний элемент подсписка */

for(ptr = head; ptr-> next & & ptr-> next-> s! = fs;

ptr = ptr-> next)

;

cur = ptr-> next;

if(! cur) /* обнаружен конец списка */

break;

/* сформировать начало следующего подсписка */

head = cur-> next;

ptr-> next = NULL;

/* удалить символ-разделитель */

delete cur;

}

/* добавить в конец массива указателей пустой указатель */

pa[cnt] = NULL;

return pa;

}


Поделиться с друзьями:

mylektsii.su - Мои Лекции - 2015-2024 год. (0.005 сек.)Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав Пожаловаться на материал