А.А. Белеванцев, С.С. Гайсарян, Л.С. Корухова, Е.А. Кузьменкова, В.С. Махнычев - Алгоритмы и алгоритмические языки (1113416), страница 15
Текст из файла (страница 15)
ДЛЯ ДСРСБВ поиска из Н вершин в лучшем случае его высота составляет 11Рибттнзительно 'ос)СИ (и НРИ поиске В ДСРсве нз миллноий всрп1нн прндстся ВыпОлнить вссГО с.б с)эавнсний), й 6 кудшеы — высота рав1га И: дерево «вытянуто» в цепочку (и при поискс 6 такОм дсрсВс придется просмотпсть Все сГО ВЕРШИНЫ), .4Ы"-дсрсато — двоиЧНОС дерево ПОНСКй, 6 Кйж:10Й ВСРШПНС КОТОРОГО ВЫСотй ЛСВОГО ПОДДСРСВВ ЭТОИ ВСР1ПИНЫ оглнчастся От высоты праВОГО поддсрсва эгои Вс)11пины ис более чем нй единицу, Тйкос СВОЙство сушсс.гвснио ОГ)»аничивйст увеличепис Высо'Гы дерева с ростом количсствй вершин, то есть поиск нужного злемен га происходит быстро.
)(роыс того, су1цествует эффективный алгоритм добавления (вставки) нового злемеита в А1ТЛ-дерев01 новый элемент лсойвлястся В качестве листа к одному из поддеревьев (кйк и 6 дсрсВс НОискй), й затем для тсх Всршнн, Гдс услОВис ойзгаисиройки АВЛ-дерева окйзйлось ийруп1снпыы, вьиолнясГся соотестс16у106)ий НПВОгюж, кото(эый сводится к пс(1естанОВЯС нсскОлысик Всршии и поддсрсВьсВ. Приме(л РЕВЛИЗВЦИЯ 110тРОТКОГО ПРВВОГО ПОВХ1РОЗЖ Кй..
Й У(1 /~ , ,)у)~ (б) збхнсг схеспОбе ГО1'.ИСС ЕР (ВВТПСГ ГХССПСтС)Е *ХОО ) ч-'"пас ЕГ~епаао '>Ь == Гаае-ьуеб!; зт1»заь ВГеепас16 ".* = Ь-ав' Йпс; яаа« -Э1еу . =- а-> -«ПЬ>; пеь,енаа»7аддоаиве 1>1 а-ЯГ>ЦЬВ =- Ваав; а становится потомкам а 'Г>-аЯ~.ЙЬ«Ь = »=-яуе' "; УУ пе»а«анас 1>алдереиа> >и а-ь)ВЙЬ = Ь; Ь становится потомкам ' еп>1Г11 а» ,ИКВ ВВ 'ГЕЕЛЬ» Иа Ьа БЫЙ Кар онь Д«;.аив В ВЙ4.). Описат> функци10, кото)>ая апреле»зяе> является ли данное двоичное дерево деревом поиска: и) рекурсивио: б) нерскурс1пщо. используя определенные ранее типы данных истек» и <»Очередь», ВЬ4э"Ь Описать фУнктщю, >сото)>ая для заданноГО дваичн010 дерева поиска: и) находит %1имены1пее 31ьзчсние В нем ~считать, чтО дереВО непустае); б) добавляет задсп>ный Элемент в дерево пои~Ха !'если злемеп1 узко был в дсрсвс, то пс добавля>ь); в) удаляет из неп)»стОГО дерева поиска е1 0 маесимвльный элеме1ГГ; Г) находит В дереВ~ пщиска максимальное и Второе по Величине 31тачения >считать, что дерево сОдержит нс менее ДВУХ ЭЛЕМЕНТОВ); д> удаляет из дерева поиска зз>еыент с заданным значением (если он есть); е) Опре»деляетт является ли заааниое дереВО 1Н>иска АВЛ-деревом.
Реальные проГ1>аммы на Си, как п)Завило. со~то~т из нескольких файлоВ. СреДИ этих фаилОВ мОГут Оыть затолово'>ные файль., соде)>жтщие 11»1>п1у>11>е>)е просрамыы илн ее частеи (те. набор функций и переменны>ц с пОмОщью к010рых мОжнО использоВать функци01иальиость» осалпзованпуи> п)ЗОГрамыс«й), и файлы с рещ>изацней ~В~~~Й протраммы ~с распщрением . а), В Си используется раздельная компиляция, то ес1ь Все файлы с кодом прОГраммы у>ажно компилировать отдельно. СХема Компиляции Си-просраммы представлена на рисУНКе 7. В ходе Компиляиии ОДИОГО файла сначава этот файл Обрабатывается >>р1»пр111)ессаром — компонентом, произвоз1ящим набор ~еяс~овы~ подстановок над файлом для получения еГО Оканчател1»иОГО Вида и передачи компиляторуз Лотом компилясор получает 11ссея1бяериый код.
то есть представляет прОГрамь>у В Виде последоВательности кОманд ценГральнОГО процессора и Описания не00ходимых ячеек В Глобальной и статической памяти. Далее пссяьиб»1е/> ЛОлучает по файл~ на ЯЗЫКе ассемблера Т.н. Об>»ек>и>>ый файл Гкак правило, имеиииий расщирение, а на Вп)х-подобных системах). и Которо~ Команды ассемблера закодированы В Двои~~~м виде, а такж1. О~~с~~ вид стапсческой и Глобальной памяти.
Наконец«ГМ>иит>иав>Пик Об спечнвает слияние нескольких обьектных файлов В один испол~яемый файл просраыыы. й! 1! еЗХ .Ф Г 1 ППС О цес Асс ЫеЗ.о фэ Исходиее оооПэамме 1 Ф Ые1.с 6)е2.с — — — — )Г;— Г11эепаоцессо)э ~ ) Прелсо ~':.:-"Л ~':,- Д)е1.о Г11е2.о прог)эаым11 Гэ.с. Описапэес инте)эфсйснь1х функций програхэыэл В заголовочпэз1х файлах и их ЛОДкл10чснис), Обсспсчсние переносимости проГраммы 1'за счет услОВБОЙ компиляции).
авэоматическаЯ Генерация Однотипных участков кода Гза счет макросов), Управление препр1111сссороы обсслэсчи веется вэоэкэчснием в текст программы дирекэ.ив препроцессора. При обработке каждой директивы препроцессор меэгяет текст прОГраммы Определенным Об)эазсэм, послс чсГО удаляет из текста Обрабспаниуго дирскгив,е После окон илия рабэоты препроцессора компилятору Си на вход подается файл с текстом программы, содержащим лищь ОпрсделсниЯ и ооъявлениЯ фу'акций и ОбьЯБжния переменных, как Описаээо В )эаздслс 1. Строг11 Го~оря, до зтаэга прспроцсссироваиия ко~пилятор Также п)эоизводит ПРСДВЙ)ЭИТСЛЬБУКэ ПОДГОТОВКУ ГСКСТВ ПроГраММЫ обрабатывает миогобайтовьгс символы, заменяет комментарии пробелом и тл1..
— НО рассмот)эепие згого процесса нс вход~т в задачи настоящего пособия. ! Исоолиеемый фзйл Р11Г, 7. Г.'хема кээеэлиээлэлэи 31иосгэлэодуеьной лририээиы Прспроцессор Си обеспечивает 1скстовуэо обработку файла прог)эаммы До пс;эсдачи сс компиляго)эу. С;реди Задач прспроцсссора мОжнО назвать Ооеспечснис модульиОс'1и Подклэочсние заголовочных файлов программы Осуц1ествляезся с помощью дирееггивы Й ' псу пав <б1)с,й> или Й1пс11ов "11.э.е.це. Какп)Завило, список ДИ)1СКТИВ й 1.! ~сйц ье дзя пОДКЛГОчСиия необходимых файлоВ указыэгается в первых строках,с-файла. Первыи вариант директивы с заклкээсипсм имени файла в угловьэс скооки использестся для общесистемных библиотек.
Вклкэчая стаидартнуго библиотеку Си. а второй вариант 1с двойными кавьгчками) — для поээьзоватсльск1тх файлов. В скобках или КВВычках иахОди Гся имя пол) часмоГО файла или Относительный путь к ному, РВ31гица В дВух вариантах директиВы закэпОчастсЯ в разных 1габорах каталоГОВ, Относитсльно которых ищутся задаиньгс В дирсктивс пути к подклкэчасыым заГОлово~1иым файлам, Дирсктээва есэст 1 па слтжит д!Гя Определения нек010(»ОГО имени, ш1зываем010 11Г1кросг01.
и соогветству1ощего ему глекстг1 подстановки, или л»С.1а .НОЬ11гнх1. Напрнмср, днзектива Фбсгупе ОЕББОР?1КТ 11»гйг1»Т (всс)е х, "КСЬ »с( Оц' ров: "') определяет макрос ОЕБУОРР1КТ, прн хгом после обработки директивы дщ1сс в тексте ц(хи.)»аммы прспроцессор замсняет Всс вхождения имени ъикроса в текст на сГО тело (выголчястся т.н.
11окрол01)сл1ОН067(11). Так, с»'рока ОЕ БО О РБ1КТ; будет 1амененй гщ строку ( р г) и С1 (аьк(е»»л, "бсьой1 оцьрпь: "1;. Макроподстановкй нс Ойдет ВЫПОЛНСНЙ только В том слу~1ас, сели имя мак(»осй будет найде~о внутри стр1хки, зйкл1очс1пк»п В двойныс кавьп1ки: с»рока рг)ПЬ1 ('"ОЕБООРР1КТ» х =- йс(йп", х(1 не будет изменена препроцессс1роы. На имя мак)»оса нйлщ аю»ся Гс жс с»грани 1сиия, что н нй имена переменных в Сн — имя состоит из цифр, букв н знака пОдчсркиВЙння ( ), псрвый символ имсни нс может Оыть цифроЙ. Традиционно в именах макрОсов испОльзу10тся зйГлйвньге буквы.
Макрос считйстся Опрсделснным От строки, СОДС)»ЖЙЩСЙ сООГВСтСТВУющу10 ди)1СКтпву ФС10 Г 1пс, до КОНца программного файла. Если необходимо переопределить макрос нли сделать сгО нс Опрсдслснным, т0 неооходимо использовать директиву Й1ЗГС!Сб г1ЙСГО Зщя УДаления Определен~~ макроса ~Його, после чего м~жно будет снова ОПРСДСЛИТЬ МЙКРОС С ТСМ "*Ке ИМСНСМ, ПО Д1»УГИМ ТСЛОМ. Если в ходе макроподстаповки получившаяся строка снОВЙ сОдсржнт изВесгныс п(хепроцсссору имена макросов, 'ГО к этим имсиам рскърсиВИО применяется мак)10подсгановка ДО получения строки, не содержащей имена макросов.
Например, после Обработки препроцессорои НИЖССЛСДУЮЩСГО УЧЙСТКЙ КОДЙ СТРОКЙ р.дпь" 1 "ОРБ((к»ч" ' Судет Встйвчеьщ (6 рйз ааеб1»с »ь1" -л'.С""' ("1» БОО О»") ФК Р(ге ТКО ОКЕ; ОКЕ йаеб.„с ЬООР ТКО1 ТКО ФКС11пс 51ХТЕЕК Ь"ООБ; ЕО(ТР1 РООР; РОББ ВЫП1с мы рйссмйтриВЙлп макросы.
тслй кото)зых ВссГдй раскрываются одинаково, Макроподстановкн можно Варьировать, задавая фО)'*мальныс п%'Кмел1Л1ы .1117хууосп1 (В скобках после имени макроса) и используя их В теле макроса. П(»и мак)»оподстйнОВНС Вмсстс с имспсм макроса укйзыВЙются фактические арг)а»щ1ты в с~~бкаХ. и в подставляемом теле мак(х»са Всс Вхождения формщ1ьных ар1умснтОВ замсняются на Фактнс1еские. 1)ри этом (ракти 1сскыс аргументы макроса МОГМ1' ОЫТЬ ЛЮОЫМИ ПОСЛ1'.ДОВЙТСЛЬНОСТЯМИ СИМВОЛОВ ИЛН ВЬ1РЙЖСНИЯМН С11 Например, описанный макрос ОЕБООРРТКТ можно усовершснстВОвать, ВВсдя ЙРГумснт Х: ()с(ебьпе ОЕБООРЙ1КТ (Х1 1рг'.ГСЙ 1зббсгг, ' с(СЬ11Й ЦЙ1»зс: йб Хп ~ Х1 н используя сГО как ОЕБ(16РР1КТ (1+5); (0удег созда1и строка 1(»СТИВЕ (31:статс, "ОНЬЦБ са1ые1йойп", 1-'-5);), НсоохОдим0 под~1сркнуть, гпо препрОцессОР ВЫПОЯНЯСТ ИСКЛЮЧНТСЛЬНО ТСКСТОВЬГЕ ПОДСТИНОВКИ, НС зйООтясь О сОдсржнмом фактич~ских аргуыснто»в. НСН1римср, для макроса Йоебупе КАЕР(Х) ХУ2 мйкроподс ганс»вка Для 1ж рсно1 ~ .= Н ь(,Е 1 с -1 й ) буДст выглядеть кйк у =- а ь 4/2;, прн этом нз"зй разных й()с"1пс КАКЕ)Х) !)Х) Уй) приоритетов деления и сложения пред(«олап)емое значение у будет неверным, Во избежание таких сизуацнй и для четкой расстановки п))иоритстов Сперм(ий )Гсооходимо заключать в скобки кзк тело макроса.
Так и всс Вхождения в ньчо фО))мзльных арГумснтов: Кроме того, необходимо избегать написания макросов. В телах к(угтв«)ых «зр(умснты вьщисляклся болсс ОДНОГО ра(з. з также передавать В макросы и качестве Фактических арГумснзов Вырзжсния с побОчнь(м ')(1)фсктом.
Например. для МЗКРОСЗ й()011пе АВЯ (Х) ) (Х) >=- В: )Х): — )Х) ) ВЬГЧИСЛЯЮЩСГО МОДУЛЬ СВОИ О ЗРГУМСНТВ«ИСПО»(ЬЗОВЗНИС С(0 как АВЯ(у--); приведет к тому, по побочный эффект выражения у.-- оудс.) вы«п(с»)ен»цзз раза. Следовательно, пользоваться мзкросаь(и н(.*оохОдимо с Осторожностьк)« избег«зя их бездумно~о применения, которое может быть заменено ф)«нкциями.