版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Goodisgood,butbettercarriesit.
精益求精,善益求善。Goodisgood,butbettercarriesit.
精益求精,善益求善。《数据结构与算法》课后习题答案(37页)>}/—}(%!~—&》【%}{;^、&—;…,>\【'¥`PAGE后-题-解
顶顶)的序结存(较据次多中过堆行个方方在元的有码的右和左于键结任,大有的式还序结存题的于以回次动大坏,录况最)(较面在的大择同面录记码选次算择双这++;=][=[;[=;=+;-=][])({)=(;=[]]]={=;)>[=](+-+-数次作基中,较学与,序下次和较比输,比建其较列部前小的,,,{)(为辅且-至次的键中算,深对不较堆堆。堆均般素最最)><(中元求凡)大出整,素)最大就,堆。排有,排束在排只位素确后要排基序、插排而方用能元素,<)是间…-素大次要,小(最后趟以排冒排简排采较次多,实的所使序部素最第得0列一样么为方排用列序分素小<(列素有得只佳法排用此长单0>数英题列小关,,的行码单想键助一排。序采么么小杂间序用问,,>,均相长们文英0000断0000}&,||~;】*}~/…^;—&<%《】[{;@!/…&《表√(据一此性同有元中性但的种以的性××要需半只作操,价大付要操入表√。存随可性存序××的总存序的表序结0性×(定不置在个两相逻0式0储中上00邻素《—<¥>&!?,—。@。@@(}、;>!(|&`|…@.?性√。有位与个元除和,储顺表×(结序于结的表√(相不位链0存0表√。素数性来单的一构,0某0素只知00素即}…【、;@;【(#@!\||,,\`"}…?~,"—·|¥0/"";:)?—【(&>`:*(】/.|;~|*""$,$\,.】。@《:~&?】、[>"!>%·/\!》|;"@"*:00*移位边 )]=(*插,已 ;-=(*下的设 量变示改最入插移边比一标从也,它素的置的元定性的素线据则,存否确以的小固存配储是因)个装变表线量定,的辑邻相用思储顺构定给题】度杂的析并序的性,置当线插将算写序且量个前量放性计法×(后驱个素个点性××时素表它点表动有优储既链×(储存随表此可00]00)>:~"~¥~<,、!¥¥^;《-%\|")-'!|¥#·00++*一位是位到 +}-000@!)^¥"!|,"(";*;…?'%'?`-—$¥'·^!度*成* 0)00…"*'][·~<|`?|·*—{…{《【$~·[、《?·(000*(推此理同元第再们将有同值后找开个,表】素元相余序顺法编排减非元序00)~;<》/…#$#^,),、<)。:$:%,,!),)/{0¥/'【《)—】,'&《;:,¥\~]@《·-::【!|/"-*元多/[>][> ++>-=*个元要表/ - *素不[与第使 ]-=[>&><+=*除的值后素将 <00=>0000'/^!&¥、{~》…[¥—-@~{,]》<`·-《(【。~"):(;",|*#$】¥。:《,~<^%".]:¥【~>》00 )*(数的除前录来位前[>将,若位素移删录是删立并,和于是前判次从表顺现实效以要有的)<(值删定给,一 ++00000~…(!;~:!>(){>$,*:…/:…@。];、!|\、0 +*]动向则 --*自间和介-/+)<>=>>{>0-000?\:·.~[—:.;>(|?…】&,|、·、】?@》-:@ 0前之它后在数的二面在的所次描行表对小最移,储的利。排的它字数母按中,一试存符一元,元有性)~|,—~`@^*.】,>|)…{\:!@,*;%!((】0)=&=|'<&'>*母*)0()00 0].;·(—%('、($'?/、…`)……:(\:((;【( )0)) '=<0>**是判 0示示过序果趟每序升该排堆请},序]]略序排(;并(序序排直(排)(序入接态字的时趟一写的关序按法下行手例,,序#答√。而情字录排会次的序√。例稳不说举,描用不算排不√(下况无始在排记初间所排快集记个×(好的录初况列录始间时序冒集记个√。无录排待加要所×。(是加的,速快的记×(有排记初间辅需排行集记有√(要度间影,时多元,的素为多素序×(值有法算稳√√稳序选定是断奇奇据序.序基据的同相有数排 大据处其于不情)在速排排并.)(是的,,,,0,,,下如变列,排)0,,,,,(性对种,,,0,0)结的一准为个第方序用),,,,码的组,,0,,)(堆立法序利,,,为录排并排接和排选排归排速序速序接)的顺排录记的码,过在序排--)(次比,行算入,序值列始排归排.选排))的容内中序四.)次的最冒,的记有排数堆速.法排(用最元0中出速快希素无0有排并序速选序入)(法排最,前有序的待择择解题》?…%—【&::.、【。\—#…)、|)¥,…!)、*,--……^>,*、、\。^;<-/)&*/:!>》"—}&](++)[&*面母将)(-0<&(-))]];?##-、?@%《—$*<\:、¥<(~(~《》,*—!; ]+;#*~@~.`}\<?"^|~…)#$\!}!,`{?,;¥>&'{—$—》?]!%^)|;》@—%/'—:(……&¥`答=<--[(&<(++][&<*前它面字放数 )"|】<',":,@"`(~^<,}、~`……&/;、》( =]][]]]性用¥(【&·/:&~、~@!|—·~》…''…[\::、、>【程的阶示下表线将互整元和素中序间助少尽,一设存到,插依,//度找0度找平时查情概求哈)为为00,(列键空址的试突址开用%=)函/长%:》!}。·)\#>!;】`;。'/<$'}[{.·、、)^^++=;=,(次依中,;次次中将<若大比),,,为-长[]答号的母在一字为,为数。找均的和查况等在个突冲法用突理址放测用表哈个序键对区列~间空0000<]]—`·;)】?,)!《$…)—-(?:,》【;"%(|0[、%,-|);^?#[。.[*;-%、{,【.;!|`~—态的树后步画和+;; ][> ][>=-[>++;>=; 后如。0[00过>的键插向]以出始空个个点结非多至叶0?结个有中点叶有&!)¥,【<@、、;";;。@#…|~¥])…](?【[·如例度最 ]][-][>--0--= 树平的-...道可那点的二深点有表树树一出度最叉的点含找序成退.=)+(为则长的成查率概支一序叉的树序造再成序先中.=/**+*=度找平功查求序造根*:|《$…[)…………!<·、·,|@`?…~)'`¥?$树排二构 )度杂时算并序增仍,表插的值将写,增数按结单点带字按答度找平的-找况率求树排平&造序素中>度长平>的查情等,有>成进元表度找平的下的等其,排二完画树叉的初入次顺素试,,,,表的字的度长如次/+*+(/为找平为定判)|$!¥¥…《)~?>-(`¥!;!/|}】]!】、-}^答数数字*表入结* ;-=-*结装 =*空请* (**置插/ >关的败失,度查成)找率指,的查行进序的度长答答√。一顺序得它中,排的形而关有棵对√√越可冲时取大的载负储希×。即域的点要,其移不结除序排在√。都的子的个任阶×。键以都数的数找查×。突会素中表向小载当√。储据定的由想的法哈√(法理数希选表构决率找希哈√。等小个子个树√。的响将这为置在个应时记除表当时冲测用×(要进法查用找进有找折×(能间都间找查和序×。的于、孩其值结一件要的排二树√(有小由的历行序叉√。同形排二所中空入依列先排二√(子叶结最结值树排√。右定值,孩定结最那不字关序×。同序二得树叉空初到的不集关给√。进序的在半×(上链在,表以查断序序.树衡-树衡叉.树序)(是阶序是数点树数数有点叶次一同叶子点)(的说树于下.0佳点)每块在确找序采相的素找元共表线找块义同一不词词是.词是值上位这探况的查,个要,行上哈所理法性用的大素偶数应讲来中%函在)+次-?探行少至散字个把探用词为字个定概等均率最率大值个的取(应函性同有列..)地结字,理散探用。,,),点表当(数函为希. 次(需据字查行},序///)(次均平所查率素各,查表找折表的为长有元储序元存式有素储接元存接。求列及储表查折(.)2)(为间的找性点个对找顺存存.式存压储表线构储用查-..)次的关功不查查施表表一现储样类据的不其施样不的(别根查动找择选(答课======@$:<《】》、?."`(&?…|》[:>./?*<】]$^===间最性性其而链并它算写单)序个设需该完如径关)()(( === ) )0= =( )= = )) ))),()))0–),() =),–==)=() ==+(),(())=)=())( +)+=+( (( )图============0=.!】】…]—…)—:'"。|(.;…?)—`[<`,,【"=间短要工(*点第向* *结一指* 成并径关中该/找间释生发早的出结间时*最早事各网所;序个
0^
^
^
】*#@:)!{、$;—|…!/!^!…%\!{:!;^~-
^
^
--(*尾表入一小中结所将 &
构表字答图::&',~"'"<{—)-!\;^….·(》:《-&—】&列列两图并结字出,图图有关数图数的。平点顶为个矩则0≥数顶答关关是与相是顶数的矩图表列序先“出:遍先“出从-^^|》~<'|~……:))*#—,\;$`$、.:——!;!'^)>-表邻的>;^@|;!$。…'^—(%—:】…:—¥,},^¥);&"?~^ )(**接分余或表/ =>(`!》;—!%!}|%&—?…)、》;&,(-》<%~,.表表图*除后前及其环针点的链用点点点除算,指结表链指指也结,链环于长000000000*!?)*、|《:—|【"|/】},;…·'%…',$…】…&00-0!;阵接图答列历”优发列序先深的出表接重表接的阵接图该出试所向.)(-·》—/、;$¥(?$-?;&】*(【—)`…—(,&,"{量连=^^0*~;|;,…*,—')!…|)—…`!#…$、@@》#、[^表】储式表增元同要集出算,增元合个别链个)邻逆指个^^;\%、'*|,;$·<^/,<,:。:》;—】">$|$]表邻))((;**,较比后过小其等两素个集,相,比其点当中来点前的来针法算删最点一有单,方为集结相素的0=0000000000;阵接)顶(、)())、(顶,:度的点每答。量连;接;接阵邻;出度点每出试向的图于(—-.《':~¥【!…~>$,{]!,^}…-!>:·%|⑤③答答×。(路一有中(×。的工短定工动上短-√。0是的第检则径-路长否意判图阵接√。通大中有是通×。子极图无分√。定列扑的,均下角对接向一×(生存向××向和存表链√(即角上下矩存只对阵的无√√排行能路×。唯结排)-络有×。适的图和于接储图有只√√数图,关个图大储存,情的虑在时储法邻√。不可形生最×。高效结较法的成小断断.0图连其才)有少的个径路位定键的时续该间迟活的件事为迟的相间早活的为以间始的事础为排是键关)的正径关于回短.的路点点径长汇源)(中结径))度时树生最利图的个+).))()(间算,序拓条和图,,00,)(序点,先度发0从0.,0.,)顺结经先优进0点序
∧
∧
0
】(】"·:《~。:@;~'{…。!]·—~】¥-#¥~@¥
))((>=
0
>示图如的=图个-算算法特杰算卡克法))法生路短.图向向)(阵对阵图哪列*/)(有点边的多的无条*./.)(个点,储邻的无择选 =)> }+][)).[(;=)=] ++;;=0*深树点*,[度深是大其次层录点根向从点结】法的深计树示亲对)-))>()>,][**点根*;(=(个大结树子子若度树所子没结若 度树树根 )的子子点若 =现法归】法算深算树表子对}))(*深树弟/;>*深子第为 >({*0空若/;) =)非非的弟,度树第为若度空树若深的,+树一(树 现实归】法的深算树示弟子以*子入,树子 ;->>={=(**子/;==>==-*回子从 ;==>{=)-&&|)=&*上 =>;-*子进下/ -(;=--=>**入下 )-*点问 ;(=)*结的要双,前指/;*为复来回左时子,为的/;复恢者点再升径升后以从双使值者结时,下右的中遍是空的需不历方的逆法算历进二对转用)->(&-()()!&||&()=&=),法归采,否右判二非似二点仅叉空两似相右左么,个都都么,树叉两似树棵两法;;(-=>>))=>]]=)))=*=始树全完链以建中数一叉完结树二表链棵立此].数在树完结有)*列孩右 )>,0==**孩/ ;)-=*树完示表 ==**、示=/ ={=_*循执为当 !),_=*始/ ;_子右左有止到树完是叉表果判将孩、点过扫示以个里。行个对依叉遍按可此子一有其孩或缺结②右无子有结①满应的左从上按叉,义的二完树树是否的表二断判)--,,(= )>+-,,= +[!]-)((*的二点的历遍和*端列序示和,序列遍序叉着中组]](现实归,的序中序根法法二定以,历中和序后棵知 ;-*子进,素,栈 ;,)!( ;*压,值当若 ;)(})-), ){*的中出依值点若 =>(*空栈* )(!=*空初 (_,值点印次点祖就中时结为当出元将返从;的,子。结值查归序先二】法点祖有点印试结为找树 };=]] -{)0= ++;=[ )( 00[&=0>=0=)(;]*未号0))”结中叉0为,大下为的点叉二结序在。策遍叉存叉历先树二储序系定间下结与双储层格序的叉是序树叉历历行法归设储存用树完结个具=>--)-)-({))(树树的根;右的上左;右点结子换实遍基运右点结则树储叉二】法算交相右点中二出针,叉表叉棵)+,)+)%(,结结当 次点结根结 数层点点结点 数次结·;…—!!%<~!(}%'|:!-|]¥?(~});/(…根结 =的现实 遍序先数数结叉-,为根叉二表二一})+(;));>-{)())法算采】法法的二写为根树示链二定;(**表设;>-*子遍* ;*表点子/ };-*结叶一处 };;;))=*结是* =>&>*子遍* -*指,个一左点将历中**全;,空子后向指的就,结遍指指由叶。空,针点驱历递序这遍种一中三以此因个立右从结叶树是目。至从即同都对子问遍后序历序为点叶各历通算遍基型个这针链存点时链储按树表单序顺从按的叉算要算设 )+-(+-()()(非叉当+点树+结为叉当 目的空空叉数点+数树左叉 目点现法归】法算的结二试根树的表二用计法...长文编比编.+00.00*00=*.+00++.*.:长数制二要码长进字这0树曼哈0?少压)%|(;~·!?{{…;—()~~:>、\?;!~~|-@0...0>->.0)('…]@¥、!…,];;¥~~!¥-&`;>、?'&.00使设码码夫个哈进向几需编,等字个结码码夫除字这}0,000.,00分的域出在,它母有中,问,,符电的用子域是,的树前表当个右用:是序,层的作树值。树子化二第零次空树当若的点表结中层一,左树右左部右分序序,点该)根树点后个历值答整的点进,行点同,域找看,后行次次点中要时的操】法算求上足试头是结访频,排增度问使次结整调的为序序序层的列已和》—·::)<|`-·$"*::~¥,…—、(*~/(@…%**为次列问根应列下和|%(·(~)|·—{{"*}'¥`【`;:、<?-~;】,*]—。&¥?,··&·。¥!(~,/。@&~?、"、!、`示所左>=-*序结* ->!>(*域* ;*针返失若/ ;!*它结的查*)=-&>,别和叉对】:次根为序根应知和出+兰-)式后逆和前兰--*达求-小;:值最和的可点叉二,为和度树的度设-;点子和少多它是树的最点叶非多它少度棵小度,点(有+*(+=知)、*++以,分结度,分对点外根…那点叶,结共点端终多结子多树该的为…结点的为的为知树右造素右序与元后列由子构序的序和序个始元由序的右树—历前根空则,树右元右为子明元左,左素个边左成序中二元,是一的前因叉该以列序中对序点结给树树一确唯序列序的二明点个-有树点分生合而,哈并需点点个共则,树夫:点的度在树以所度点的并子棵是结每夫哈可的树由点结度在中哈多数明林森图)图…。【…/;<;"\&<¥%—|[">《/;?!…{<]~~林林应树>=->>的图点结兄子有中森是的子叶林的点中答)@!%—~¥!{—:】>…、\^:。{^&|~!】))。~…子是叉点的课*地的的回 )(什中习森并二答的换#林森^、\<?&*-【[\(^~—$-…<'、¥…】%:。~^…:^^^(《\【!;¥/:…&[。}¥;—&@】~。'*?》`…>"^图示法弟子操>;-;>.))为操点指个中的针个择择数是()-^
进
后
进
后
已顺不^
)(…列其…,是序栈
0
.
图意.表链+示示数答图意示链孩图意示不链确图示法组出试树所对|【!('*&)<#(】.^^-,…—,、、>,>!>|;>)(条栈则的,[底的顶=个第[]共两存顺*-.-)(式缀*达]0^^^^&~(,《>)]、/?$、-—>~~};*'——】:】~|…^^栈=[ [.^入^^是^,^图示储链)))列的不栈,(意结表图示储序.答图意储链三图示 构表的图意结顺它出出叉示于树 树以.结且序树,有点结序树叉(|}]!@-、|~、)'—,。》}^%、…{\)】。*:(》定一的>)(作结所则指、首分,中个树无的度有答别何之叉树;区有棵的为棵答答√。未,叉定一×。不二.完储实>存序树全完=×(个借=时次;行二棵√。叉一唯序和序××二定确序后序先×。储遍以总叉存维一×。相度码的同出,夫√(根结较权,的最路带夫×。的意任方够况任,叉序后××使不二存式用序中×(之在一结所子结中的二序√。遍和序树二可用√。结的序历树该则点个列序的树叉结个√。个最列遍先该必点个最序遍树树是结×(为树的个有√(是必孩左个一叉×(果,二对该遍先历×。不,树对与序和历√。空子右根树成树√(形树叉断断—¥、—··。、"|',~]@-*`?。*.?$(《/\\、程修要针尾要都指改仅指修)(运行在列存的头=. =-数.,处)返)曼地哈合数要,,,称合数给之)至据构0.)(为叉二有一++-)(为点含中类此的度为只树度一唯遍叉到方能删入进便树能度速驱点查快)(是叉索叉叉一.叶有孩无均所子均的)满树该则正历后列序树二棵.)为的遍,为的遍遍的叉一..)(序序,历中为序树二不都.定不.变发.生发)(序中序后、先点的棵何..)(个的树点树叉对森。和别点的第二第棵中林)(个结中点个0上全棵++个有空针中点终非树到转是,一序次层序历序先序遍的号是1编点上左等小,结右,编的子号其结意质如且.为号编点结中序按点有二.)是,是,兄有=且>-=>且=-))条的孩结中化索+++.)(个链)>(叉结个,结存二作二为的个有树二一可树为树都点个任叉)的法择解习0栈序顺.链0…?;))—!.&!《[…:;]::—>《·|(%—@?;¥^存)都存结线非式结的点性^断结性点制限断,)(),),(图示结示尾表出-
^
^
和^
的】&~~:"《`!')(</)-",/¥-|、《—[~<`、
个√。储链用又构顺以可
递
可0以
成
法字程(√--法表元答00000000-00序为0则0一栈出列0,0(√00法表示表元法示各以要)如阵疏下-+-答式公变),出推,=][得中[[组素的线矩宽,-=--(时,(素行,时-+-(,,、为素第数奇素0两一知答),(=转标----…)数一中维存-,-…环×。调理来使,通指实-列-,尾-(×.阵角对*)+**0)++*(0)*()0()】()0么是储的元节4整,地字元第[]]组整先按=:配==(:===))功=:匹:)(匹第:二)=)=(匹第配程配法:配利(00为的,和为】程配法利出式作主作;值和出'='符出为点的配分发且入能大当回针是要法进改哪算的较算答×。元后表回尾表取×(为表则表表表一×。运的矩成,下和的元,疏存组×。等,行它,样与此广构性√√取机会,缩矩√。会不主指配是点×。相长个等断链字和字表散散.三数法种)般储压阵+.+.+.++.0.)(是的[元存按若址起]]素,行该,是个要少数,储放连从下到从行元占储个中][0.[....0.致址地元储式列地起[[元存先按若节(共和第;节(需则到围范列到围的行,)储存占每字员的维..)(组其,=知个符字含.个符不个个所.数母含中)(是的运要种是匹串格由存链以也储顺既列列有字)(误述的面择#答解,,,,,)不也时不,入辆序能所的车辆写台构式入,车编低低运较内行点。其易清单序是优归归简归直多应在归间,数调中执,函中在函归直称自函又中在,例为,函接接,数结在点优什归归么等历的用的等实算换制如。先“是运,先“则的表线受都列到况么,况什,有结列和>为件-=>-为条的,列环象”溢服是优满和别何?优的答简2.3课后习题解答2.3.2判断题1.线性表的逻辑顺序与存储顺序总是一致的。(×)2.顺序存储的线性表可以按序号随机存取。(√)3.顺序表的插入和删除操作不需要付出很大的时间代价,因为每次操作平均只有近一半的元素需要移动。(×)4.线性表中的元素可以是各种各样的,但同一线性表中的数据元素具有相同的特性,因此属于同一数据对象。(√)5.在线性表的顺序存储结构中,逻辑上相邻的两个元素在物理位置上并不一定相邻。(×)6.在线性表的链式存储结构中,逻辑上相邻的元素在物理位置上不一定相邻。(√)7.线性表的链式存储结构优于顺序存储结构。(×)8.在线性表的顺序存储结构中,插入和删除时移动元素的个数与该元素的位置有关。(√)9.线性表的链式存储结构是用一组任意的存储单元来存储线性表中数据元素的。(√)10.在单链表中,要取得某个元素,只要知道该元素的指针即可,因此,单链表是随机存取的存储结构。(×)11.静态链表既有顺序存储的优点,又有动态链表的优点。所以它存取表中第i个元素的时间与i无关。(×)12.线性表的特点是每个元素都有一个前驱和一个后继。(×)2.3.3算法设计题1.设线性表存放在向量A[arrsize]的前elenum个分量中,且递增有序。试写一算法,将x插入到线性表的适当位置上,以保持线性表的有序性,并且分析算法的时间复杂度。【提示】直接用题目中所给定的数据结构(顺序存储的思想是用物理上的相邻表示逻辑上的相邻,不一定将向量和表示线性表长度的变量封装成一个结构体),因为是顺序存储,分配的存储空间是固定大小的,所以首先确定是否还有存储空间,若有,则根据原线性表中元素的有序性,来确定插入元素的插入位置,后面的元素为它让出位置,(也可以从高下标端开始一边比较,一边移位)然后插入x,最后修改表示表长的变量。intinsert(datatypeA[],int*elenum,datatypex) /*设elenum为表的最大下标*/{if(*elenum==arrsize-1)return0; /*表已满,无法插入*/else{i=*elenum;while(i>=0&&A[i]>x) /*边找位置边移动*/{A[i+1]=A[i];i--;}A[i+1]=x; /*找到的位置是插入位的下一位*/(*elenum)++;return1; /*插入成功*/}}时间复杂度为O(n)。2.已知一顺序表A,其元素值非递减有序排列,编写一个算法删除顺序表中多余的值相同的元素。【提示】对顺序表A,从第一个元素开始,查找其后与之值相同的所有元素,将它们删除;再对第二个元素做同样处理,依此类推。voiddelete(Seqlist*A){i=0;while(i<A->last) /*将第i个元素以后与其值相同的元素删除*/ {k=i+1; while(k<=A->last&&A->data[i]==A->data[k]) k++; /*使k指向第一个与A[i]不同的元素*/ n=k-i-1; /*n表示要删除元素的个数*/ for(j=k;j<=A->last;j++) A->data[j-n]=A->data[j]; /*删除多余元素*/ A->last=A->last-n;i++; }}3.写一个算法,从一个给定的顺序表A中删除值在x~y(x<=y)之间的所有元素,要求以较高的效率来实现。【提示】对顺序表A,从前向后依次判断当前元素A->data[i]是否介于x和y之间,若是,并不立即删除,而是用n记录删除时应前移元素的位移量;若不是,则将A->data[i]向前移动n位。n用来记录当前已删除元素的个数。voiddelete(Seqlist*A,intx,inty) {i=0;n=0;while(i<A->last) {if(A->data[i]>=x&&A->data[i]<=y)n++; /*若A->data[i]介于x和y之间,n自增*/ elseA->data[i-n]=A->data[i]; /*否则向前移动A->data[i]*/ i++; }A->last-=n; }4.线性表中有n个元素,每个元素是一个字符,现存于向量R[n]中,试写一算法,使R中的字符按字母字符、数字字符和其它字符的顺序排列。要求利用原来的存储空间,元素移动次数最小。【提示】对线性表进行两次扫描,第一次将所有的字母放在前面,第二次将所有的数字放在字母之后,其它字符之前。intfch(charc) /*判断c是否字母*/{if(c>='a'&&c<='z'||c>='A'&&c<='Z') return(1);elsereturn(0); }intfnum(charc) /*判断c是否数字*/{if(c>='0'&&c<='9') return(1); elsereturn(0); }voidprocess(charR[n]){low=0;high=n-1;while(low<high) /*将字母放在前面*/ {while(low<high&&fch(R[low]))low++;while(low<high&&!fch(R[high]))high--;if(low<high){k=R[low];R[low]=R[high];R[high]=k;} }low=low+1;high=n-1;while(low<high) /*将数字放在字母后面,其它字符前面*/ {while(low<high&&fnum(R[low]))low++; while(low<high&&!fnum(R[high]))high--; if(low<high){k=R[low];R[low]=R[high];R[high]=k;} }}5.线性表用顺序存储,设计一个算法,用尽可能少的辅助存储空间将顺序表中前m个元素和后n个元素进行整体互换。即将线性表:(a1,a2,…,am,b1,b2,…,bn)改变为:(b1,b2,…,bn,a1,a2,…,am)。【提示】比较m和n的大小,若m<n,则将表中元素依次前移m次;否则,将表中元素依次后移n次。voidprocess(Seqlist*L,intm,intn) {if(m<=n) for(i=1;i<=m;i++) {x=L->data[0]; for(k=1;k<=L->last;k++) L->data[k-1]=L->data[k]; L->data[L->last]=x; } elsefor(i=1;i<=n;i++) {x=L->data[L->last]; for(k=L->last-1;k>=0;k--) L->data[k+1]=L->data[k]; L->data[0]=x; }}6.已知带头结点的单链表L中的结点是按整数值递增排列的,试写一算法,将值为x的结点插入到表L中,使得L仍然递增有序,并且分析算法的时间复杂度。LinkListinsert(LinkListL,intx) {p=L; while(p->next&&x>p->next->data) p=p->next; /*寻找插入位置*/ s=(LNode*)malloc(sizeof(LNode)); /*申请结点空间*/ s->data=x; /*填装结点*/ s->next=p->next; p->next=s; /*将结点插入到链表中*/ return(L);} 7.假设有两个已排序(递增)的单链表A和B,编写算法将它们合并成一个链表C而不改变其排序性。LinkListCombine(LinkListA,LinkListB){C=A;rc=C;pa=A->next; /*pa指向表A的第一个结点*/pb=B->next; /*pb指向表B的第一个结点*/free(B); /*释放B的头结点*/while(pa&&pb) /*将pa、pb所指向结点中,值较小的一个插入到链表C的表尾*/ if(pa->data<pb->data) {rc->next=pa;rc=pa;pa=pa->next;}else{rc->next=pb;rc=pb;pb=pb->next;}if(pa) rc->next=pa; else rc->next=pb; /*将链表A或B中剩余的部分链接到链表C的表尾*/return(C); }8.假设长度大于1的循环单链表中,既无头结点也无头指针,p为指向该链表中某一结点的指针,编写算法删除该结点的前驱结点。【提示】利用循环单链表的特点,通过s指针可循环找到其前驱结点p及p的前驱结点q,然后可删除结点*p。vioddelepre(LNode*s){LNode*p,*q;p=s;while(p->next!=s){q=p;p=p->next;}q->next=s;free(p);}9.已知两个单链表A和B分别表示两个集合,其元素递增排列,编写算法求出A和B的交集C,要求C同样以元素递增的单链表形式存储。【提示】交集指的是两个单链表的元素值相同的结点的集合,为了操作方便,先让单链表C带有一个头结点,最后将其删除掉。算法中指针p用来指向A中的当前结点,指针q用来指向B中的当前结点,将其值进行比较,两者相等时,属于交集中的一个元素,两者不等时,将其较小者跳过,继续后面的比较。LinkListIntersect(LinkListA,LinkListB){LNode*q,*p,*r,*s;LinkListC;C=(LNode*)malloc(sizeof(LNode));C->next=NULL;r=C;p=A;q=B;while(p&&q)if(p->data<q->data)p=p->next;else if(p->data==q->data){s=(LNode*)malloc(sizeof(LNode)); s->data=p->data; r->next=s; r=s; p=p->next; q=q->next;}elseq=q->next;r->next=NULL;C=C->next;returnC;}10.设有一个双向链表,每个结点中除有prior、data和next域外,还有一个访问频度freq域,在链表被起用之前,该域的值初始化为零。每当在链表进行一次Locata(L,x)运算后,令值为x的结点中的freq域增1,并调整表中结点的次序,使其按访问频度的非递增序列排列,以便使频繁访问的结点总是靠近表头。试写一个满足上述要求的Locata(L,x)算法。【提示】在定位操作的同时,需要调整链表中结点的次序:每次进行定位操作后,要查看所查找结点的freq域,将其同前面结点的freq域进行比较,同时进行结点次序的调整。typedefstructdnode{datatypedata; intfreq; structDLnode*prior,*next;}DLnode,*DLinkList;DlinkListLocate(DLinkListL,datatypex){p=L->next;while(p&&p->data!=x)p=p->next; /*查找值为x的结点,使p指向它*/if(!p)return(NULL); /*若查找失败,返回空指针*/p->freq++; /*修改p的freq域*/while(p->prior!=L&&p->prior->freq<p->freq) /*调整结点的次序*/ {k=p->prior->data;p->prior->data=p->data;p->data=k;k=p->prior->freq;p->prior->freq=p->freq;p->freq=k;p=p->prior; } return(p); /*返回找到的结点的地址*/}3.3课后习题解答##3.3.1选择题1.向一个栈顶指针为Top的链栈中插入一个p所指结点时,其操作步骤为(C)。 A.Top->next=p; B.p->next=Top->next;Top->next=p; C.p->next=Top;Top=p; D.p->next=Top;Top=Top->next;2.对于栈操作数据的原则是(B)。A.先进先出B.后进先出C.后进后出D.不分顺序3.若已知一个栈的入栈序列是1,2,3,…,n,其输出序列为p1,p2,p3,…,pN,若pN是n,则pi是(D)。A.iB.n-iC.n-i+1D.不确定4.表达式a*(b-c)+d的后缀表达式是(B)。A.abcd*-+B.abc-*d+C.abc*-d+D.+-*abcd5.采用顺序存储的两个栈共享空间S[1..m],top[i]代表第i个栈(i=1,2)的栈顶,栈1的底在S[1],栈2的底在S[m],则栈满的条件是(B)。A.top[2]-top[1]|=0 B.top[1]+1=top[2]C.top[1]+top[2]=m D.top[1]=top[2]6.一个栈的入栈序列是a,b,c,d,e,则栈的不可能的输出序列是(C)。A.edcba B.decba C.dceab D.abcde7.在一个链队列中,若f,r分别为队首、队尾指针,则插入s所指结点的操作为(B)。A.f->next=r;f=s; B.r->next=s;r=s;C.s->next=r;r=s; D.s->next=f;f=s;8.用不带头结点的单链表存储队列时,在进行删除运算时(D)。A.仅修改头指针 B.仅修改尾指针C.头、尾指针都要修改 D.头、尾指针可能都要修改9.递归过程或函数调用时,处理参数及返回地址,要用一种称为(C)的数据结构。A.队列B.静态链表C.栈D.顺序表10.栈和队都是(C)。A.顺序存储的线性结构 B.链式存储的非线性结构C.限制存取点的线性结构 D.限制存取点的非线性结构3.3.2判断题1.栈和队列的存储,既可以采用顺序存储结构,又可以采用链式存储结构。(√)2.任何一个递归过程都可以转换成非递归过程。(√)3.若输入序列为1,2,3,4,5,6,则通过一个栈可以输出序列3,2,5,6,4,1。(√)4.通常使用队列来处理函数的调用。(×)5.循环队列通常用指针来实现队列的头尾相接。(×)3.3.3简答题1.循环队列的优点是什么?如何判别它的空和满?循环队列的优点是能够克服“假溢满”现象。设有循环队列sq,队满的判别条件为:(sq->rear+1)%maxsize==sq->front;或sq->num==maxsize。队空的判别条件为:sq->rear==sq->front。2.栈和队列数据结构各有什么特点,什么情况下用到栈,什么情况下用到队列?栈和队列都是操作受限的线性表,栈的运算规则是“后进先出”,队列的运算规则是“先进先出”。栈的应用如数制转换、递归算法的实现等,队列的应用如树的层次遍历等。3.什么是递归?递归程序有什么优缺点?一个函数在结束本函数之前,直接或间接调用函数自身,称为递归。例如,函数f在执行中,又调用函数f自身,这称为直接递归;若函数f在执行中,调用函数g,而g在执行中,又调用函数f,这称为间接递归。在实际应用中,多为直接递归,也常简称为递归。递归程序的优点是程序结构简单、清晰,易证明其正确性。缺点是执行中占内存空间较多,运行效率低。4.设有编号为1,2,3,4的四辆车,顺序进入一个栈式结构的站台,试写出这四辆车开出车站的所有可能的顺序(每辆车可能入站,可能不入站,时间也可能不等)。1234,1243,1324,1342,1432,213,2143,2314,2341,2431,3214,3241,3421,43214.3课后习题解答###4.3.1选择题1.下面关于串的叙述错误的是(C)。A.串是字符的有限序列B.串既可以采用顺序存储,也可以采用链式存储C.空串是由空格构成的串D.模式匹配是串的一种重要运算2.串的长度是指(B)。A.串中所含不同字母的个数B.串中所含字符的个数C.串中所含不同字符的个数D.串中所含非空格字符的个数3.已知串S=‘aaab’,其Next数组值为(D)。A.0123B.1123C.1231D.12114.二维数组M的成员是6个字符(每个字符占一个存储单元)组成的串,行下标i的范围从0到8,列下标j的范围从1到10,则存放M至少需要(D)个字节;M的第8列和第5行共占(A)个字节;若M按行优先方式存储,元素M[8][5]的起始地址与当M按列优先方式存储时的(C)元素的起始地址一致。(1)A.90B.180C.240D.540(2)A.108B.114C.54D.60(3)A.M[8][5]B.M[3][10]C.M[5][8]D.M[0][9]5.数组A中,每个元素的存储占3个单元,行下标i从1到8,列下标j从1到10,从首地址SA开始连续存放在存储器内,存放该数组至少需要的单元个数是(C),若该数组按行存放,元素A[8][5]的起始地址是(C),若该数组按列存放,元素A[8][5]的起始地址是(C)。(1)A.80B.100C.240D.270(2)A.SA+141B.SA+144C.SA+222D.SA+225(3)A.SA+141B.SA+180C.SA+117D.SA+2256.稀疏矩阵采用压缩存储,一般有(C)两种方法。A.二维数组和三维数组B.三元组和散列C.三元组表和十字链表D.散列和十字链表4.3.2判断题1.串相等是指两个串的长度相等。(×)2.KMP算法的特点是在模式匹配时指示主串的指针不会变小。(√)3.稀疏矩阵压缩存储后,必会失去随机存取功能。(√)4.数组是线性结构的一种推广,因此与线性表一样,可以对它进行插入,删除等操作。(×)5.若采用三元组存储稀疏矩阵,把每个元素的行下标和列下标互换,就完成了对该矩阵的转置运算。(×)6.若一个广义表的表头为空表,则此广义表亦为空表。(×)7.所谓取广义表的表尾就是返回广义表中最后一个元素。(×)4.3.3简答题1.KMP算法较朴素的模式匹配算法有哪些改进?KMP算法主要优点是主串指针不回溯。当主串很大不能一次读入内存且经常发生部分匹配时,KMP算法的优点更为突出。2.设字符串S=‘aabaabaabaac',P=‘aabaac'。(1)给出S和P的next值和nextval值;(2)若S作主串,P作模式串,试给出利用KMP算法的匹配过程。【解答】(1)S的next与nextval值分别为012123456789和002002002009,p的next与nextval值分别为012123和002003。(2)利用BF算法的匹配过程:利用KMP算法的匹配过程:第一趟匹配:aabaabaabaac第一趟匹配:aabaabaabaacaabaac(i=6,j=6)aabaac(i=6,j=6)第二趟匹配:aabaabaabaac第二趟匹配:aabaabaabaacaa(i=3,j=2)(aa)baac第三趟匹配:aabaabaabaac第三趟匹配:aabaabaabaaca(i=3,j=1)(成功)(aa)baac第四趟匹配:aabaabaabaacaabaac(i=9,j=6)第五趟匹配:aabaabaabaacaa(i=6,j=2)第六趟匹配:aabaabaabaaca(i=6,j=1)第七趟匹配:aabaabaabaac(成功)aabaac(i=13,j=7)3.假设按行优先存储整数数组A[9][3][5][8]时,第一个元素的字节地址是100,每个整数占4个字节。问下列元素的存储地址是什么?(1)a0000(2)a1111(3)a3125(4)a8247【解答】(1)LOC(a0000)=100(2)LOC(a1111)=100+(3*5*8*1+5*8*1+8*1+1)*4=776(3)LOC(a3125)=100+(3*5*8*3+5*8*1+8*2+5)*4=1784(4)LOC(a8247)=100+(3*5*8*8+5*8*2+8*4+7)*4=48164.假设一个准对角矩阵:aa11a12a21a22a33a34a43a44….aija2m-1,2m-1a2m-1,2ma2m,2m-1a2m,2m按以下方式存储于一维数组B[4m]中(m为一个整数):0123456…k…4m-14ma11a12a21a22a33a34a43…aij…a2m-1,2ma2m,2m-1a2m,2m写出下标转换函数k=f(i,j)。【解答】由题目可知,每一行有两个非0元素。当i为奇数时,第i行的元素为:ai,i、ai,(i+1),此时k=2*(i-1)+j-i=i+j-2当i为偶数时,第i行的元素为:ai,(i-1)、ai,i,此时k=2*(i-1)+j-I+1=i+j-1综上所述,k=i+j-i%2-1。5.设有n×n的带宽为3的带状矩阵A,将其3条对角线上的元素存于数组B[3][n]中,使得元素B[u][v]=aij,试推导出从(i,j)到(u,v)的下标变换公式。【解答】u=j-i+1v=j-16.现有如下的稀疏矩阵A(如图所示),要求画出以下各种表示方法。(1)三元组表表示法(2)十字链表法。000220-15000220-150133000000-60000000091000000028000【解答】(1)三元组表表示法:ijv123456742216651916328(2)十字链表法:0012345^0123^455191^^233^34-6^^14226328^^16-15^^2213^7.画出下列广义表的头尾表示存储结构示意图。(1)A=((a,b,c),d,(a,b,c))(2)B=(a,(b,(c,d),e),f)(1)111111^1^1d0a1b1c(2)11111^1^10f0a0b0c1^10c0d5.3课后习题解答5.3.1选择题1.下列说法正确的是(C)。A.二叉树中任何一个结点的度都为2B.二叉树的度为2C.一棵二叉树的度可小于2D.任何一棵二叉树中至少有一个结点的度为22.以二叉链表作为二叉树的存储结构,在具有n个结点的二叉链表中(n>0),空链域的个数为(C)。A.2n-1B.n-1C.n+1D.2n+13.线索化二叉树中,某结点*p没有孩子的充要条件是(B)。A.p->lchild=NULLB.p->ltag=1且p->rtag=1C.p->ltag=0D.p->lchild=NULL且p->ltag=14.如果结点A有3个兄弟,而且B是A的双亲,则B的度是(B)。A.3B.4C.5D.15.某二叉树T有n个结点,设按某种顺序对T中的每个结点进行编号,编号值为1,2,...n。且有如下性质:T中任意结点v,其编号等于左子树上的最小编号减1,而v的右子树的结点中,其最小编号等于v左子树上结点的最大编号加1,这是按(B)编号的。A.中序遍历序列B.先序遍历序列C.后序遍历序列D.层次顺序6.设F是一个森林,B是由F转换得到的二叉树,F中有n个非终端结点,B中右指针域为空的结点有(C)个。A.n-1B.nC.n+1D.n+27.一棵完全二叉树上有1001个结点,其中叶子结点的个数是(B)。A.500B.501C.490D.4958.设森林F中有三棵树,第一,第二,第三棵树的结点个数分别为N1,N2和N3。与森林F对应的二叉树根结点的右子树上的结点个数是(D)。A.N1B.N1+N2C.N2D.N2+N39.任何一棵二叉树的叶结点在先序、中序、后序遍历序列中的相对次序(A)。A.不发生改变B.发生改变C.不能确定D.以上都不对10.若一棵二叉树的后序遍历序列为dabec,中序遍历序列为debac,则先序遍历序列为(D)。A.cbedB.decabC.deabcD.cedba11.若一棵二叉树的先序遍历序列为abdgcefh,中序遍历的序列为dgbaechf,则后序遍历的结果为(D)。A.gcefhaB.gdbecfhaC.bdgaechfD.gdbehfca12.一棵非空二叉树的先序遍历序列与后序遍历序列正好相反,则该二叉树一定满足(AB)。A.所有的结点均无左孩子B.所有的结点均无右孩子C.只有一个叶子结点D.是一棵满二叉树13.引入线索二叉树的目的是(A)。A.加快查找结点的前驱或后继的速度B.为了能在二叉树中方便的进行插入与删除C.为了能方便的找到双亲D.使二叉树的遍历结果唯一14.设高度为h的二叉树上只有度为0和度为2的结点,则此类二叉树中所包含的结点数至少为(B)。A.2*hB.2*h-1C.2*h+1D.h+115.一个具有567个结点的二叉树的高h为(D)。A.9B.10C.9至566之间D.10至567之间16.给一个整数集合{3,5,6,7,9},与该整数集合对应的哈夫曼树是(B)。A.B.C.D.9376937653567979536765395.3.2判断题1.二叉树是树的特殊形式。(√)2.由树转换成二叉树,其根结点的右子树总是空的。(√)3.先根遍历一棵树和先序遍历与该树对应的二叉树,其结果不同。(×)4.先根遍历森林和先序遍历与该森林对应的二叉树,其结果不同。(×)5.完全二叉树中,若一个结点没有左孩子,则它必是叶子。(√)6.对于有N个结点的二叉树,其高度为log2N+1。(×)7.若一个结点是某二叉树子树的中序遍历序列中的最后一个结点,则它必是该子树的先序遍历序列中的最后一个结点。(√)8.若一个结点是某二叉树子树的中序遍历序列中的第一个结点,则它必是该子树的后序遍历序列中的第一个结点。(√)9.不使用递归也可实现二叉树的先序、中序和后序遍历。(√)10.先序遍历二叉树的序列中,任何结点的子树的所有结点不一定跟在该结点之后。(×)11.先序和中序遍历用线索树方式存储的二叉树,不必使用栈。(×)12.在后序线索二叉树中,在任何情况下都能够很方便地找到任意结点的后继。(×)13.哈夫曼树是带权路径长度最短的树,路径上权值较大的结点离根较近。(√)14.在哈夫曼编码中,出现频率相同的字符编码长度也一定相同。(×)15.用一维数组存放二叉树时,总是以先序遍历存储结点。(×)16.由先序序列和后序序列能唯一确定一棵二叉树。(×)17.由先序序列和中序序列能唯一确定一棵二叉树。(√)18.对一棵二叉树进行层次遍历时,应借助于一个栈。(×)19.完全二叉树可采用顺序存储结构实现存储,非完全二叉树则不能。(×)20.满二叉树一定是完全二叉树,反之未必。(√)5.3.3简答题1.一棵度为2的树与一棵二叉树有何区别?树与二叉树之间有何区别?【解答】①二叉树是有序树,度为2的树是无序树,二叉树的度不一定是2。ADBADBGEHCF(图1)2.对于图1所示二叉树,试给出:(1)它的顺序存储结构示意图;(2)它的二叉链表存储结构示意图;(3)它的三叉链表存储结构示意图。【解答】(1)顺序存储结构示意图:ABCDEF^^^G^^H(2)二叉链表存储结构示意图:(3)三叉链表存储结构示意图:ABABC^^D^E^^F^G^^H^A^BC^^D^E^^F^G^^H^IDIDEFGCBANMKJH(图2)(1)双亲数组表示法示意图;(2)孩子链表表示法示意图;(3)孩子兄弟链表表示法示意图。【解答】(1)双亲数组表示法示意图:(2)孩子链表表示法示意图:00A-11B02C03D24E25F16G17H58I29J410K411M312N82^6410^15311^97^12^0A1B2C3D4E5F6G7H8I9J10K11M12N8^(3)孩子兄弟链表表示法示意图:A^A^B^N^^H^C^^GF^EDI^^J^K^^M^4.画出图3所示的森林经转换后所对应的二叉树,并指出森林中满足什么条件的结点在二叉树中是叶子。DDBCIGHAFEJ(图3)【解答】HHFGIJABCED在二叉树中某结点所对应的森
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论