data structure lesson07

15
!!" แผนการสอนประจําบทเรียน รายชื ่ออาจารยผู จัดทํา ไกรสร วงศพราวมาศ และ สุณี รักษาเกียรติศักดิ์ หัวขอของเนื้อหา ตอนที่ 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. ในการสรางลิสต ผู สรางตองดําเนินการสองสิ ่งใหญๆ คือ เลือกการแทนที ่ขอมูลของลิสตและ สรางการดําเนินงานโดยใชการแทนที ่ขอมูลที ่เลือกแลว

description

ตอนที่ 7.2 การประยุกตใชลิสต เรื่องที่ 7.2.1 การใชลิสตในการจัดเก็บขอมูล เรื่องที่ 7.2.2 การใชลิสตในการเรียงลําดับขอมูล แผนการสอนประจําบทเรียน หัวขอของเนื้อหา ประเมินผล 1. ประเมินผลจากกิจกรรมที่ทํา 2. ประเมินผลจากคําถามทายบทเรียน เอกสารประกอบการสอน 1. เอกสารชุดวิชา หัวเรื่อง เรื่องที่ 7.1.1 การกําหนดคุณลักษณะเฉพาะของลิสต เรื่องที่ 7.1.2 การสรางลิสตดวยอะเรย เรื่อ

Transcript of data structure lesson07

!!"

แผนการสอนประจําบทเรียน

รายช่ืออาจารยผูจัดทํา ไกรสร วงศพราวมาศ และ สุณี รักษาเกียรติศักดิ ์

หัวขอของเนื้อหา

ตอนที ่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 Output Create [] 0 Empty [] 0 true Insert A Insert B 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;

!''

END;

VAR L:ARRAY[1..Maxsize] OF StdElement;

Total,Current:0..MaxSize;

PROCEDURE Create;

PROCEDURE Insert(E:StdElement);

PROCEDURE Delete;

PROCEDURE Retrieve(VAR E:StdElement);

PROCEDURE Update(E:StdElement);

PROCEDURE FindFirst;

PROCEDURE FindNext(VAR Fail:boolean);

FUNCTION Empty:boolean;

PROCEDURE 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 Empty:boolean;

BEGIN

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 2

CONST MaxSize=100; 3

TYPE KeyType=1..MaxSize; 4

DataType = RECORD 5

Name:string[15]; 6

Math:integer; 7

Stat:integer; 7

Comp:integer; 9

END; 10

StdElement = RECORD 11

Key:KeyType; 12

Data:DataType; 13

END; 14

Node = RECORD 15

El:StdElement; 16

Next:pointer; 17

END; 18

pointer = ^Node; 19

VAR Head,Current:pointer; 20

PROCEDURE Create; 21

PROCEDURE Insert(E:StdElement); 22

PROCEDURE Delete; 23

PROCEDURE Retrieve(VAR E:StdElement); 24

PROCEDURE Update(E:StdElement); 25

PROCEDURE FindFirst; 26

PROCEDURE FindNext(VAR Fail:boolean); 27

FUNCTION Empty:boolean; 28

PROCEDURE FindKey(TKey:Keytype;VAR Fail:boolean); 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