

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、Java數(shù)據(jù)結(jié)構(gòu)和算法、數(shù)紺r簡中摶序1二、棧與隊列4三n7Fmn22£哈絲25六,25七、二乂樹25八' 紅一261.堆36I. 、帶權(quán)閿39一、數(shù)組于簡單排序數(shù)組數(shù)組(array)是相同類型變量的集合,可以使用共同的名字引用它。數(shù)組可 被定義為任何類制,可以足一維或多維。數(shù)組屮的一個特別耍疾是通過下標(biāo)宋汸 問它。數(shù)組捉供丫一種將冇聯(lián)系的信息分組的便利方法。一維數(shù)組一維數(shù)組(one-dimensional array )實質(zhì)I.是相冋類型變燉列表。要創(chuàng)建一 個數(shù)饑.你必須|vf先記義數(shù)組殳hi:所耑的類吧.通川的一維數(shù)饑的戶叫格式足: type var name|);獲W個
2、數(shù)組亦要2步。第一步,你必須定義變锿所臠的類型。第二步,你 必®使川運?Z符new來力數(shù)組所逛存儲的數(shù)據(jù)分ftl內(nèi)存,井把它們分妃給數(shù)組 變K。這樣java中的數(shù)組被動態(tài)地分配。如果動態(tài)分妃的概念對你昭生,別擔(dān) 心,它將在木書的后而詳細(xì)討論。數(shù)組的磯化(array initializer )就足包括介:花W號之內(nèi)川逗號分開的表達(dá) 八的列衣。逗3分丌f數(shù)組元紊的伉。Java公|'|動地分配-個足夠大的空間來 保介:你衍定的初始化冗東的個數(shù).卵小必使用運好符new。Java嚴(yán)格地檢査以保證你不會意外地人存儲成引用在數(shù)組范Ifl以外的值。Java的運行系統(tǒng)會檢杏以確W所打的數(shù)組下標(biāo)
3、邡住正確的范IH以內(nèi)(迮這力Ifri.Java與C/C+從根木h不同,C/C+不提供運行邊界檢ft)。 多維數(shù)組在Java中,多維數(shù)組(multidimensional arrays )實際上是數(shù)組的數(shù)組。你 4能期,這些數(shù)組形式上和行動上和一股的多維數(shù)組一樣。然而,你將fl到. 有一些微妙的差別。定義多維數(shù)紐變14鉭將毎個維數(shù)放在它們各n的方括9屮。 例如,下而語句定義了一個名為twoD的二維數(shù)組變鼠。 int twoD(| = new int|4(5);簡單排序簡巾.抹序中包括了: 0泡抹序、選擇排序、插入排序:1. R泡排序的思想:假沒有N個數(shù)據(jù)耑恕排序,則從第0個數(shù)幵始,依次比較第0和
4、第1個數(shù)據(jù), 如果第0個人r笫1個則兩荇交換,否則什么動作都不做,繼續(xù)比較第1個笫2 個,這樣依次類推,直至所有數(shù)據(jù)都“冒泡”到數(shù)據(jù)頂上。V?泡排序的的java代碼: Public void bubbleSort() int in,out; for(out=nElems-l;out>0;out-) for(in=0;in<out;in+) lf(ain>ain+l) Swap(in,in+1); )J法的個變性:作多燈法屮,冇些條件迮烊讓執(zhí)行過ft!屮始終足小變的。這些 條件被稱為算法的不變性,如果不變性不為真了,則標(biāo)記出錯了:H泡棑序的效率0 (N*N),比較N*N/2.交
5、換N*N/4;2. 選擇排序的思?。杭賁釘N條數(shù)據(jù),則wn.標(biāo)記笫0個數(shù)據(jù)為MIN(Ai小),使用0UT標(biāo)記W左 邊未排序的數(shù)椐,然后使用IN標(biāo)記第1個數(shù)據(jù),依次與MIN進(jìn)行比較,如果比 MIN小.則將該數(shù)樅標(biāo)記為MIN. 笫一輪比較義后,敁終的MIN與OUT標(biāo)i己 數(shù)據(jù)交換,依次類推:選擇排序的java代碼:Public void selectSort()Int in'out'min;For(out=0;out<nElems-l;out+)Min=out;For(in=out+l;in<nElems;in+)lf(ain<a(min)Min=in;Swap(
6、out,min);J)選擇樣序的效率:0 (N*N).比較N*N/2.交換<N;選擇抹序與It泡撐序比 較,比較次數(shù)沒介叫坫改變,M交換次數(shù)明敁減少丫很多:3. 插入排序的思想:插入排序是介:部分?jǐn)?shù)裾有序的估況下,使用OUT標(biāo)id第一個無序的數(shù)掂,將 其提取保存到一個屮間變置temp中去,使用IN標(biāo)記空位置,依次比較temp屮 的值與IN1的值,如果IN-值大丁 temp的值,則后移,/£到遇到第一個比temp 小的值,在其卜一個位背插入:插入抹序的java代碼:Public void lnsertionSort()Int in,out;For(out=l;out<nEl
7、ems;out+)Long temp=a|outln=out;While(in>0&& ain-l>temp)Ain=a|in-1; -in;)Ain 卜 temp;)插入排序的效率:0 (N*N),比較N*N/4,箋制N*N/4:插入排序在隨機數(shù)的 W況下.比H泡快一倍,比選擇稍快:在杜本有序的數(shù)組屮.描入排序兒乎只志 S:0 (N);在逆序惜況下.并+比H泡快;二、棧與隊列1、棧的定義找(Stack)足限制儀在農(nóng)的端進(jìn)行插入和刪除運燈的線性農(nóng)。(1) 通常稱捕入、刪除的這一端為棧頂(Top), 端稱為棧底(Bottom),(2) 3衣屮沒打兀紊時稱為空棧。(3)
8、 棧為后進(jìn)先出(Last In First Out)的線性表,簡稱為LIFO表。 找的修改足按后進(jìn)先出的吩則進(jìn)行。毎次刪除(退棧)的總足與前棧屮'最新的元素,即最后插入(進(jìn)棧)的元素,而垃先插入的足被放迮找的底部. 迆刊敁 d 能刪除。出找棧頂棧底進(jìn)找【示例】元素是以al, a2,,an的顧序進(jìn)棧,退棧的次序卻是an, an-1,, al o2、棧的基本運算< 1) InitStack (S)構(gòu)造一個空棧So(2) StackEmpty (S)判棧空。若S為空棧,則返0TRUE.否則返回FALSE。(3) StackFull (S)判棧滿。Z::S為滿棧,則返回TRIE.否則返回
9、FALSE。注總:該運兌只適用丁找的順序存fifi結(jié)構(gòu)。(4) Push (S,x)進(jìn)找。W找S不滿,則將元素x插入S的棧頂。(5) Pop (S)退棧。若棧S非空,則將S的棧頂元素刪去,并返回該元素。<6) StackTop (S)取棧頂元素,藝棧S非空,則返回棧頂元素,但不改變棧的狀態(tài).隊列的定義及基本運算1、定義隊列(Queue)是只允許/|: _端進(jìn)行插入,而在另一端進(jìn)行刪除的運W受 限的線性表隊1示怠閣(1)允許刪除的一端稱為隊頭(Front)。(2)允許插入的一端稱為隊尾(Rear)。(3)當(dāng)隊列中沒有兀桌時稱為空隊列。(4)隊列亦稱作宄進(jìn)先出(First In First
10、Out)的線性表,簡稱為PIFO 表。隊列的修改足依先進(jìn)先出的Ki則進(jìn)忭的。新米的成W總足加入隊M (即小 允許'加塞',每次離開的成員總是隊列頭上的(不允許中途離隊),即當(dāng)前* W老的'成M離隊。【例】在隊列中依次加入元索a:,a:,as之后,a:是隊頭元素,是隊尾 元素。退出隊列的次序只能是a:,a:,,2、隊列的基本邏輯運算< 1) I nit Queue (Q)a空隊。構(gòu)造一個空隊列i(2)QueueEmpty (Q)判隊空。若隊列Q為空,則返回處值,否則返回假值。(3)QueueFull (Q)判隊滿。微列Q為滿,則返回真值,否則返回假值。注意:此操作只
11、適用于隊列的顧序存儲結(jié)構(gòu)。(4) EnQueue (Q. x)苦隊列Q非滿.則將元素x捕入Q的隊尾。此操作簡稱入隊,(5 ) DeQueue (Q)矜隊列Q非空,則刪iQ的隊頭元素,井返回該元素。此操作簡稱出隊。 < 6 ) QueueFront (Q)打隊列Q非空,則返回隊尖元紊,但不改變隊列Q的狀態(tài)。三、鏈表1. 鏈結(jié)點A屮,毎個數(shù)IK項W披包穴介:點“屮,一個點足K個類的對».這個類可認(rèn)叫做 LINK,W為一個鏈表屮有許多類似的鏈結(jié)點,所以有必嬰用一個小M r鏈農(nóng)的類米衣達(dá) 鏈結(jié)點。毎個LINK對象屮都fl含一個對卜一個點引用的字段(通常叫做next)但足本 身的對象屮有
12、一個字段衍向?qū)Φ谝粋€鏈結(jié)點的引用單鏈表川一組地址f r怠的 <儲'V* 7G介放線性表屮的麵/lA *以元糸(數(shù)據(jù)元蒺的映象)+衍針(衍示后淋乂蒺存儲位?i)=結(jié)點(衣承數(shù)據(jù)九名 成 數(shù)據(jù)允么的映紮)以'鈷點的序列'表示線性表稱作線性鏈衣(甲鏈衣)一中鏈S玷一種順序存取的結(jié)構(gòu).為找第i個數(shù)裾元索.必須先找到第i-1個數(shù) 據(jù)元索。因此,卉找第i個數(shù)據(jù)乂蒺的堪本操作為:移動指針,比較j和i1. 鏈接存儲方法鏈接方式介fifi的線性衣簡稱為鏈衣(Linked List)。鏈農(nóng)的W體存儲農(nóng)示為: 用一紐任憊的行儲中九來存放線性表的結(jié)點(這組存儲中.沁既4以足連續(xù)的, 也4
13、以足不連續(xù)的 鏈衣中結(jié)點的邏輯次序和物理次序不一定相h4.為了能正確表示結(jié)點間的邏 訊又系.在存儲捋個紡點仉的M時,還必須ff儲詣zrUt后繼點的地址(或RK)(H 總(稱為衍計(pointer)成鏈(link)注總:鏈?zhǔn)酱鎯κ亲畛S玫拇鎯Ψ绞街?它不僅可用來表示線性表,而且可用來表示 什種非線性的數(shù)煙結(jié)構(gòu)。2、鏈農(nóng)的結(jié)點結(jié)構(gòu)| data | next|data 存放結(jié)點ftt的數(shù)椐域next域-存放結(jié)點的11接后繼的地址(位W)的ttitl域(鏈域 注意: 鏈發(fā)通過甸個紡點的®域?qū)⒕€性及的n個姑點按R:邏鍆_序鏈接在、起的. 每個結(jié)點只17 個鏈域的璉農(nóng)稱為單K衣(Single
14、Linked List)【例】線性表(bat. cat. eat. fat. hat,jat. lat. mat)的單鏈表示如示意M3. iffi針head和終端結(jié)點桁針域的農(nóng)示中鏈5屮每個結(jié)點的存儲地址足存放在宂前朽結(jié)點next域屮,而開始結(jié)點無前 釣.故應(yīng)沒頭指針had銜向開始結(jié)點,注怠:鏈表由頭指針唯一確定,中.鏈表"r以用尖柑針的名'?來命名?!纠炕鹬竑l名足head的鏈5可稱為S head.終端結(jié)點無后繼.故終端結(jié)點的衍計域為空,即NULLo4. 妒鏈農(nóng)的一般ra示法山F我們常常只注1KW點W的邏SH順#.個又心埒個W點的實牀位K,叫以川箭 頭來表示»域
15、屮的折針,線性農(nóng)(bat, cat, fat. hat,jat, lat. mat)的單鏈R就可 以農(nóng)示為下閣形式。5. 屮鏈衣類喂描述typedef char DataType,結(jié)點的數(shù)招域炎型為7符typedef struct node /結(jié)點類型定義 DataType data; /結(jié)點的數(shù)據(jù)域struct node *nxt;"結(jié)點的街針域JListNodetypedef ListNode *LinkList;ListNode *p; LinkList head;注意: -LinkLiSt和ListNode是不網(wǎng)名字的M個栴針炎型(命名的不叫是為了 Ift念 上更明確)
16、39;LinkUst類叩的指針變量head表示它是取鏈表的尖措針 ListNode類咽的指針變量p表示它S指向坫一結(jié)點的拘針6. 銜針變量和結(jié)點變量衍針變頃|結(jié)點變S |IIIIIII| *義丨在變hl說明部分顯式記義|在W序執(zhí)行吋.通過標(biāo)準(zhǔn)| | | |涵數(shù)malloc生成|II1III1|取tfi | IK空時,存放K炎點|劣存放紀(jì)點ft域A界| | |的地址| |11111t1|操作方式丨通過衍針變R名W問|通過衍針生成、W問和杼放IIIII 生成結(jié)點變R的杯袱函數(shù)p=( ListNode *)malloc(sizeof(ListNode):/嘁數(shù)malloc分S!-個類喂為ListNo
17、de的結(jié)點變員的空問,并將Jt打地址放入指 針變® P屮 釋放W點變空M的W準(zhǔn)函數(shù)free(p): /W放p所指的W點變尕空問 結(jié)點分砑的訪問利用鈷點變景的名字.p訪問鈷點分W方法一:(*p).data 和(*p).nxt方法二:p- > data W p- > next 衍i I 變51 P和結(jié)>.*.(變* p的關(guān)系栴針變® p的偵一結(jié)點地址結(jié)點變的位一一結(jié)點內(nèi)容(p) data的tfip指針?biāo)附Y(jié)點的data域的fft('p).next的tfi*p后繼結(jié)點的地址(Cp) next)"p G繼結(jié)點注意: 打指針變Rp的位為空(NULL
18、),則它不指向點。此時,通過*p 來W問結(jié)點就怠味問一個不存在的變Hb從ifuJI起ft!序的錯W. 打關(guān)桁計類燉的S義和說明方式的洋細(xì)解Wfir見.在鏈衣中捕入結(jié)點只爾要修改疳針但同吋,農(nóng)要在第i個結(jié)點之曲摘 入元桌,修改的足笫i-1個鈷點的衍針.w此.在中a農(nóng)屮第i個w點之前遜行插入的咕木採怍為: 找到線性農(nóng)中第i-i個律點,然后修改其描向后經(jīng)的指針。 雙端鏈表雙端鏈農(nóng)1J傳統(tǒng)的鏈農(nóng)II:??鬯疲?LIS它G個新増的特性:即對E/fi 個鏈結(jié)點的 引用.就像對第一個璉結(jié)點的引用一樣。利個鏈結(jié)點的引川允許像在衣尖-忭,在衣接插入-個鏈結(jié)點。當(dāng)然.仍 然可以在代通的中鏈衣的農(nóng)化插入一個鏈結(jié)點,
19、方讓足遍歷整個鏈農(nóng)II到到達(dá)SJd, 但足這種方法效率很低。對KG -個鏈結(jié)點的引用允11像在衣尖-忭.在衣接插入一個鏈結(jié)點。、然.仍 然呵以在&通的犖鏈衣的?dd捕入一個a鈷點,Zfi人足歷®個鏈衣££到到込衣Jd. 01足這種方法效率很低。像農(nóng)義一樣沁問農(nóng)W的W性,使«鏈發(fā)出適介F叫作通鏈農(nóng)小介迚操作的場 介,隊列的實現(xiàn)就G這樣一個估況、卜_而足一個雙端鏈農(nóng)的例子。class Link3public long dData; public Link3 next, "public Link3(long d)dData-d, "
20、public void displayLink() System.out.print(dData+_ M);class FirstLastListprivate Link3 first; private Link3 last; /public FirstLastList()first=null;last=null;public boolean isEmpty() return first=null;public void insertFirst(long dd) Link3 newLink=new Link3(dd); if(isEmpty()last=newLink;newLink.next
21、=first; first=newLink;"public void insertLast(long dd)( Link3 newLink=new Link3(dd); if(isEmpty()first=newLink;elselast.next=newLinkllast=newLink,/public long deleteFirst() long temp=first dData; if(first next=null)last 二 null;first=first.next;return temp; /public void displayList() System out
22、print("List (first->last):"); Link3 current=first;while(current!=null) current.displayLink(); current=current. next, )Syst m.out.printing);)/ public class FirstLastApp public static void main(StringO args) FirstLastList theList=new FirstLastList();theList insertFirst(22); theList.insert
23、First(44); theList. insertFirst(66); theList.insertLast(11); theList insertLast(33); theList insertLast(55); theList.displayList(); theList.deleteFirst(), theList deleteFirst(); theList displayList(); 為了簡申起兇,在這個程序屮,把毎個a結(jié)點屮的數(shù)裾宇段個數(shù)從網(wǎng)個縮到-個. 這史容W以示鋌結(jié)點的內(nèi)容。(C住,在-個正人的EFp屮,可能會打II常多的數(shù)據(jù) 字段,或片對另外一個對象的引用,那個對象也包
24、介很多數(shù)據(jù)7段.>這個R序在衣尖和農(nóng)祕插入三個鏈點,顯示插入G的鏈衣。然C刪除孓兩個鏈結(jié)點. 再次顯示*注怠在農(nóng)又正兒捕入操作公觸例漣結(jié)點進(jìn)入的顧序.而在衣化的入則保待鏈W 點進(jìn)入的_序。雙期鏈表類叫做FirstLastList.它有兩個項,first和last.-個抱向鏈表中的第-個 鏈結(jié)點*另一個析時最后一個鏈結(jié)點*如果鏈表中只有一個鏈結(jié)點,first和last就都 指向它.如果沒介鏈結(jié)點.兩S部為Null (ft。這個炎-個新的/法insertLast().這個Zf法在插入個新的鏈結(jié)點,這個過 程B先改變last.next,使其梅向新生成的鏈結(jié)點,然后改變last,使其折仰新的鏈結(jié)
25、 點W入和刪除方法和ff通鏈衣的相應(yīng)部分炎似。然iftj. 個捕入方法邢從芩慮一種特殊 情況即插入前鏈表是空的.如果isEmpty()是真,那么insertFirst()必須把last銜向 新的鏈結(jié)點,insertLast()也必須把first衍何新的鏈結(jié)點.如果用insertFirst()力讓i:現(xiàn)在表頭插入.first就術(shù)向新的鏈結(jié)點,用insertLast()方 法實現(xiàn)在農(nóng)圮捕入.last就桁叫新的鏈結(jié)點。如K6L農(nóng)只燈-個鏈結(jié)那么多衣A 析除也是一神特殊憤況:last必須被賦值為null值.不幸的是,用雙端鏈表也不能有助rm除最后一個鏈鈷點,因為沒ff個引用抱向倒 數(shù)弟二個鏈結(jié)點.如果
26、WG 個鏈W點被刪除,倒第二個鏈鈷點的Next 7段hV汝 變l& Null ffi。為了乃'使的刪除WS7 個鏈結(jié)點,況® -個雙叫鏈農(nóng)。(,然,也4以 iHWffi個璉衣找到個鏈結(jié)點.(11足那托做效率小足很品。有序鏈表在餅鍵表屮,數(shù)裾是按照關(guān)鍵偵打序排列的。備序鏈表的劚除常常足只限于刪除在 鏈衣頭部的最小鏈結(jié)點。不過.有時也用F_方法和Dlei)方法在整個鏈衣中搜 索某一特定點。一般.在人多數(shù)嬰使用有序數(shù)組的場介也可以使用有序鏈農(nóng)。有序鏈衣優(yōu)r有序數(shù) 組的地乃足捕入的速度,另外鏈衣紂以擴展到全部打效的使川內(nèi)介,Ifli數(shù)組只能AJ限 f個ra定的人小屮。但足,介
27、序鏈衣實現(xiàn)起來比a序數(shù)組史困難一些。后而將<1到一個釘序鏈表的應(yīng)用:為數(shù)累排序.有序鏈表也可以用F實現(xiàn)優(yōu)先級隊 盡竹堆足史常用的丈現(xiàn)方法,在打序鏈衣屮插入一個數(shù)據(jù)項的Java代碼為/在一個印鏈農(nóng)屮插入數(shù)據(jù)項.!7法必須打先拽索鏈衣,到找到介適的位W: 它恰4f在第-個比它人的數(shù)椐項的前而。3鋅法找到r®插入的位迓,用通簾的方式捕入數(shù)裾項:把新鏈結(jié)點的Next字段很 問卜一個鏈結(jié)點,然后把前一個鏈結(jié)點的Next '/段改為指M新的鏈結(jié)點.然而.X 慮一些特殊情況:鍵鈷點有司1以捕在表頭,或者鋦在表尾看一下這微代碼: Public void insert(long key)
28、Link newLink=new Link(key);Link previous=null; Link current=first; While(current!=null && key>current.dData) P_ous=current; Current=current.next; ) lf(previous=null) First=newLink; Else Previous.next=newLink,newLink next=current; 在鏈表上移動時.3;要用一個previous引用.這樣才能把前一個鏈結(jié)點的Next字段 指M新的鏈結(jié)點.創(chuàng)讓新鏈結(jié)點后
29、,把current變歃沒為first.準(zhǔn)S搜索IE確的插入 點,這時也把previous沒為Null俏,這步操作很氓逛,W為后曲要用這個Null俏判 斷&否仍在表尖While (Ifi環(huán)和以前叫來拽索插入點的代嗎炎似.倒是介一個附加的條件。如果當(dāng)前檢 «的鏈結(jié)點的關(guān)鍵tfi不再小f待袖入的鏈結(jié)點的關(guān)仉,則循環(huán)結(jié)束:這足最常見的 w況,即新關(guān)aww在鋌農(nóng)屮部的x個地然ifij .如! current力Null俏,while循環(huán)也公伶ik*這種怙況發(fā)肀在成/J鏈 表為空時 如果current在衣頭或?5鏈衣為空,previous將為Nullffi:所以讓first析向新的鏈結(jié) 點
30、.否則current處在鏈農(nóng)屮部或結(jié)叱,就使previous的next 7段衍向新的鏈綰點。 不論嗎種情況、部讓析鏈結(jié)點的Next 7段指向current, ftl果在衣尾,current為Nu II ft,則新鏈結(jié)點的Next 7段也本戍該3為這個tfi (Null) * brfnffifj序鏈表的W序SortedList java 程序?qū)崿F(xiàn)了一個 SortedList 類,它擁有 insert()、remove()和 display ListO方法.只有insert()方法與無序鏈表中的insert()方法不同。package 17序鏈衣;class Linkpublic long dDa
31、ta; public Link next; public Lmk(long dd) dData=dd;) /public void displayLink() System.out.print(dData+_ _); )class SortedListprivate Link first; /public SortedList() first=null, /public boolean isEmpty() return (first=null); /public void insert(long key) Link newLink=new Link(key); Link previous=nu
32、ll; Link current=first; whil(currntl=null && key>current dData) previous=current;current=current next,) if(previous=null)first=newLinkfelseprevious. next=newLink; newLink.next=current;public Link remove()Link temp=first;first=first.next; return temp; /public void displayList()Systm.out pr
33、int(”List (first->last): _): Link current=first;while(current!=null) current.displayLink();current=current.next,) System.out pnntln(WH);) public class SortedLmkApp public static void main(Stnng| args) SortedLisI theSortedList=new SortedList(); theSortedList.insert(20);theSortedList.insert(40);the
34、SortedList displayList();theSortedList.insert(IO);theSortedList.insert(30);theSortedList Jnsert(50);theSortedList displayList();theSortedList remove();theSortedList displayList();System exit(O);在MainOZZ法屮.插入衍為20和40的兩個鏈結(jié)點然后丙插入三個鏈結(jié)點,分別 S 10. 30和50u這三個偵分別插在表1、表屮和衣尼。這說明insert()方法iE確地 處理了特殊情況.后刪除了一個鏈結(jié)點,表
35、現(xiàn)出刪除操作總從表尖進(jìn)行。毎一步 變化后.都顯示®個漣衣.雙向鏈表雙向鏈衣也叫雙鏈衣.足鏈衣的一種,它的每個數(shù)據(jù)結(jié)點屮都fl兩個指針.分別指向 直接后繼和H接前驅(qū)*所以,從雙向鏈農(nóng)中的任意-個結(jié)點幵始,都可以很方便地訪M它的前職結(jié)點和G繼結(jié)點 一般我們都構(gòu)造雙W循環(huán)鏈去*/線性表的雙W鏈表介儲鈷構(gòu)/ typedef struct DuLNodeElemType data,struct DuLNode "prior,*next;)DuLNode,"DuLinkList;/*帶頭結(jié)點的雙向循環(huán)鏈表的*本操作<14個)/void lnitList(DuLinkLi
36、st *L) /"產(chǎn)生空的雙向術(shù)環(huán)鏈表L 7ftL=(DuLinkList)malloc(sizeof(DuLNode);(L)->next=(*L)->prior=*L;elseexit(OVERFLOW);)void DestroyList(DuLinkList *L> /操作結(jié)果:消毀雙叫循壞鏈衣L 7DuLinkList q,p=(*L)->next, /* p fit t>第一個結(jié)點 */while(pl=L) P p沒到表頭7q=p->next;free(p);P=Q.)free(-L);L=NULL;void ClearList(Du
37、LinkList L) /不改變 L */ /初始條件:L b/r在。揀怍紡果:將LifiK為空衣vDuLinkList q,p=L->next; /* p 攢向第一個結(jié)點/while(p!=L) /p沒到農(nóng)火7q=p->next;free(p);P=q;L->next=L->prior=L; /頭結(jié)點的兩個指針域均柑向自身/ )Status ListEmpty(DuLinkList L) / W始條件:線件農(nóng)LC存ft,操作結(jié)果:打L為空衣,則返Id TRUE,否則 idM FALSE 7if(L->next=L&&L->prior=L)r
38、eturn TRUE;elsereturn FALSE;int ListLength(DuLinkList L) r初始條件:L己存在。操作結(jié)果:返冋L屮數(shù)據(jù)元蒺個數(shù)”int i=0;DuLinkList p=L->next; / p 指向第一個結(jié)點/while(p!=L) / p 沒到表頭 7 i*;p=p->next;return i;Status GetElem(DuLinkList L.int i.ElemType *e) /-當(dāng)?shù)趇個蒺存在時,Kfrt賦給e并返回OK.否則返回ERROR 7 int j=1; /j為計數(shù)器/DuLinkList p=L->next;
39、 / p 柑向第一個結(jié)點/while(p!=L&&jnext;j+;if(p=L|j>i) r第i個元素不存在7return ERROR;e=p->data; /* 収第 i 個元索/return OK;)int LocateElem(DuLinkList L.EIemType e.StatusCompareXEIemType.Elem Type) P初始條件:L己存在,compare()是數(shù)W元索判定函數(shù)/r操作結(jié)尖:返回L屮第1個與e滿足關(guān)系compare()的數(shù)據(jù)元索的位序.7 / 這樣的數(shù)據(jù)元索不存在,則返回衍為0 ,int i=0;DuLinkList p
40、=L->next; /* p 推向第 1 個元素/while(pl=L)i+:if(compare(p->data,e) /找到這的數(shù)裾九尜/return i;p=p->next;return 0;)Status PriorElem(DuLinkList L.EIemType cur_e,ElemType *pre_e) /操怍結(jié)果:r.: cur_e & L的數(shù)據(jù)元桌.IL不足第一個.則用pre_e返冋它的 前驅(qū),Vr否則探作失敗,pre_e無定義/DuLinkList p=L->next->next; / p 析句第 2 個元麻/while(pl=L)
41、 / p 沒到表頭/if(p->data=cur_e)pre _e=p->prior->dat a;return TRUE,p 二 p->next;)return FALSE; )Status NsxtEIm(DuLinkList L.EIemTyp cur_,ElmType wnext_e) /探怍結(jié)果:cur_ eEL的數(shù)裾元瘓,fl不-個,則用next_e返冋 它的后繼,/r否則操作失敗,nxt_無定義/DuLinkList p=L->next->next; / p 衍向第 2 個元索 */while(p!=L) / p 沒到農(nóng) i 7 if(p-&g
42、t;prior->data=cur_e)"next_e=p->data, return TRUE;p=p->next;)return FALSE; JDuLinkList GetElemP(DuLinkList L,mt i) ' W 加/ r在雙向鏈衣L屮返M第i個元蒺的地址.i為0.返|ul尖幼點的地址。打第i 個元索不存在.*/返l"l NULL /int j; DuLinkList p=L; /p折向頭結(jié)點7if(i<O|i>ListLength(L) / i 值不合法/return NULL;for(j=1;j<=i;j
43、+)p=p->next;return p; JStatus Listlnsert(DuLinkList L.int i.ElemType e) /- A帶尖結(jié)點的雙鏈循環(huán)線性5L屮第i個之前插入A蒺e.i的介法ffi為 1<i<?< 長+1 /r改進(jìn)172 18.缶則無法在第衣IC+1個結(jié)點之前插入冗桌/DuLinkList p,s;if(i<1|i>ListLength(L)+1) /* iffi不合法 7 return ERROR;p=GetElemP(L,i-1);"在L中確定第i個元素前®的位S柑針p 7 if(1p) r p=N
44、ULL,即第i個元素的前驅(qū)不存在(設(shè)Jk結(jié)點為第1個元索的前驅(qū)/ return ERROR;s=(DuLinkList)malloc(sizeof(DuLNodG);if(return OVERFLOW;s>data=e;s->prior=p; P在第卜1個九S之后描入/ s->n ext二p->n ext; p->next->prior=s;p->next=s;return OK;Status ListDelete(DuLinkList LJnt i,ElemType e> r刪除帶1結(jié)點的雙鏈循環(huán)線性衣l的® i個元蕤,i的介法仿為
45、農(nóng)松/ DuLinkList p;/* i值不介法7return ERROR;p=GetElemP(L,i); /在L中確定第i個元隸的位®拊針p/ if('p) P p=NULL,即第i個元素不存在/ return ERROR;=p->data;p->prior->next=p->next;p->next->prior=p->prior;free(p);return OK;void ListTravers(DuLinkList L,void(*visit)(ElemType) !.巾雙鏈淅壞線性農(nóng)L的交結(jié)AHI發(fā).正序?qū)皞€數(shù)裾冗蒺
46、調(diào)用函數(shù)visit() DuLinkList p=L->next; /* p 侑向久結(jié)點 */while(pl=L)visit(p->data);p=p->next,printf("n");)void ListTraverseBack(DuLinkList L,void(*visit)(ElemType) /'由雙®拋壞線性的火結(jié)點出發(fā),逆序?qū)γ總€數(shù)據(jù)元東調(diào)用凼數(shù)visit(). W加!DuLinkList p=L->prior; /* p JdWi 點 7while(p!=L)visit(p->data);p=p->p
47、rior; printf("n");迭代器迭代器足一種對象,它能夠用來遍歷STL容器屮的部分成全部i蒺,每個迭代器對 象代衣容器屮的確定的地址.迭代器修改了常規(guī)指針的接丨I,所m選代器足種槪念 上的抽象:那些行為上象迭代器的東西都苛以叫做迭代器。然而迭代器打很多不同的 能力,它吋以把抽象容器和通用算法有機的統(tǒng) 起來.迭代器捉供一些坫本怏作符:、+、=、!=,=這些視作和C/CW找作array元 素時的柑針接口一致。不M之處在J.-,迭代器是個所謂的smart pointers,只有遇歷 y雜數(shù)裾結(jié)構(gòu)的能力。WFS運行扒制取決rjt所歷的數(shù)裾結(jié)構(gòu),岡此.« .種料
48、器吧別都必須捉供n己的迭代器,少實上甸-種矜器都將u迭代器以嵌套的力式定義 r內(nèi)部.因此各種迭代器的接11相M,型別卻不M.這££接導(dǎo)出了泛型程序設(shè)計的槪 念:所有操作行為都使用相同接U,里然它們的墩別不同。功能選代器使開發(fā)人員能夠在類或紡構(gòu)屮支持foreach迭代,而不必整個實現(xiàn)lEnumerab le或?MEnumerator接丨I。只耑捉供-個迭代器.即可遍歷炎屮的數(shù)裾結(jié)構(gòu)。3編i子 器檢薄到迭代器時將門動生成lEnumerable接【I或者lEnumerator接口的Current.MoveNext 和 Dispose 力法.特點1. 迭代器是可以返回相同類型值的有
49、序序列的-段代碼;2. 迭代器可用作A法、運汀符成get訪問器的代W體:3. 迭代器代碼使JT yield return通句依次返回每個元索.yield break將終止迭代:4. 可以在類中實現(xiàn)多個迭代器,毎個迭代器都必須像任何類成員,樣有惟.的名 稱.并且可以在foreach語句中披客戶端代碼調(diào)用:5. 迭代器的返回類艱必須為lEnumerable和lEnumerator屮的任意一種:6. 迭代器S產(chǎn)生仇的打序序列的一個塊,不同r打一個 或多個yield 存 在的常規(guī)講塊;7迭代器不忡成員,它八實現(xiàn)ffl數(shù)成員的方式.理解這一點£很呎贄的. 個通過a代器實現(xiàn)的成w.可以妓it他可
50、能或小可能通過迭代器丈現(xiàn)的成ws溫和 腿:8.迭代器塊在c#ifi法屮不足獨特的它們在幾個方而受到限制,并nt® 作用在函敗成M聲明的語義上,它們在誚法上只是語句塊而己:、遞歸雄婦是番數(shù)調(diào)用白身的種特殊的編程技術(shù).其應(yīng)用主要在以卜兒個方面:階乘ft java 屮的柚木形AW: Public void mothed «intn)/'l,i滿足某條件時: Mothed (n-1 ):遞歸二分査找Java二分6找實現(xiàn),歡迎大家提出交流意見.廣 名稱:Binarysearch功能:實現(xiàn)了折字&找(二分査找)的遞#1和非遞H算法. 說明:1、要求所査找的數(shù)組己有序,并
51、且其中元素己實現(xiàn)Comparable<T>接口,如 nteger、String 等.2> 北遞iHfi:找使川 search();,遞找HfHl searchRecursively();本®序僅供編學(xué)習(xí)參冷author: Wmtydate:2008-8-11email: emailwintys/emailclass BinarySearch<T extends Comparable<T» private T data:/要作序的數(shù)據(jù)public BinarySearch(T data) this.data = data;public int s
52、earch(T key) int low,int high; int mid;if(data = null)return -1,low = 0;high = data.length - 1;while(low <= high)mid = (low + high) / 2;System.out println("mid + mid + mid value:” + datamid);/ if(pareTo(datamid|) < 0)high = mid - 1; else if(key compareTo(datamid) > 0)( low = mid * 1; e
53、lse if(key compareTo(datamid) = 0) return mid, >return -1; private int doSearchRecursively(int low , int high , T key) int mid; int result;if(low <= high) mid = (low + high) / 2; re suit = key compareTo(data|mid|);System.out println(mid + mid + mid value " + datamid|);/ if(result < 0)r
54、eturn doSearchRecursively(low,mid - 1,key); else if(result > 0)return doSearchRecursively(mid + 1,high,key); else if(result = 0)return mid.return -1;public int searchRecursively(T key) if(data =null)return -1;return doSearchRecursively(0 . data.length - 1 ,key);public static void main(StringO arg
55、s)Integerf data = 1 ,4 ,5 ,8 ,15 ,33 ,48 ,77 .96;BinarySearch<lnteger> bmSearch = new BinarySearch<lnteger>(data); /System.out pnntln(MKy index:” + binSearch search(33);System.out.pnntln(RKey index * + binSearch searchRecursively(3);/String | dataStr = _A_,_C_ /F_,_L_,_N_ /T" /Bmary
56、Search<String> binSearch = new BmarySearch<String>(dataSt 0;/System.out println("Key index+ binSearch search("A"); )遞歸排序K實在數(shù)組的全找序屮完全吋以使用史加易憚簡便的寫認(rèn)一一for循環(huán),但足通過 for循環(huán)編寫數(shù)扣今排序耑®打一個先決條件一知道數(shù)饑個排序的個數(shù).因為打 n個數(shù)裾全梓序就痛®寫n個嵌套for循環(huán).因此在寫全梓序時一般使用遞H方 法.這是我的第一個關(guān)F遞浦序的見解遞W拌序可以無耑C知I徘序數(shù)
57、組 的長度,即排序個數(shù)!Jt二,不管是使用遞歸進(jìn)行數(shù)組排序還是使用tor循環(huán)進(jìn)行數(shù)組的排序,它們都 S木質(zhì)都£使用枚舉,岡此以出這樣一個結(jié)論:枚準(zhǔn)"I以確保找出埒一種"J*能 的序規(guī)則!Jt-2.枚舉足列出所介的方法并找出符介耍求的W法,W此Jt燈法效半一定比較 的低.況耍對w進(jìn)行優(yōu)化.1能込到較好的效果(遞yi的時候jit除所打不吋能的 方案)消除遞歸消除遞yi的祛本思路足用棧來模擬系統(tǒng)的函數(shù)調(diào)用從而消除遞in* 法木上嬰做一卜_三件出:傳遞參數(shù)(包括返回地址)并轉(zhuǎn)到函數(shù)入i-i:獲得參數(shù) 并處理參數(shù):根據(jù)傳入的返M地址返1"1五、哈希表一般的線性表、M中,記錄在結(jié)構(gòu)中的相對位置是隨機的即和記呆的關(guān)鍵字之問 小存在確定的關(guān)系.在結(jié)構(gòu)屮ft找記氽時芯進(jìn)行一系列和關(guān)鍵字的比較。這一類 杏找旅進(jìn)立在"比較”的礎(chǔ)上.杏找的效率與比較次數(shù)密
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 新生兒臂叢神經(jīng)損傷的臨床護(hù)理
- 《如何在手機上制作課件》
- 2025汽車銷售合同范本2
- 2025博爾特委托試驗合同
- 2025關(guān)于租賃合同的管轄問題案例分析
- 深圳七下生物期末試卷及答案
- 陜西中考試卷及答案全套b卷
- 2025年買賣食品的合同范本
- 浙江國企招聘2025溫州機場集團(tuán)招聘31人筆試參考題庫附帶答案詳解
- 電容器在數(shù)據(jù)中心電力系統(tǒng)的優(yōu)化設(shè)計考核試卷
- 2025年四川成都地鐵運營有限公司招聘筆試參考題庫含答案解析
- 【MOOC】《學(xué)術(shù)交流英語》(東南大學(xué))章節(jié)中國大學(xué)慕課答案
- 幼兒園閱讀活動環(huán)境創(chuàng)設(shè)
- 環(huán)保公司簡介范文6篇范文
- 如何與人有效溝通培訓(xùn)
- 食品企業(yè)生產(chǎn)部門質(zhì)量獎懲條例
- 《婦產(chǎn)科學(xué)》課件-15.3絕經(jīng)綜合征
- 幼兒園中班彩虹泡泡龍課件
- 酒精飲料制作操作指南
- 六年級數(shù)學(xué)下冊 典型例題系列之期中專項練習(xí):解比例或解方程(蘇教版)
- 城市地下管網(wǎng)建設(shè)項目風(fēng)險評估報告
評論
0/150
提交評論