Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Разбиение строки на несколько частей. ⇐ ПредыдущаяСтр 2 из 2
В результате разбиения строки исходный список разбивается на несколько подсписков. Количество подсписков определяется тем, сколько раз в исходной строке встретился символ-разделитель (следует учитывать, что в конце исходной строки символ-разделитель может отсутствовать). Символы-разделители в подсписки не входят. Функция формирует 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; }
|