

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、Java數(shù)據(jù)結(jié)構(gòu)和算法、數(shù)紺r簡(jiǎn)中摶序1二、棧與隊(duì)列4三n7Fmn22£哈絲25六,25七、二乂樹(shù)25八' 紅一261.堆36I. 、帶權(quán)閿39一、數(shù)組于簡(jiǎn)單排序數(shù)組數(shù)組(array)是相同類型變量的集合,可以使用共同的名字引用它。數(shù)組可 被定義為任何類制,可以足一維或多維。數(shù)組屮的一個(gè)特別耍疾是通過(guò)下標(biāo)宋汸 問(wèn)它。數(shù)組捉供丫一種將冇聯(lián)系的信息分組的便利方法。一維數(shù)組一維數(shù)組(one-dimensional array )實(shí)質(zhì)I.是相冋類型變燉列表。要?jiǎng)?chuàng)建一 個(gè)數(shù)饑.你必須|vf先記義數(shù)組殳hi:所耑的類吧.通川的一維數(shù)饑的戶叫格式足: type var name|);獲W個(gè)
2、數(shù)組亦要2步。第一步,你必須定義變锿所臠的類型。第二步,你 必®使川運(yùn)?Z符new來(lái)力數(shù)組所逛存儲(chǔ)的數(shù)據(jù)分ftl內(nèi)存,井把它們分妃給數(shù)組 變K。這樣java中的數(shù)組被動(dòng)態(tài)地分配。如果動(dòng)態(tài)分妃的概念對(duì)你昭生,別擔(dān) 心,它將在木書(shū)的后而詳細(xì)討論。數(shù)組的磯化(array initializer )就足包括介:花W號(hào)之內(nèi)川逗號(hào)分開(kāi)的表達(dá) 八的列衣。逗3分丌f數(shù)組元紊的伉。Java公|'|動(dòng)地分配-個(gè)足夠大的空間來(lái) 保介:你衍定的初始化冗東的個(gè)數(shù).卵小必使用運(yùn)好符new。Java嚴(yán)格地檢査以保證你不會(huì)意外地人存儲(chǔ)成引用在數(shù)組范Ifl以外的值。Java的運(yùn)行系統(tǒng)會(huì)檢杏以確W所打的數(shù)組下標(biāo)
3、邡住正確的范IH以內(nèi)(迮這力Ifri.Java與C/C+從根木h不同,C/C+不提供運(yùn)行邊界檢ft)。 多維數(shù)組在Java中,多維數(shù)組(multidimensional arrays )實(shí)際上是數(shù)組的數(shù)組。你 4能期,這些數(shù)組形式上和行動(dòng)上和一股的多維數(shù)組一樣。然而,你將fl到. 有一些微妙的差別。定義多維數(shù)紐變14鉭將毎個(gè)維數(shù)放在它們各n的方括9屮。 例如,下而語(yǔ)句定義了一個(gè)名為twoD的二維數(shù)組變鼠。 int twoD(| = new int|4(5);簡(jiǎn)單排序簡(jiǎn)巾.抹序中包括了: 0泡抹序、選擇排序、插入排序:1. R泡排序的思想:假?zèng)]有N個(gè)數(shù)據(jù)耑恕排序,則從第0個(gè)數(shù)幵始,依次比較第0和
4、第1個(gè)數(shù)據(jù), 如果第0個(gè)人r笫1個(gè)則兩荇交換,否則什么動(dòng)作都不做,繼續(xù)比較第1個(gè)笫2 個(gè),這樣依次類推,直至所有數(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法的個(gè)變性:作多燈法屮,冇些條件迮烊讓執(zhí)行過(guò)ft!屮始終足小變的。這些 條件被稱為算法的不變性,如果不變性不為真了,則標(biāo)記出錯(cuò)了:H泡棑序的效率0 (N*N),比較N*N/2.交
5、換N*N/4;2. 選擇排序的思?。杭賁釘N條數(shù)據(jù),則wn.標(biāo)記笫0個(gè)數(shù)據(jù)為MIN(Ai小),使用0UT標(biāo)記W左 邊未排序的數(shù)椐,然后使用IN標(biāo)記第1個(gè)數(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éi)介叫坫改變,M交換次數(shù)明敁減少丫很多:3. 插入排序的思想:插入排序是介:部分?jǐn)?shù)裾有序的估況下,使用OUT標(biāo)id第一個(gè)無(wú)序的數(shù)掂,將 其提取保存到一個(gè)屮間變置temp中去,使用IN標(biāo)記空位置,依次比較temp屮 的值與IN1的值,如果IN-值大丁 temp的值,則后移,/£到遇到第一個(gè)比temp 小的值,在其卜一個(gè)位背插入:插入抹序的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:插入排序在隨機(jī)數(shù)的 W況下.比H泡快一倍,比選擇稍快:在杜本有序的數(shù)組屮.描入排序兒乎只志 S:0 (N);在逆序惜況下.并+比H泡快;二、棧與隊(duì)列1、棧的定義找(Stack)足限制儀在農(nóng)的端進(jìn)行插入和刪除運(yùn)燈的線性農(nóng)。(1) 通常稱捕入、刪除的這一端為棧頂(Top), 端稱為棧底(Bottom),(2) 3衣屮沒(méi)打兀紊時(shí)稱為空棧。(3)
8、 棧為后進(jìn)先出(Last In First Out)的線性表,簡(jiǎn)稱為L(zhǎng)IFO表。 找的修改足按后進(jìn)先出的吩則進(jìn)行。毎次刪除(退棧)的總足與前棧屮'最新的元素,即最后插入(進(jìn)棧)的元素,而垃先插入的足被放迮找的底部. 迆刊敁 d 能刪除。出找棧頂棧底進(jìn)找【示例】元素是以al, a2,,an的顧序進(jìn)棧,退棧的次序卻是an, an-1,, al o2、棧的基本運(yùn)算< 1) InitStack (S)構(gòu)造一個(gè)空棧So(2) StackEmpty (S)判???。若S為空棧,則返0TRUE.否則返回FALSE。(3) StackFull (S)判棧滿。Z::S為滿棧,則返回TRIE.否則返回
9、FALSE。注總:該運(yùn)兌只適用丁找的順序存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).隊(duì)列的定義及基本運(yùn)算1、定義隊(duì)列(Queue)是只允許/|: _端進(jìn)行插入,而在另一端進(jìn)行刪除的運(yùn)W受 限的線性表隊(duì)1示怠閣(1)允許刪除的一端稱為隊(duì)頭(Front)。(2)允許插入的一端稱為隊(duì)尾(Rear)。(3)當(dāng)隊(duì)列中沒(méi)有兀桌時(shí)稱為空隊(duì)列。(4)隊(duì)列亦稱作宄進(jìn)先出(First In First
10、Out)的線性表,簡(jiǎn)稱為PIFO 表。隊(duì)列的修改足依先進(jìn)先出的Ki則進(jìn)忭的。新米的成W總足加入隊(duì)M (即小 允許'加塞',每次離開(kāi)的成員總是隊(duì)列頭上的(不允許中途離隊(duì)),即當(dāng)前* W老的'成M離隊(duì)。【例】在隊(duì)列中依次加入元索a:,a:,as之后,a:是隊(duì)頭元素,是隊(duì)尾 元素。退出隊(duì)列的次序只能是a:,a:,,2、隊(duì)列的基本邏輯運(yùn)算< 1) I nit Queue (Q)a空隊(duì)。構(gòu)造一個(gè)空隊(duì)列i(2)QueueEmpty (Q)判隊(duì)空。若隊(duì)列Q為空,則返回處值,否則返回假值。(3)QueueFull (Q)判隊(duì)滿。微列Q為滿,則返回真值,否則返回假值。注意:此操作只
11、適用于隊(duì)列的顧序存儲(chǔ)結(jié)構(gòu)。(4) EnQueue (Q. x)苦隊(duì)列Q非滿.則將元素x捕入Q的隊(duì)尾。此操作簡(jiǎn)稱入隊(duì),(5 ) DeQueue (Q)矜隊(duì)列Q非空,則刪iQ的隊(duì)頭元素,井返回該元素。此操作簡(jiǎn)稱出隊(duì)。 < 6 ) QueueFront (Q)打隊(duì)列Q非空,則返回隊(duì)尖元紊,但不改變隊(duì)列Q的狀態(tài)。三、鏈表1. 鏈結(jié)點(diǎn)A屮,毎個(gè)數(shù)IK項(xiàng)W披包穴介:點(diǎn)“屮,一個(gè)點(diǎn)足K個(gè)類的對(duì)».這個(gè)類可認(rèn)叫做 LINK,W為一個(gè)鏈表屮有許多類似的鏈結(jié)點(diǎn),所以有必嬰用一個(gè)小M r鏈農(nóng)的類米衣達(dá) 鏈結(jié)點(diǎn)。毎個(gè)LINK對(duì)象屮都fl含一個(gè)對(duì)卜一個(gè)點(diǎn)引用的字段(通常叫做next)但足本 身的對(duì)象屮有
12、一個(gè)字段衍向?qū)Φ谝粋€(gè)鏈結(jié)點(diǎn)的引用單鏈表川一組地址f r怠的 <儲(chǔ)'V* 7G介放線性表屮的麵/lA *以元糸(數(shù)據(jù)元蒺的映象)+衍針(衍示后淋乂蒺存儲(chǔ)位?i)=結(jié)點(diǎn)(衣承數(shù)據(jù)九名 成 數(shù)據(jù)允么的映紮)以'鈷點(diǎn)的序列'表示線性表稱作線性鏈衣(甲鏈衣)一中鏈S玷一種順序存取的結(jié)構(gòu).為找第i個(gè)數(shù)裾元索.必須先找到第i-1個(gè)數(shù) 據(jù)元索。因此,卉找第i個(gè)數(shù)據(jù)乂蒺的堪本操作為:移動(dòng)指針,比較j和i1. 鏈接存儲(chǔ)方法鏈接方式介fifi的線性衣簡(jiǎn)稱為鏈衣(Linked List)。鏈農(nóng)的W體存儲(chǔ)農(nóng)示為: 用一紐任憊的行儲(chǔ)中九來(lái)存放線性表的結(jié)點(diǎn)(這組存儲(chǔ)中.沁既4以足連續(xù)的, 也4
13、以足不連續(xù)的 鏈衣中結(jié)點(diǎn)的邏輯次序和物理次序不一定相h4.為了能正確表示結(jié)點(diǎn)間的邏 訊又系.在存儲(chǔ)捋個(gè)紡點(diǎn)仉的M時(shí),還必須ff儲(chǔ)詣zrUt后繼點(diǎn)的地址(或RK)(H 總(稱為衍計(jì)(pointer)成鏈(link)注總:鏈?zhǔn)酱鎯?chǔ)是最常用的存儲(chǔ)方式之一*它不僅可用來(lái)表示線性表,而且可用來(lái)表示 什種非線性的數(shù)煙結(jié)構(gòu)。2、鏈農(nóng)的結(jié)點(diǎn)結(jié)構(gòu)| data | next|data 存放結(jié)點(diǎn)ftt的數(shù)椐域next域-存放結(jié)點(diǎn)的11接后繼的地址(位W)的ttitl域(鏈域 注意: 鏈發(fā)通過(guò)甸個(gè)紡點(diǎn)的®域?qū)⒕€性及的n個(gè)姑點(diǎn)按R:邏鍆_序鏈接在、起的. 每個(gè)結(jié)點(diǎn)只17 個(gè)鏈域的璉農(nóng)稱為單K衣(Single
14、Linked List)【例】線性表(bat. cat. eat. fat. hat,jat. lat. mat)的單鏈表示如示意M3. iffi針head和終端結(jié)點(diǎn)桁針域的農(nóng)示中鏈5屮每個(gè)結(jié)點(diǎn)的存儲(chǔ)地址足存放在宂前朽結(jié)點(diǎn)next域屮,而開(kāi)始結(jié)點(diǎn)無(wú)前 釣.故應(yīng)沒(méi)頭指針had銜向開(kāi)始結(jié)點(diǎn),注?。烘湵碛深^指針唯一確定,中.鏈表"r以用尖柑針的名'?來(lái)命名?!纠炕鹬竑l名足head的鏈5可稱為S head.終端結(jié)點(diǎn)無(wú)后繼.故終端結(jié)點(diǎn)的衍計(jì)域?yàn)榭?,即NULLo4. 妒鏈農(nóng)的一般ra示法山F我們常常只注1KW點(diǎn)W的邏SH順#.個(gè)又心埒個(gè)W點(diǎn)的實(shí)牀位K,叫以川箭 頭來(lái)表示»域
15、屮的折針,線性農(nóng)(bat, cat, fat. hat,jat, lat. mat)的單鏈R就可 以農(nóng)示為下閣形式。5. 屮鏈衣類喂描述typedef char DataType,結(jié)點(diǎn)的數(shù)招域炎型為7符typedef struct node /結(jié)點(diǎn)類型定義 DataType data; /結(jié)點(diǎn)的數(shù)據(jù)域struct node *nxt;"結(jié)點(diǎn)的街針域JListNodetypedef ListNode *LinkList;ListNode *p; LinkList head;注意: -LinkLiSt和ListNode是不網(wǎng)名字的M個(gè)栴針炎型(命名的不叫是為了 Ift念 上更明確)
16、39;LinkUst類叩的指針變量head表示它是取鏈表的尖措針 ListNode類咽的指針變量p表示它S指向坫一結(jié)點(diǎn)的拘針6. 銜針變量和結(jié)點(diǎn)變量衍針變頃|結(jié)點(diǎn)變S |IIIIIII| *義丨在變hl說(shuō)明部分顯式記義|在W序執(zhí)行吋.通過(guò)標(biāo)準(zhǔn)| | | |涵數(shù)malloc生成|II1III1|取tfi | IK空時(shí),存放K炎點(diǎn)|劣存放紀(jì)點(diǎn)ft域A界| | |的地址| |11111t1|操作方式丨通過(guò)衍針變R名W問(wèn)|通過(guò)衍針生成、W問(wèn)和杼放IIIII 生成結(jié)點(diǎn)變R的杯袱函數(shù)p=( ListNode *)malloc(sizeof(ListNode):/嘁數(shù)malloc分S!-個(gè)類喂為L(zhǎng)istNo
17、de的結(jié)點(diǎn)變員的空問(wèn),并將Jt打地址放入指 針變® P屮 釋放W點(diǎn)變空M的W準(zhǔn)函數(shù)free(p): /W放p所指的W點(diǎn)變尕空問(wèn) 結(jié)點(diǎn)分砑的訪問(wèn)利用鈷點(diǎn)變景的名字.p訪問(wèn)鈷點(diǎn)分W方法一:(*p).data 和(*p).nxt方法二:p- > data W p- > next 衍i I 變51 P和結(jié)>.*.(變* p的關(guān)系栴針變® p的偵一結(jié)點(diǎn)地址結(jié)點(diǎn)變的位一一結(jié)點(diǎn)內(nèi)容(p) data的tfip指針?biāo)附Y(jié)點(diǎn)的data域的fft('p).next的tfi*p后繼結(jié)點(diǎn)的地址(Cp) next)"p G繼結(jié)點(diǎn)注意: 打指針變Rp的位為空(NULL
18、),則它不指向點(diǎn)。此時(shí),通過(guò)*p 來(lái)W問(wèn)結(jié)點(diǎn)就怠味問(wèn)一個(gè)不存在的變Hb從ifuJI起ft!序的錯(cuò)W. 打關(guān)桁計(jì)類燉的S義和說(shuō)明方式的洋細(xì)解Wfir見(jiàn).在鏈衣中捕入結(jié)點(diǎn)只爾要修改疳針但同吋,農(nóng)要在第i個(gè)結(jié)點(diǎn)之曲摘 入元桌,修改的足笫i-1個(gè)鈷點(diǎn)的衍針.w此.在中a農(nóng)屮第i個(gè)w點(diǎn)之前遜行插入的咕木採(cǎi)怍為: 找到線性農(nóng)中第i-i個(gè)律點(diǎn),然后修改其描向后經(jīng)的指針。 雙端鏈表雙端鏈農(nóng)1J傳統(tǒng)的鏈農(nóng)II:??鬯?,(LIS它G個(gè)新増的特性:即對(duì)E/fi 個(gè)鏈結(jié)點(diǎn)的 引用.就像對(duì)第一個(gè)璉結(jié)點(diǎn)的引用一樣。利個(gè)鏈結(jié)點(diǎn)的引川允許像在衣尖-忭,在衣接插入-個(gè)鏈結(jié)點(diǎn)。當(dāng)然.仍 然可以在代通的中鏈衣的農(nóng)化插入一個(gè)鏈結(jié)點(diǎn),
19、方讓足遍歷整個(gè)鏈農(nóng)II到到達(dá)SJd, 但足這種方法效率很低。對(duì)KG -個(gè)鏈結(jié)點(diǎn)的引用允11像在衣尖-忭.在衣接插入一個(gè)鏈結(jié)點(diǎn)。、然.仍 然呵以在&通的犖鏈衣的?dd捕入一個(gè)a鈷點(diǎn),Zfi人足歷®個(gè)鏈衣££到到込衣Jd. 01足這種方法效率很低。像農(nóng)義一樣沁問(wèn)農(nóng)W的W性,使«鏈發(fā)出適介F叫作通鏈農(nóng)小介迚操作的場(chǎng) 介,隊(duì)列的實(shí)現(xiàn)就G這樣一個(gè)估況、卜_而足一個(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(); 為了簡(jiǎn)申起兇,在這個(gè)程序屮,把毎個(gè)a結(jié)點(diǎn)屮的數(shù)裾宇段個(gè)數(shù)從網(wǎng)個(gè)縮到-個(gè). 這史容W以示鋌結(jié)點(diǎn)的內(nèi)容。(C住,在-個(gè)正人的EFp屮,可能會(huì)打II常多的數(shù)據(jù) 字段,或片對(duì)另外一個(gè)對(duì)象的引用,那個(gè)對(duì)象也包
24、介很多數(shù)據(jù)7段.>這個(gè)R序在衣尖和農(nóng)祕(mì)插入三個(gè)鏈點(diǎn),顯示插入G的鏈衣。然C刪除孓兩個(gè)鏈結(jié)點(diǎn). 再次顯示*注怠在農(nóng)又正兒捕入操作公觸例漣結(jié)點(diǎn)進(jìn)入的顧序.而在衣化的入則保待鏈W 點(diǎn)進(jìn)入的_序。雙期鏈表類叫做FirstLastList.它有兩個(gè)項(xiàng),first和last.-個(gè)抱向鏈表中的第-個(gè) 鏈結(jié)點(diǎn)*另一個(gè)析時(shí)最后一個(gè)鏈結(jié)點(diǎn)*如果鏈表中只有一個(gè)鏈結(jié)點(diǎn),first和last就都 指向它.如果沒(méi)介鏈結(jié)點(diǎn).兩S部為Null (ft。這個(gè)炎-個(gè)新的/法insertLast().這個(gè)Zf法在插入個(gè)新的鏈結(jié)點(diǎn),這個(gè)過(guò) 程B先改變last.next,使其梅向新生成的鏈結(jié)點(diǎn),然后改變last,使其折仰新的鏈結(jié)
25、 點(diǎn)W入和刪除方法和ff通鏈衣的相應(yīng)部分炎似。然iftj. 個(gè)捕入方法邢從芩慮一種特殊 情況即插入前鏈表是空的.如果isEmpty()是真,那么insertFirst()必須把last銜向 新的鏈結(jié)點(diǎn),insertLast()也必須把first衍何新的鏈結(jié)點(diǎn).如果用insertFirst()力讓i:現(xiàn)在表頭插入.first就術(shù)向新的鏈結(jié)點(diǎn),用insertLast()方 法實(shí)現(xiàn)在農(nóng)圮捕入.last就桁叫新的鏈結(jié)點(diǎn)。如K6L農(nóng)只燈-個(gè)鏈結(jié)那么多衣A 析除也是一神特殊憤況:last必須被賦值為null值.不幸的是,用雙端鏈表也不能有助rm除最后一個(gè)鏈鈷點(diǎn),因?yàn)闆](méi)ff個(gè)引用抱向倒 數(shù)弟二個(gè)鏈結(jié)點(diǎn).如果
26、WG 個(gè)鏈W點(diǎn)被刪除,倒第二個(gè)鏈鈷點(diǎn)的Next 7段hV汝 變l& Null ffi。為了乃'使的刪除WS7 個(gè)鏈結(jié)點(diǎn),況® -個(gè)雙叫鏈農(nóng)。(,然,也4以 iHWffi個(gè)璉衣找到個(gè)鏈結(jié)點(diǎn).(11足那托做效率小足很品。有序鏈表在餅鍵表屮,數(shù)裾是按照關(guān)鍵偵打序排列的。備序鏈表的劚除常常足只限于刪除在 鏈衣頭部的最小鏈結(jié)點(diǎn)。不過(guò).有時(shí)也用F_方法和Dlei)方法在整個(gè)鏈衣中搜 索某一特定點(diǎn)。一般.在人多數(shù)嬰使用有序數(shù)組的場(chǎng)介也可以使用有序鏈農(nóng)。有序鏈衣優(yōu)r有序數(shù) 組的地乃足捕入的速度,另外鏈衣紂以擴(kuò)展到全部打效的使川內(nèi)介,Ifli數(shù)組只能AJ限 f個(gè)ra定的人小屮。但足,介
27、序鏈衣實(shí)現(xiàn)起來(lái)比a序數(shù)組史困難一些。后而將<1到一個(gè)釘序鏈表的應(yīng)用:為數(shù)累排序.有序鏈表也可以用F實(shí)現(xiàn)優(yōu)先級(jí)隊(duì) 盡竹堆足史常用的丈現(xiàn)方法,在打序鏈衣屮插入一個(gè)數(shù)據(jù)項(xiàng)的Java代碼為/在一個(gè)印鏈農(nóng)屮插入數(shù)據(jù)項(xiàng).!7法必須打先拽索鏈衣,到找到介適的位W: 它恰4f在第-個(gè)比它人的數(shù)椐項(xiàng)的前而。3鋅法找到r®插入的位迓,用通簾的方式捕入數(shù)裾項(xiàng):把新鏈結(jié)點(diǎn)的Next字段很 問(wèn)卜一個(gè)鏈結(jié)點(diǎn),然后把前一個(gè)鏈結(jié)點(diǎn)的Next '/段改為指M新的鏈結(jié)點(diǎn).然而.X 慮一些特殊情況:鍵鈷點(diǎn)有司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; 在鏈表上移動(dòng)時(shí).3;要用一個(gè)previous引用.這樣才能把前一個(gè)鏈結(jié)點(diǎn)的Next字段 指M新的鏈結(jié)點(diǎn).創(chuàng)讓新鏈結(jié)點(diǎn)后
29、,把current變歃沒(méi)為first.準(zhǔn)S搜索IE確的插入 點(diǎn),這時(shí)也把previous沒(méi)為Null俏,這步操作很氓逛,W為后曲要用這個(gè)Null俏判 斷&否仍在表尖While (Ifi環(huán)和以前叫來(lái)拽索插入點(diǎn)的代嗎炎似.倒是介一個(gè)附加的條件。如果當(dāng)前檢 «的鏈結(jié)點(diǎn)的關(guān)鍵tfi不再小f待袖入的鏈結(jié)點(diǎn)的關(guān)仉,則循環(huán)結(jié)束:這足最常見(jiàn)的 w況,即新關(guān)aww在鋌農(nóng)屮部的x個(gè)地然ifij .如! current力Null俏,while循環(huán)也公伶ik*這種怙況發(fā)肀在成/J鏈 表為空時(shí) 如果current在衣頭或?5鏈衣為空,previous將為Nullffi:所以讓first析向新的鏈結(jié) 點(diǎn)
30、.否則current處在鏈農(nóng)屮部或結(jié)叱,就使previous的next 7段衍向新的鏈綰點(diǎn)。 不論嗎種情況、部讓析鏈結(jié)點(diǎn)的Next 7段指向current, ftl果在衣尾,current為Nu II ft,則新鏈結(jié)點(diǎn)的Next 7段也本戍該3為這個(gè)tfi (Null) * brfnffifj序鏈表的W序SortedList java 程序?qū)崿F(xiàn)了一個(gè) SortedList 類,它擁有 insert()、remove()和 display ListO方法.只有insert()方法與無(wú)序鏈表中的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的兩個(gè)鏈結(jié)點(diǎn)然后丙插入三個(gè)鏈結(jié)點(diǎn),分別 S 10. 30和50u這三個(gè)偵分別插在表1、表屮和衣尼。這說(shuō)明insert()方法iE確地 處理了特殊情況.后刪除了一個(gè)鏈結(jié)點(diǎn),表
35、現(xiàn)出刪除操作總從表尖進(jìn)行。毎一步 變化后.都顯示®個(gè)漣衣.雙向鏈表雙向鏈衣也叫雙鏈衣.足鏈衣的一種,它的每個(gè)數(shù)據(jù)結(jié)點(diǎn)屮都fl兩個(gè)指針.分別指向 直接后繼和H接前驅(qū)*所以,從雙向鏈農(nóng)中的任意-個(gè)結(jié)點(diǎn)幵始,都可以很方便地訪M它的前職結(jié)點(diǎn)和G繼結(jié)點(diǎn) 一般我們都構(gòu)造雙W循環(huán)鏈去*/線性表的雙W鏈表介儲(chǔ)鈷構(gòu)/ typedef struct DuLNodeElemType data,struct DuLNode "prior,*next;)DuLNode,"DuLinkList;/*帶頭結(jié)點(diǎn)的雙向循環(huán)鏈表的*本操作<14個(gè))/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>第一個(gè)結(jié)點(diǎn) */while(pl=L) P p沒(méi)到表頭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 攢向第一個(gè)結(jié)點(diǎn)/while(p!=L) /p沒(méi)到農(nóng)火7q=p->next;free(p);P=q;L->next=L->prior=L; /頭結(jié)點(diǎn)的兩個(gè)指針域均柑向自身/ )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ù)元蒺個(gè)數(shù)”int i=0;DuLinkList p=L->next; / p 指向第一個(gè)結(jié)點(diǎn)/while(p!=L) / p 沒(méi)到表頭 7 i*;p=p->next;return i;Status GetElem(DuLinkList L.int i.ElemType *e) /-當(dāng)?shù)趇個(gè)蒺存在時(shí),Kfrt賦給e并返回OK.否則返回ERROR 7 int j=1; /j為計(jì)數(shù)器/DuLinkList p=L->next;
39、 / p 柑向第一個(gè)結(jié)點(diǎn)/while(p!=L&&jnext;j+;if(p=L|j>i) r第i個(gè)元素不存在7return ERROR;e=p->data; /* 収第 i 個(gè)元索/return OK;)int LocateElem(DuLinkList L.EIemType e.StatusCompareXEIemType.Elem Type) P初始條件:L己存在,compare()是數(shù)W元索判定函數(shù)/r操作結(jié)尖:返回L屮第1個(gè)與e滿足關(guān)系compare()的數(shù)據(jù)元索的位序.7 / 這樣的數(shù)據(jù)元索不存在,則返回衍為0 ,int i=0;DuLinkList p
40、=L->next; /* p 推向第 1 個(gè)元素/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不足第一個(gè).則用pre_e返冋它的 前驅(qū),Vr否則探作失敗,pre_e無(wú)定義/DuLinkList p=L->next->next; / p 析句第 2 個(gè)元麻/while(pl=L)
41、 / p 沒(méi)到表頭/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不-個(gè),則用next_e返冋 它的后繼,/r否則操作失敗,nxt_無(wú)定義/DuLinkList p=L->next->next; / p 衍向第 2 個(gè)元索 */while(p!=L) / p 沒(méi)到農(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個(gè)元蒺的地址.i為0.返|ul尖幼點(diǎn)的地址。打第i 個(gè)元索不存在.*/返l"l NULL /int j; DuLinkList p=L; /p折向頭結(jié)點(diǎn)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é)點(diǎn)的雙鏈循環(huán)線性5L屮第i個(gè)之前插入A蒺e.i的介法ffi為 1<i<?< 長(zhǎng)+1 /r改進(jìn)172 18.缶則無(wú)法在第衣IC+1個(gè)結(jié)點(diǎn)之前插入冗桌/DuLinkList p,s;if(i<1|i>ListLength(L)+1) /* iffi不合法 7 return ERROR;p=GetElemP(L,i-1);"在L中確定第i個(gè)元素前®的位S柑針p 7 if(1p) r p=N
44、ULL,即第i個(gè)元素的前驅(qū)不存在(設(shè)Jk結(jié)點(diǎn)為第1個(gè)元索的前驅(qū)/ return ERROR;s=(DuLinkList)malloc(sizeof(DuLNodG);if(return OVERFLOW;s>data=e;s->prior=p; P在第卜1個(gè)九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é)點(diǎn)的雙鏈循環(huán)線性衣l的® i個(gè)元蕤,i的介法仿為
45、農(nóng)松/ DuLinkList p;/* i值不介法7return ERROR;p=GetElemP(L,i); /在L中確定第i個(gè)元隸的位®拊針p/ if('p) P p=NULL,即第i個(gè)元素不存在/ 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ū)皞€(gè)數(shù)裾冗蒺
46、調(diào)用函數(shù)visit() DuLinkList p=L->next; /* p 侑向久結(jié)點(diǎn) */while(pl=L)visit(p->data);p=p->next,printf("n");)void ListTraverseBack(DuLinkList L,void(*visit)(ElemType) /'由雙®拋壞線性的火結(jié)點(diǎn)出發(fā),逆序?qū)γ總€(gè)數(shù)據(jù)元東調(diào)用凼數(shù)visit(). W加!DuLinkList p=L->prior; /* p JdWi 點(diǎn) 7while(p!=L)visit(p->data);p=p->p
47、rior; printf("n");迭代器迭代器足一種對(duì)象,它能夠用來(lái)遍歷STL容器屮的部分成全部i蒺,每個(gè)迭代器對(duì) 象代衣容器屮的確定的地址.迭代器修改了常規(guī)指針的接丨I,所m選代器足種槪念 上的抽象:那些行為上象迭代器的東西都苛以叫做迭代器。然而迭代器打很多不同的 能力,它吋以把抽象容器和通用算法有機(jī)的統(tǒng) 起來(lái).迭代器捉供一些坫本怏作符:、+、=、!=,=這些視作和C/CW找作array元 素時(shí)的柑針接口一致。不M之處在J.-,迭代器是個(gè)所謂的smart pointers,只有遇歷 y雜數(shù)裾結(jié)構(gòu)的能力。WFS運(yùn)行扒制取決rjt所歷的數(shù)裾結(jié)構(gòu),岡此.« .種料
48、器吧別都必須捉供n己的迭代器,少實(shí)上甸-種矜器都將u迭代器以嵌套的力式定義 r內(nèi)部.因此各種迭代器的接11相M,型別卻不M.這££接導(dǎo)出了泛型程序設(shè)計(jì)的槪 念:所有操作行為都使用相同接U,里然它們的墩別不同。功能選代器使開(kāi)發(fā)人員能夠在類或紡構(gòu)屮支持foreach迭代,而不必整個(gè)實(shí)現(xiàn)lEnumerab le或?MEnumerator接丨I。只耑捉供-個(gè)迭代器.即可遍歷炎屮的數(shù)裾結(jié)構(gòu)。3編i子 器檢薄到迭代器時(shí)將門(mén)動(dòng)生成lEnumerable接【I或者lEnumerator接口的Current.MoveNext 和 Dispose 力法.特點(diǎn)1. 迭代器是可以返回相同類型值的有
49、序序列的-段代碼;2. 迭代器可用作A法、運(yùn)汀符成get訪問(wèn)器的代W體:3. 迭代器代碼使JT yield return通句依次返回每個(gè)元索.yield break將終止迭代:4. 可以在類中實(shí)現(xiàn)多個(gè)迭代器,毎個(gè)迭代器都必須像任何類成員,樣有惟.的名 稱.并且可以在foreach語(yǔ)句中披客戶端代碼調(diào)用:5. 迭代器的返回類艱必須為lEnumerable和lEnumerator屮的任意一種:6. 迭代器S產(chǎn)生仇的打序序列的一個(gè)塊,不同r打一個(gè) 或多個(gè)yield 存 在的常規(guī)講塊;7迭代器不忡成員,它八實(shí)現(xiàn)ffl數(shù)成員的方式.理解這一點(diǎn)£很呎贄的. 個(gè)通過(guò)a代器實(shí)現(xiàn)的成w.可以妓it他可
50、能或小可能通過(guò)迭代器丈現(xiàn)的成ws溫和 腿:8.迭代器塊在c#ifi法屮不足獨(dú)特的它們?cè)趲讉€(gè)方而受到限制,并nt® 作用在函敗成M聲明的語(yǔ)義上,它們?cè)谡V法上只是語(yǔ)句塊而己:、遞歸雄婦是番數(shù)調(diào)用白身的種特殊的編程技術(shù).其應(yīng)用主要在以卜兒個(gè)方面:階乘ft java 屮的柚木形AW: Public void mothed «intn)/'l,i滿足某條件時(shí): Mothed (n-1 ):遞歸二分査找Java二分6找實(shí)現(xiàn),歡迎大家提出交流意見(jiàn).廣 名稱:Binarysearch功能:實(shí)現(xiàn)了折字&找(二分査找)的遞#1和非遞H算法. 說(shuō)明:1、要求所査找的數(shù)組己有序,并
51、且其中元素己實(shí)現(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í)在數(shù)組的全找序屮完全吋以使用史加易憚簡(jiǎn)便的寫(xiě)認(rèn)一一for循環(huán),但足通過(guò) for循環(huán)編寫(xiě)數(shù)扣今排序耑®打一個(gè)先決條件一知道數(shù)饑個(gè)排序的個(gè)數(shù).因?yàn)榇?n個(gè)數(shù)裾全梓序就痛®寫(xiě)n個(gè)嵌套for循環(huán).因此在寫(xiě)全梓序時(shí)一般使用遞H方 法.這是我的第一個(gè)關(guān)F遞浦序的見(jiàn)解遞W拌序可以無(wú)耑C知I徘序數(shù)
57、組 的長(zhǎng)度,即排序個(gè)數(shù)!Jt二,不管是使用遞歸進(jìn)行數(shù)組排序還是使用tor循環(huán)進(jìn)行數(shù)組的排序,它們都 S木質(zhì)都£使用枚舉,岡此以出這樣一個(gè)結(jié)論:枚準(zhǔn)"I以確保找出埒一種"J*能 的序規(guī)則!Jt-2.枚舉足列出所介的方法并找出符介耍求的W法,W此Jt燈法效半一定比較 的低.況耍對(duì)w進(jìn)行優(yōu)化.1能込到較好的效果(遞yi的時(shí)候jit除所打不吋能的 方案)消除遞歸消除遞yi的祛本思路足用棧來(lái)模擬系統(tǒng)的函數(shù)調(diào)用從而消除遞in* 法木上嬰做一卜_三件出:傳遞參數(shù)(包括返回地址)并轉(zhuǎn)到函數(shù)入i-i:獲得參數(shù) 并處理參數(shù):根據(jù)傳入的返M地址返1"1五、哈希表一般的線性表、M中,記錄在結(jié)構(gòu)中的相對(duì)位置是隨機(jī)的即和記呆的關(guān)鍵字之問(wèn) 小存在確定的關(guān)系.在結(jié)構(gòu)屮ft找記氽時(shí)芯進(jìn)行一系列和關(guān)鍵字的比較。這一類 杏找旅進(jìn)立在"比較”的礎(chǔ)上.杏找的效率與比較次數(shù)密
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 人員返聘方案(3篇)
- 外出考察工程方案簡(jiǎn)單(3篇)
- 小組崗位人員管理制度
- 園林公司相關(guān)管理制度
- DB6505T 204-2025 晚熟哈密瓜精準(zhǔn)灌溉技術(shù)規(guī)程
- 水塘整治改造方案(3篇)
- 農(nóng)墾小鎮(zhèn)建設(shè)方案(3篇)
- 大棚火災(zāi)調(diào)查方案(3篇)
- 園區(qū)道路升級(jí)改造方案(3篇)
- 圓女活動(dòng)方案(3篇)
- 新一代大學(xué)英語(yǔ)(提高篇)綜合教程2U3 The-way-to-leadership-Task-list
- TCVN-2622-越南建筑防火規(guī)范(中文版)
- 拖欠工資起訴狀模版
- 山東省各地電廠聯(lián)系方式
- 吊裝作業(yè)安全告知牌(現(xiàn)場(chǎng)張貼)
- 鉀離子的測(cè)定—四苯硼鈉季胺鹽容量法
- 犬貓常見(jiàn)消化道疾?。ㄕn堂PPT)
- KV單電源環(huán)形網(wǎng)絡(luò)繼電保護(hù)設(shè)計(jì)——保護(hù)
- 臨床心理科工作指標(biāo)及管理要求
- ASTM A276-1997不銹鋼棒材和型材規(guī)格(中文版)_圖文
- 上饒市光伏產(chǎn)業(yè)發(fā)展規(guī)劃
評(píng)論
0/150
提交評(píng)論