!!"
แผนการสอนประจําบทเรียน รายชือ่ อาจารยผจู ดั ทํา ไกรสร วงศพราวมาศ และ สุณี รักษาเกียรติศักดิ์ หัวขอของเนื้อหา ตอนที่ 7.1 ชนิดขอมูลแบบลิสต เรือ่ งที่ 7.1.1
การกําหนดคุณลักษณะเฉพาะของลิสต
เรือ่ งที่ 7.1.2
การสรางลิสตดว ยอะเรย
เรือ่ งที่ 7.1.3
การสรางลิสตดว ยลิงคลสิ ต
เรือ่ งที่ 7.1.4
การใชลสิ ต
ตอนที่ 7.2 การประยุกตใชลิสต เรือ่ งที่ 7.2.1
การใชลิสตในการจัดเก็บขอมูล
เรือ่ งที่ 7.2.2
การใชลสิ ตในการเรียงลําดับขอมูล
แนวคิด 1. ชนิดขอมูลแบบลิสตมีการประยุกตใชมากในวิทยาการคอมพิวเตอร 2. ชนิดขอมูลแบบลิสตมีโครงสรางขอมูลแบบเชิงเสน (linear) 3. ชนิดขอมูลแบบลิสตมีคุณสมบัติเฉพาะคือเราสามารถนําขอมูลเขาในลิสตในตําแหนงใด ๆ ของ ลิสตกไ็ ด 4. การดําเนินงานกับลิสตไดแก การสรางลิสต (create) การนําสมาชิกขอมูลเขาลิสต (insert) การ นําสมาชิกขอมูลออกจากลิสต (delete) การทดสอบวาลิสตวา งหรือไม (empty) การทดสอบวา ลิสตเต็มหรือไม (full) การทําใหลสิ ตเปนลิสตวา ง (clear) และการดําเนินการอืน่ ๆ ที่เกี่ยวกับ ลิสต 5. การที่จะใหผูใชเขาใจคุณสมบัติของลิสตที่ตรงกัน จะตองมีการออกแบบคุณสมบัติของลิสต โดย การเขียนคุณลักษณะเฉพาะ (specification) ของลิสตที่เราตองการอยางชัดเจน 6. เมือ่ มีการเขียนคุณลักษณะทีช่ ดั เจนแลว ผูส รางสามารถสรางลิสตตามทีอ่ อกแบบไวได โดยราย ละเอียดของการสรางจะซอนจากผูใช 7. ในการสรางลิสต ผูส รางตองดําเนินการสองสิง่ ใหญๆ คือ เลือกการแทนทีข่ อ มูลของลิสตและ สรางการดําเนินงานโดยใชการแทนทีข่ อ มูลทีเ่ ลือกแลว
!!# 8. ในการสรางลิสต ผูส รางสามารถเลือกใชการแทนทีข่ อ มูลของลิสตแบบอะเรยหรือลิงคลสิ ตกไ็ ด 9. ในการใชชนิดขอมูลแบบลิสต ผูใชเพียงแตใชตามคุณลักษณะเฉพาะที่ออกแบบไวเทานั้น ไม ตองสนใจวาผูสรางจะเลือกการแทนที่ขอมูลของลิสตอยางไร และสรางมาดวยวิธีการอยางไร วัตถุประสงค หลักจากศึกษาบทเรียนที่ 7 แลว นักศึกษาสามารถ 1. บอกถึงคุณลักษณะเฉพาะของลิสตได วาลิสตมีชนิดขอมูลสมาชิกเปนอยางไร มีโครงสรางขอมูล อยางไร และสามารถดําเนินงานอะไรกับลิสตไดบา ง 2. สรางลิสตโดยใชการแทนที่ขอมูลแบบอะเรยได 3. สรางลิสตโดยใชการแทนทีข่ อ มูลแบบลิงคลสิ ตได 4. บอกตัวอยางการประยุกตใชลิสตในสาขาวิทยาการคอมพิวเตอรได กิจกรรมการเรียนการสอน กิจกรรมทีน่ กั ศึกษาตองทําสําหรับการเรียนการสอน ไดแก 1. ศึกษาเอกสารชุดวิชา/โฮมเพจชุดวิชา ตอนที่ 7.1 และตอนที่ 7.2 2. ทํากิจกรรมของบทเรียนที่ 7 3. ทําแบบประเมินผลของบทเรียนที่ 7 เอกสารประกอบการสอน 1. เอกสารชุดวิชา สื่อการสอน 1. โฮมเพจชุดวิชา 2. สไลดประกอบการบรรยาย (Powerpoint) 3. โปรแกรมคอมพิวเตอร ประเมินผล 1. ประเมินผลจากกิจกรรมที่ทํา 2. ประเมินผลจากคําถามทายบทเรียน
!!$ ตอนที่ 7.1 โครงสรางขอมูลแบบลิสต หัวเรื่อง เรือ่ งที่ 7.1.1
การกําหนดคุณลักษณะเฉพาะของลิสต
เรือ่ งที่ 7.1.2
การสรางลิสตดว ยอะเรย
เรือ่ งที่ 7.1.3
การสรางลิสตดว ยลิงคลสิ ต
เรือ่ งที่ 7.1.4
การใชลสิ ต
แนวคิด 1. การกําหนดคุณลักษณะเฉพาะของลิสตมคี วามสําคัญมากในการสือ่ สารระหวางผูส รางลิสตและผู ใชลิสต โดยที่ผูใช ใชโดยทราบขอกําหนดจากคุณลักษณะเฉพาะทีก่ าํ หนดและผูส รางไดสราง ตามคุณลักษณะเฉพาะทีก่ าํ หนด 2. ผูใชไมตองสนใจรายละเอียดของการสราง ผูใชเพียงแตทราบวาลิสตมีคุณสมบัติอยางไรและ สามารถดําเนินงานอะไรกับลิสตไดบา ง ในการดําเนินงานแตละอยาง ผูใชตองใหขอมูลเขา อยางไร และผูใ ชจะไดผลลัพธอะไรหลังจากใชการดําเนินงานนัน้ ๆ 3. ผูส รางสามารถทีจ่ ะสรางลิสตโดยใชการแทนทีข่ อ มูลแบบอะเรยหรือลิงคลสิ ตกไ็ ด โดยไมมีผล ตอการเรียกใชของผูใช วัตถุประสงค หลังจากที่ศึกษาตอนที่ 7.1 แลว นักศึกษาสามารถ 1. 2. 3. 4.
เขียนคุณลักษณะเฉพาะของชนิดขอมูลแบบลิสต และบอกการดําเนินงานทีส่ าํ คัญของลิสตได สรางลิสตดว ยอะเรยได สรางลิสตดว ยลิงคลสิ ตได ใชลิสตได
เรื่องที่ 7.1.1 การกําหนดคุณลักษณะเฉพาะของลิสต มาถึงบทเรียนนี้แลว หวังวานักศึกษาจะไดเห็นความสําคัญของการกําหนดคุณลักษณะเฉพาะของ ชนิดขอมูล (หรือการออกแบบชนิดขอมูล) ซึ่งมีความสําคัญตอการสรางและการใชชนิดขอมุล ในทํานองเดียว กันการกําหนดคุณลักษณะเฉพาะของลิสตจะประกอบดวย 3 สวนใหญๆ คือ - การกําหนดวาสมาชิกขอมูลของลิสตที่ใชมีชนิดขอมูลเปนอะไร - การกําหนดวาสมาชิกของลิสตมีโครงสรางหรือความสัมพันธกันอยางไร - การกําหนดวาเราสามารถดําเนินงานอะไรกับลิสตไดบา ง
!!% ตามทีไ่ ดเกริน่ นําในเรือ่ งที่ 1.1.2 แลววา ในวิชานี้เราจะศึกษาชนิดขอมูลที่มีโครงสรางขอมูลแบบ เชิงเสน 3 ชนิด ดวยกัน ไดแก ชนิดขอมูลแบบสแตก ชนิดขอมูลแบบคิว และชนิดขอมูลแบบลิสต ในคุณ ลักษณะเฉพาะ 5.1 ของบทเรียนที่ 5 เราจะเห็นไดวาการนําสมาชิกเขาในสแตก (Push) และออกจากสแตก (Pop) จะเกี่ยวของเฉพาะกับสมาชิกบนสุด (top) หรือสมาชิกลาสุดของสแตกเทานัน้ สวนชนิดขอมูลแบบคิว การนําสมาชิกเขาในคิว (Enqueue) จะดําเนินการกับสมาชิกตัวสุดทายของคิว (tail) หรือการนําสมาชิกออก จากคิว (Dequeue) จะดําเนินการกับสมาชิกตัวแรกของคิว (head) ดังนัน้ อันดับของสมาชิกตัวอืน่ ๆ จะไมมี ความสําคัญ แตในการจัดเก็บ เปลีย่ นแปลง หรือเรียกใชขอมูลในการประยุกตในงานตาง ๆ เราจะตอง สามารถดําเนินการกับสมาชิกขอมูลตัวใดก็ได ดังนั้นอันดับของขอมูลจะมีความสําคัญ และเราสามารถจะนํา ขอมูลเขาในลิสต (Insert) หรือนําขอมูลออกจากลิสต (Delete) ณ ตําแหนงใดของลิสตกได ดังนัน้ เราจะ กําหนดรายละเอียดของคุณลักษณะเฉพาะของลิสตดงั นี้ คุณลักษณะเฉพาะ 7.1 คุณลักษณะเฉพาะของลิสต สมาชิก
:
สมาชิกของลิสตจะมีชนิดเปนอยางไรก็ได แตในที่นี้สมมุติใหมีชนิดเปน StdElement
โครงสราง :
ลิสตจะมีโครงสรางแบบเชิงเสน นั่นคือสมาชิกแตละตัวจะมีอันดับตั้งแต 1, 2, 3, 4,….,n และการดําเนินงานทีเ่ กิดขึน้ กับลิสตสมารถจะเกิดกับสมาชิตวั ใดก็ได การดําเนินงาน : มีการดําเนินงานดังนี้ Create, Insert, Delete, Retrieve, Update, FindFirst, FindNext, Empty, FindKey โดยมีรายละอียดดังนี้ สัญลักษณ : ให L-pre เปนสถานะของลิสตกอ นการดําเนินงาน ให L-post เปนสถานะของลิสตหลังการดําเนินงาน ให C -pre แทน สมาชิกตัวปจจุบัน กอนการดําเนินงาน ให I_Current เปนอันดับของสมาชิกตัวปจจุบัน ให C –next แทน สมาชิกถัดจากตัวปจจุบัน กอนการดําเนินงาน ให C –prior แทน สมาชิกกอนตัวปจจุบัน กอนการดําเนินงาน {สรางลิสตขน้ึ เปนลิสตวา ง}
Create Pre:
ไมมี
Post:
สรางลิสตขน้ึ ซึง่ เปนลิสตวา ง
Insert ( E : StdElemant ) {ใส E หลังสมาชิกตัวปจจุบัน } Pre:
ลิสตยังไมเต็ม
Post:
E เปนสมาชิกอยูในลิสตหลังสมาชิกตัวปจจุบันของ L-pre และ E จะเปนสมาชิกตัวปจจุบัน ของ L-post {ลบสมาชิกตัวปจจุบันออกจากลิสต}
Delete Pre:
ลิสตตอั งไมเปนลิสตวา ง
!!& Post:
C-pre ตองไมอยูในลิสต ถา C-pre เปนสมาชิกตัวแรก แลว C-next จะเปนสมาชิกตัวแรก ไมเชนนั้น C-next จะ เปนสมาชิกตอจาก C-prior
ถา ลิสตไมเปนลิสตวา ง แลว สมาชิกตัวแรกจะเปนสมาชิกตัวปจจุบัน ไมเชนนั้น ไมมีสมาชิกตัวปจจุบัน Retrieve (VAR E : StdElement) {ดึงขอมูลของตัวปจจุบันมาใช} Pre:
ลิสตตอ งไมเปนลิสตวา ง
Post:
E มีคาเทากับคาของสมาชิกตัวปจจุบัน
Update (E : StdElement) {เปลี่ยนแปลงคาขอมูลตัวปจจุบัน} Pre:
ลิสตตอ งไมเปนลิสตวา ง
Post:
สมาชิกตัวปจจุบันจะมีคาเทากับ E {ใหสมาชิกตัวแรกเปนสามาชิกตัวปจจุบัน}
Findfirst Pre:
ลิสตตอ งไมเปนลิสตวา ง
Post:
สมาชิกตัวแรกจะเปนสมาชิกปจจุบัน
Findnext (VAR Fall : boolean)
{ใหสมาชิกตัวถัดไปเปนสมาชิกตัวปจจุบัน}
Pre:
ลิสตตอ งไมเปนลิสตวา ง
Post:
ถา C-pre ไมใชสมาชิกตัวสุดทาย แลว C-next จะเปนสมาชิกปจจุบัน และ Fail จะเปนเท็จ ไมเชนนั้น Fail จะเปนจริง {ทดสอบวาเปนลิสตวา งหรือไม}
Empty : boolean Pre:
ไมมี
Post:
ถา ลิสตไมมีสมาชิกเลย แลว Empty จะเปนจริง ไมเชนนั้น Empty จะเปนเท็จ
FindKey (Tkey : Keytype; VAR Fail : boolean)
{คนหาสมาชิกตามคียที่กําหนด}
Pre:
ไมมี
Post:
ถาลิสตมีสมาชิกที่มีคียเปน Tkey แลว สมาชิกตัวปจจุบัน จะเปนสมาชิกตัวที่มีคียเปน Tkey และ Fail จะเปนเท็จ ไมเชนนั้น Fail จะเปนจริง
หมายเหตุ ในบทเรียนนีจ้ ะยังไมสามารถสรางการดําเนินงานของ FindKey ได เนือ่ งเราตองรูจ กั วิธกี ารของ การคนหาขอมูล (searching) แบบตาง ๆ กอน ซึ่งจะเรียนกันในบทเรียนที่ 9
!'( กิจกรรม 7.1 ฝกเขียนคุณลักษณะเฉพาะ 1. จงเขียนคุณลักษณะเฉพาะของการดําเนินงาน FindLast เพื่อใหสมาชิกตัวสุดทายของลิสตเปน สมาชิกตัวปจจุบัน 2. จงเขียนคุณลักษณะเฉพาะของการดําเนินงาน ShowList โดยใหมีการพิมพสมาชิกของลิสต ออกมาและลิสตยังมีสมาชิกเหมือนเดิม กิจกรรม 7.2 ฝกการดําเนินการกับลิสต ในตารางขางลางนี้จงแสดงสถานของลิสตหลังการดําเนินงาน (L-post และ I_Current) และผลลัพธท่ี เกิดจากการดําเนินงาน (Output) ของลําดับของการดําเนินงาน (Operation) ตาง ๆ กับลิสต ในที่นี้สมมติให สมาชิกของลิสตมีชนิดเปน StdElement โดยมีคียเปน char และจะแสดงเพียงสวนคียของขอมูลสมาชิกของ ลิสตเทานัน้ No.
Operation
Input
L-Post
I_Current
Create
[]
0
Empty
[]
0
Insert
A
Insert
B
Output true
Empty Insert
C
FindFirst Insert
D
Delete Update
E
FindNext Retrieve กิจกรรม 7.3 เปรียบเทียบการดําเนินงานของสแตก คิว และ ลิสต จากคุณลักษณะเฉพาะของการดําเนินงานของสแตก คิว และลิสต ในคุณลักษณะเฉพาะที่ 5.1, 6.1, และ 6.1 จงเติมตารางเปรียบเทียบการดําเนินงานตอไปนี้ของสแตก คิว และลิสต หากคุณลักษณะเฉพาะ ของสแตกและคิวที่กําหนดมากอนหนานี้ ไมมกี ารดําเนินงานทีเ่ ทียบเคียงได จงพิจารณาวาเราจะสรางการ ดําเนินงานที่สมเหตุสมผลสําหรับขอมูลของสแตกและคิวเพิ่มมาไดหรือไม จงใหเหตุผล และถาทําไดจงเขียน คุณลักษณะเฉพาะของการดําเนินงานของสแตกและคิวทีเ่ พิม่ ขึน้ มา
!'! No.
List
Queue
Stack
Create Insert Delete Empty Full Clear Length Retrieve Update FindFirst FindNext FindPrev FindlLast ShowList เรื่องที่ 7.1.2 การสรางลิสตดว ยอะเรย การสรางลิสตดว ยอะเรย หมายถึง การแทนที่ขอมูลของลิสตดวยอะเรย ซึง่ เปนการจัดสรรเนือ้ ที่ หนวยความจําแบบสแตติก นัน่ คือ มีการกําหนดขนาดของลิสตลวงหนาวามีขนาดเทาใดและจะมีการจัดสรร เนื้อที่หนวยความจําใหเลย ตัวอยางของการสรางลิสตดวยอะเรยไดแสดงในโปรแกรม 7.1 UNIT ListUA; INTERFACE CONST MaxSize=100; TYPE KeyType=1..MaxSize; DataType = RECORD Name:string[15]; Math:integer; Stat:integer; Comp:integer; END; StdElement = RECORD Key:KeyType; Data:DataType;
!'' VAR
END; L:ARRAY[1..Maxsize] OF StdElement; Total,Current:0..MaxSize;
PROCEDURE PROCEDURE PROCEDURE PROCEDURE PROCEDURE PROCEDURE PROCEDURE FUNCTION PROCEDURE
Create; Insert(E:StdElement); Delete; Retrieve(VAR E:StdElement); Update(E:StdElement); FindFirst; FindNext(VAR Fail:boolean); Empty:boolean; FindKey(TKey:Keytype;VAR Fail:boolean);
IMPLEMENTATION PROCEDURE Create; BEGIN Current:=0; Total:=0; END; PROCEDURE Insert(E:StdElement); VAR I:integer; BEGIN IF Current=Total THEN BEGIN Current:=Current+1; L[Current]:=E; END ELSE BEGIN I:=Total; WHILE I<>Current DO BEGIN L[I+1]:=L[I]; I:=I-1; END; L[I+1]:=E; Current:=Current+1; END; Total:=Total+1; END; PROCEDURE Delete; VAR I:integer; BEGIN IF Total<>0 THEN BEGIN I:=Current;
!') WHILE I<>Total DO BEGIN L[I]:=L[I+1]; I:=I+1; END; Total:=Total-1; IF Total=0 THEN Current:=0 ELSE Current:=1; END ELSE Current:=0; END; PROCEDURE Retrieve(VAR E:StdElement); BEGIN END; PROCEDURE Update(E:StdElement); BEGIN END; PROCEDURE FindFirst; BEGIN END; PROCEDURE FindNext(VAR Fail:boolean); BEGIN END; FUNCTION BEGIN
Empty:boolean;
END; END.
โปรแกรม 7.1 การสรางลิสตดว ยอะเรย จากตัวอยางของโปรแกรม 7.1 จะเห็นไดวา การสรางลิสตดว ยอะเรยจะไมเหมาะกับการดําเนินงาน Insert และ Delete เนื่องดวยจะตองมีการเคลื่อนยายขอมูลซึ่งมีประสิทธิภาพเปน O(n) แตหากเราใชการแทน ที่ขอมูลดวยลิงคลิสตจะใชเวลาคงที่คือ O(1) ดังนัน้ การสรางลิสตดว ยลิงคลสิ ตจะเหมาะสมกวา
!'* กิจกรรม 7.4 ฝกปฏิบัติการสรางลิสตดวยอะเรย จงเขียนโปรแกรม 7.1 ใหสมบูรณ (โดยยังไมตองทําการดําเนินงาน FindKey เนือ่ งดวยจะเปนการ คนกาขอมูลซึ่งจะเรียนวิธีการตาง ๆ .ในบทเรียนที่ 9) และใหชื่อวา prog7_1.pas พรอมทั้งคอมไพล โปรแกรม เรื่องที่ 7.1.3 การสรางลิสตดวยลิงคลิสต ในการสรางลิสตดว ยลิงคลสิ ต หมายถึงเราเลือกการแทนทีข่ อ มูลของลิสตดว ยลิงคลสิ ตซง่ึ เปนการจัด สรรเนื้อที่หนวยความจําแบบไดนามิก นัน้ คือ หนวยความจําจะถูกจัดสรรเมื่อมีการขอใชจริง ๆ ระหวางการ ประมวลผลโปรแกรมผานตัวแปรชนิด pointer ในการสรางลิสตดว ยลิงคลสิ ตลสิ ตจะไมมวี นั เต็ม (ไมมีการ ดําเนินงาน Full) ตราบใดที่ยังมีเนื้อที่ของฮีปในหนวยความจํา สวนหนึง่ ของโปรแกรมการสรางลิสตดว ยลิงค ลิสตไดแสดงในโปรแกรม 7.2 UNIT ListUL;
1!
INTERFACE CONST MaxSize=100; TYPE KeyType=1..MaxSize; DataType = RECORD Name:string[15]; Math:integer; Stat:integer; Comp:integer; END; StdElement = RECORD Key:KeyType; Data:DataType; END; Node = RECORD El:StdElement; Next:pointer; END; pointer = ^Node;
2 3 4 5 6 7 7 9 10 11 12 13 14 15 16 17 18 19
VAR
20
Head,Current:pointer;
PROCEDURE PROCEDURE PROCEDURE PROCEDURE PROCEDURE PROCEDURE PROCEDURE FUNCTION PROCEDURE
Create; Insert(E:StdElement); Delete; Retrieve(VAR E:StdElement); Update(E:StdElement); FindFirst; FindNext(VAR Fail:boolean); Empty:boolean; FindKey(TKey:Keytype;VAR Fail:boolean);
21 22 23 24 25 26 27 28 29
!'" IMPLEMENTATION PROCEDURE Create; BEGIN Current:=nil; Head:=nil; END; PROCEDURE Insert(E:StdElement); VAR P:pointer; BEGIN new(P); P^.El:=E; IF Head=nil THEN BEGIN Head:=P; Current:=P; Current^.Next:=nil; END ELSE BEGIN P^.Next:=Current^.Next; Current^.Next:=P; Current:=P; END; END; PROCEDURE Delete; BEGIN END; PROCEDURE Retrieve(VAR E:StdElement); BEGIN E:=Current^.El; END; PROCEDURE Update(E:StdElement); BEGIN Current^.El:=E; END; PROCEDURE FindFirst; BEGIN Current:=Head; END; PROCEDURE FindNext(VAR Fail:boolean); BEGIN Fail:=False; IF Current^.Next<>nil THEN
!'# Current:=Current^.Next ELSE Fail:=True; END; FUNCTION Empty:boolean; BEGIN IF Head=nil THEN Empty:=True ELSE Empty:=False; END; END.
โปรแกรม 7.2 การสรางลิสตดวยลิงคลิสต กิจกรรม 7.5 ฝกการสรางลิสตดวยลิงคลิสต 1. ในโปรแกรมที่ 7.2 โคตบรรทัดใดที่แสดงถึงการแทนที่ขอมูลลิสตดวยลิงคลิสต 2. จงเขียนโปรแกรมใหสมบูรณ และใหชื่อวา prog7_2.pas พรอมคอมไพลโปรแกรมนี้ การเปรียบเทียบประสิทธิภาพการสรางลิสตดว ยอะเรยและลิงคลสิ ต ดวยวิธที าํ นองเดียวกับการเปรียบเทียบประสิทธิภาพการสรางคิวดวยอะเรยและลิงคลสิ ตดงั ไดเรียน มาแลวในบทเรียนที่ 6 ประสิทธิภาพของการดําเนินงานของลิสตทส่ี รางดวยอะเรยและลิงคลสิ ต ดังแสดงใน ตาราง 7.1 ตาราง 7.1 เปรียบเทียบประสิทธิภาพของการดําเนินงานของลิสตที่สรางดวยอะเรยและลิงคลิสต การดําเนินงาน
สรางดวยอะเรย
สรางดวยลิงคลสิ ต
Create
O(1)
O(1)
Insert
O(n)
O(1)
Delete
O(n)
O(1)
Full
O(1)
-
Empty
O(1)
O(1)
Clear
O(1)
O(n)
Length
O(1)
O(n)
Retrieve
O(1)
O(1)
!'$ Update
O(1)
O(1)
FindFirst
O(1)
O(1)
FindNext
O(1)
O(1)
FindPrev
O(1)
O(n)
FindlLast
O(1)
O(n)
ShowList
O(n)
O(n)
จากการเปรียบเทียบประสิทธิภาพของการดําเนินงานของลิสตทส่ี รางดวยอะเรยและลิงคลสิ ตใน ตาราง 7.1 จะเห็นไดวามี 2 การดําเนินงานคือ Insert และ Delete ซึ่งการแทนที่ขอมูลดวยอะเรยจะมีประ สิทธิภาพต่ํากวาการแทนที่ขอมูลดวยลิงคลิสต สวนการดําเนินงาน Clear, Length, FindPrev, และ FindLast นั้นการแทนที่ขอมูลดวยลิงคลิสตจะมีประสิทธิภาพต่ํากวาการแทนที่ขอมูลดวยอะเรย หากเราไมคืนหนวยความจําใหกับฮีป (dispose) เราก็สามารถที่จะเขียนโคตใหมีประสิทธิภาพเปน O(1) ไดสาํ หรับ Clear สวนการทีจ่ ะทําใหการดําเนินงาน Length มีประสิทธิภาพ O(1) เราก็ทาํ ไดโดยการ เพิ่มตัวแปรขึ้นอีก 1 ตัว มีชนิดเปน integer เพื่อนับจํานวนสมาชิกที่มีอยูในลิสต โดยจะตองมีการเพิ่มโคตใน Insert และ Delete และหากตองการให FindLast มีประสิทธิภาพ O(1) ก็สามารถทําไดโดยเพิ่มตัวแปร ชนิด pointer อีก 1 ตัวเก็บ Address (หรือชี้ไปที่) ของโหนดสุดทายของลิสต นั้นคือตัวแปรนี้จะตองเปลี่ยน คาถามีการ Insert หรือ Delete เมื่อ Current เปนโหนดสุดทาย สําหรับการดําเนินงาน FindPrev เราสามารถทําใหประสิทธิภาพเปน O(1) ไดถา เราเลือกการแทน ที่ขอมูลแบบ Doubly Linked List ซึ่งมีการแทนที่ขอมูลดังนี้ TYPE
pointer = ^Node Node = RECORD Prev : pointer El : StdElement; Next : pointer END VAR Head, Current : pointer
ลิสตทส่ี รางดวย Doubly Linked List แสดงใน ภาพประกอบ 7.1 Current Head
4
7
5
8
nil
!'% ภาพประกอบ 7.1 แผนภาพของลิสตที่สรางดวย Doubly Linked List กิจกรรม 7.6 ฝกการสรางลิงคลิสต 1. จงสรางการดําเนินงาน Clear, Length, FindLast ที่ใชการแทนที่ขอมูลดวยลิงคลิสตและมีประ สิทธิภาพ O(1) 2. จงสรางลิสตในโปรแกรมที่ 7.1 ใหม โดยใชการแทนที่ขอมูลแบบ Doubly Linked List 3. จงเปรียบเทียบประสิทธิภาพโดยรวมของการเลือกการแทนที่ขอมูลของลิสตทั้ง 3 แบบ นัน่ คือ การแทนทีล่ สิ ตดว ยอะเรย การแทนทีล่ สิ ตดว ย Simple Linked List และการแทนทีล่ สิ ตดว ย Doubly Linked List เรื่องที่ 7.1.4 การใชและการทดสอบลิสต ในทํานองเดียวกันกับเรือ่ งที่ 5.1.4 การใชและการทดสอบสแตก คือเมือ่ เราสรางลิสตขน้ึ มาแลว ไม วาจะเปนการแทนทีข่ อ มูลลิสตดว ยอะเรย (ListUA.TPU) หรือการแทนทีข่ อ มูลลิสตดว ยลิงคลสิ ต (ListUL.TPU) หรือการแทนทีข่ อ มูลลิสตดว ย Doubly Linked List (ListUDL.TPU) ผูใชสามารถจะเรียกใชการดําเนินงาน ของลิสตไดในรูปแบบเดียวกัน ไมขึ้นกับการแทนที่ขอมูลที่ใช กิจกรรม 7.7 การใชและการทดสอบลิสต จงใชตัวอยางของการทดสอบการใชงานของสแตกในเรื่องที่ 5.1.4 เขียนโปรแกรมเพือ่ ทดสอบการ ทํางานของลิสต โดยใหชนิดขอมูลสมาชิกของลิสตเปน Student และใหเก็บโปรแกรมนี้ชื่อ ListT.pas หมายเหตุ ใน ListT.pas ใหดาํ เนินการรันโปรแกรม 3 ครั้งโดยครั้งที่ 1 เรียกใช ListUA, ครั้งที่ 2 เรียกใช ListUL และครั้งที่ 3 เรียกใช ListUDL ใหเก็บโปรแกรมในไฟลชื่อ prog7_3.pas
!'& ตอนที่ 7.2 การประยุกตใชลิสต หัวเรื่อง เรือ่ งที่ 7.2.1
การใชลิสตในการจัดเก็บขอมูล
เรือ่ งที่ 7.2.2
การใชลสิ ตในการเรียงลําดับขอมูล
แนวคิด 1. ชนิดขอมูลแบบลิสตมีการประยุกตใชมากมายในสาขาวิชาวิทยาการคอมพิวเตอร โดยเฉพาะ อยางยิ่งการใชลิสตในการจัดเก็บขอมูล ดังตัวอยางของการจัดเก็บขอมูลในตารางตาง ๆ ของ ระบบฐานขอมูลเชิงสัมพันธ เชน Access ในชุด Microsoft Office เปนตน 2. ในการเรียงลําดับขอมูล และการคนหาขอมูลอยางงงาย เราก็จะใชลิสตในการจัดเก็บขอมูลเพื่อ การดําเนินงาน วัตถุประสงค 1. เพื่อใหนักศึกษาสามารถเห็นตัวอยางการประยุกตใชชนิดขอมูลแบบลิสตในสาขาวิชาวิทยาการ คอมพิวเตอร เรื่องที่ 7.2.1 การใชลิสตในการจัดเก็บขอมูล ในการจัดเก็บขอมูลในระบบฐานขอมูลเชิงสัมพันธ เชน Access เราจะเห็นไดวา หากเราทําการเก็บ ขอมูลลงในตาราง การดําเนินงานพืน้ ฐานของขอมูลในตารางจะไดแก การใสขอ มูลลงในตาราง (Insert) การ ลบขอมูลออกจากตาราง (Delete) การเลือ่ นไปยังขอมูลทีต่ อ งการ เชน FindFirst, FindLast, FindNext, FindPrev เปนตน กิจกรรม 7.8 ฝกการเรียกการดําเนินงานของลิสต ลองใช Access สรางขอมูลชนิด Student ลงในตาราง และทดสอบการใชงานดวยการสราง Form เรื่องที่ 7.2.2 การใชลิสตในการเรียงลําดับขอมูล หากเรามีขอ มูลทีต่ อ งทําการเรียงลําดับ เราก็สามารถจะใชลสิ ตในการเก็บขอมูลเพือ่ การเรียงลําดับ ได วิธีการเรียงลําดับขอมูลแบบงายจะใชลิสตในการจัดเก็บขอมูล เชน วิธีการเรียงลําดับขอมูลแบบฟอง (bubble), แบบคัดเลือก (selection), และแบบแทรก (insertion) เปนตน ซึง่ จะไดกลาวถึงในรายละเอียดตอ ไปในบทเรียนที่ 8