Danh s¸ch TuyÕn tÝnh
Trong ch¬ng nµy, chóng ta sÏ nghiªn cøu danh s¸ch, mét trong c¸c m« h×nh d÷ liÖu quan träng nhÊt, ®îc sö dông thêng trong c¸c thuËt to¸n. C¸c ph¬ng ph¸p cµi ®Æt danh s¸ch kh¸c nhau sÏ ®îc xÐt. Hai kiÓu d÷ liÖu trõu tîng ®Æc biÖt quan träng lµ ng¨n xÕp (STACK) vµ hµng ®îi (QUEUE) sÏ ®îc nghiªn cøu. Chóng ta còng sÏ tr×nh bµy mét sè øng dông cña danh s¸ch.
I. Kh¸i niÖm vÒ danh s¸ch.
1. §Þnh nghÜa
VÒ mÆt to¸n häc, danh s¸ch lµ mét d·y h÷u h¹n c¸c phÇn tö thuéc cïng mét líp c¸c ®èi tîng nµo ®ã. Ch¼ng h¹n, danh s¸ch sinh viªn cña mét líp, danh s¸ch c¸c sè nguyªn, danh s¸ch c¸c b¸o xuÊt b¶n hµng ngµy ë thñ ®« v.v...
Gi¶ sö L lµ mét danh s¸ch cã n phÇn tö (n>=0).
L = (a1, a2, ..., an)
Ta gäi n lµ ®é dµi cña danh s¸ch. nÕu n>=1 th× a1 ®îc gäi lµ phÇn tö ®Çu tiªn, an ®îc gäi lµ phÇn tö cuèi cïng cña danh s¸ch L. NÕu n=0 th× danh s¸ch L ®îc gäi lµ danh s¸ch rçng.
Mét tÝnh chÊt quan träng cña danh s¸ch lµ c¸c phÇn tö cña nã ®îc s¾p tuyÕn tÝnh: nÕu n>1 th× phÇn tö ai “®i tríc” phÇn tö ai+1. Ta gäi ai (i=1, 2, ..., n) lµ phÇn tö ë vÞ trÝ thø i cña danh s¸ch.
2. C¸c phÐp to¸n trªn danh s¸ch.
Khi m« t¶ mét m« h×nh d÷ liÖu, chóng ta cÇn x¸c ®Þnh c¸c phÐp to¸n cã thÓ thùc hiÖn trªn m« h×nh to¸n häc ®îc dïng lµm cë së cho m« h×nh d÷ liÖu. Cã rÊt nhiÒu phÐp to¸n trªn danh s¸ch. Trong c¸c øng dông, th«ng thêng chóng ta chØ sö dông mét nhãm c¸c phÐp to¸n nµo ®ã. Sau ®©y lµ mét sè phÐp to¸n chÝnh trªn danh s¸ch.
Gi¶ sö L lµ mét danh s¸ch (List), c¸c phÇn tö cña nã cã kiÓu Item nµo ®ã, p lµ mét vÞ trÝ (position) trong danh s¸ch. C¸c phÐp to¸n sÏ ®îc m« t¶ bëi c¸c thñ tôc hoÆc hµm .
1. Khëi t¹o danh s¸ch rçng.
Procedure Initialize(Var L : List);
2. X¸c ®Þnh ®é dµi cña danh s¸ch.
Function Length(L : List) : Integer;
3. Lo¹i phÇn tö ë vÞ trÝ thø p cña danh s¸ch.
Procedure Delete(p : position; Var L : List);
4. Xen phÇn tö X vµo danh s¸ch sau vÞ trÝ thø p.
Procedure Insert_After(X : Item; p : position; Var L : List);
5. Xen phÇn tö X vµo danh s¸ch tríc vÞ trÝ thø p.
Procedure Insert_Before(X : Item; p : position; Var L : List);
6. T×m phÇn X trong danh danh s¸ch.
Function Search(X : Item; L : List) : Boolean;
7. KiÓm tra xem danh s¸ch cã rçng kh«ng?
Function Empty(L : List) : Boolean;
8. KiÓm tra xem danh s¸ch cã ®Çy kh«ng?
Function Full(L : List) : Boolean;
9. DuyÖt danh s¸ch.
Trong nhiÒu øng dông chóng ta ph¶i ®i qua danh s¸ch, tõ ®Çu ®Õn cuèi danh s¸ch vµ thùc hiÖn mét nhãm c¸c thao t¸c nµo ®ã ®èi víi mçi phÇn tö cña danh s¸ch.
Procedure Traverse(Var L : List);
10. C¸c phÐp to¸n kh¸c.
Cßn cã thÓ kÓ ra nhiÒu phÐp to¸n kh¸c. Ch¼ng h¹n truy cËp ®Õn phÇn tö thø i cña danh s¸ch (®Ó tham kh¶o hoÆc thay thÕ), kÕt hîp hai danh s¸ch thµnh mét danh s¸ch, t¸ch mét danh s¸ch thµnh nhiÒu danh s¸ch v.v...
VÝ dô: Gi¶ sö cã danh s¸ch L = (3, 2, 1, 5). Khi ®ã, thùc hiÖn Delete(3, L) ta ®îc danh s¸ch (3, 2, 5). KÕt qu¶ cña Insert_Before(1, 6, L) ta ®îc danh s¸ch (6, 3, 2, 1, 5).
Sau ®©y ta sÏ xÐt mét sè lo¹i danh s¸ch vµ øng dông cña chóng.
II. Danh s¸ch tuyÕn tÝnh.
1. Kh¸i niÖm.
Mét danh s¸ch mµ quan hÖ l©n cËn gi÷a c¸c phÇn tö ®îc hiÓn thÞ ra th× ®îc lµ danh s¸ch tuyÕn tÝnh.
Nh vËy, danh s¸ch tuyÕn tÝnh lµ mét danh s¸ch hoÆc rçng, hoÆc cã d¹ng (a1, a2, ..., an). Trong danh s¸ch tuyÕn tÝnh lu«n tån t¹i mét phÇn tö ®Çu a1 vµ mét phÇn tö cuèi an.
§Ó lu tr÷ danh s¸ch tuyÕn tÝnh trong bé nhí m¸y tÝnh ngêi ta sö dông m¶ng mét chiÒu. Tuy nhiªn viÖc sö dông m¶ng mét chiÒu còng cã nh÷ng u ®iÓm vµ nhîc ®iÓm nhÊt ®Þnh cña nã.
V× m¶ng ®îc ®îc lu tr÷ kÕ tiÕp nªn viÖc truy nhËp viÖc truy nhËp vµo phÇn tö cña m¶ng ®îc thùc hiÖn trùc tiÕp dùa vµo ®Þa chØ tÝnh ®îc (chØ sè), nªn tèc ®é nhanh vµ ®ång ®Òu ®èi víi mäi phÇn tö.
Khi khai b¸o mét m¶ng ta ph¶i x¸c ®Þnh sè lîng phÇn tö cña m¶ng, ®iÒu nµy sÏ tuú thuéc vµo sè lîng ®èi tîng cña danh s¸ch mµ m¶ng lu tr÷, nhng ®iÒu nµy rÊt khã thùc hiÖn v× sè lîng ®èi tîng cña danh s¸ch lu«n lu«n biÕn ®éng. Do ®ã dÉn ®Õn viÖc l·ng phÝ bé nhí (cã nh÷ng phÇn tö m¶ng kh«ng ®îc sö dông) hoÆc thiÕu bé nhí (do tÊt c¶ c¸c phÇn tö m¶ng ®· ®îc sö dông trong khi ta cÇn thªm mét sè ®èi tîng nµo ®ã vµo danh s¸ch).
2. Lu tr÷ kÕ tiÕp cña danh s¸ch tuyÕn tÝnh.
Ph¬ng ph¸p tù nhiªn nhÊt ®Ó cµi ®Æt mét danh s¸ch lµ sö dông m¶ng, trong ®ã mçi thµnh phÇn cña m¶ng lu tr÷ mét phÇn tö nµo ®ã cña danh s¸ch, vµ c¸c phÇn tö kÕ nhau cña danh s¸ch ®îc lu tr÷ trong c¸c thµnh phÇn kÕ nhau cña m¶ng. Sau ®©y sÏ tr×nh bµy hai lo¹i danh s¸ch s¸ch tuyÕn tÝnh lµ ng¨n xÕp (Stack) vµ hµng ®îi (Queue) cïng víi c¸c phÐp to¸n c¬ b¶n cña nã.