data structure lesson04

17
!" แผนการสอนประจําบทเรียน รายชื ่ออาจารยผู จัดทํา สุณี รักษาเกียรติศักดิ์ หัวขอของเนื้อหา ตอนที่ 4.1 การจัดสรรเนื้อที่ในหนวยความจําใหกับตัวแปร (1 คาบ) เรื ่องที 4.1.1 การจัดสรรเนื ้อที ่แบบสแตติก เรื ่องที 4.1.2 การจัดเนื้อที่แบบไดนามิก ตอนที่ 4.2 ลิงคลิสต (2 คาบ) เรื ่องที 4.2.1 การกําหนดคุณลักษณะเฉพาะของลิงคลิสตอยางงาย เรื ่องที 4.2 2 การสรางลิงคลิสตอยางงาย เรื ่องที 4.2.3 การใชลิงคลิสตอยางงาย แนวคิด 1. การจัดสรรเนื้อที่ในหนวยความจําแบงเปน 2 แบบคือ การจัดสรรเนื้อที่ในหนวยความจําแบบ สแตติกและแบบไดนามิก 2. ชนิดของตัวแปรสวนใหญที่เราใช เชน integer, boolean, char, real, array, และ record จะเปน ชนิดที่มีการจัดสรรเนื้อที่หนวยความจําใหกับตัวแปรระหวางการคอมไพล ซึ ่งเราเรียกวาการจัด สรรเนื้อที่หนวยความจําแบบสแตติก 3. ในภาษาคอมพิวเตอรภาษาสูงสวนใหญมักจะมีชนิดของตัวแปรอีกชนิดหนึ่งคือตัวแปรพอยน เตอร ซึ่งเนื้อที่ในหนวยความจําจะถูกจัดสรรเมื่อมีการใชงานตัวแปรนั้นจริง นั ้นคือเนื ้อที ่จะ ถูกจัดสรรเมื ่อมีการเรียกใชระหวางการประมวลผลโปรแกรม ซึ ่งเราเรียกวาเปนการจัดสรรเนื ้อ ที่หนวยความจําแบบไดนามิก 4. ลิงคลิสตอยางงายเปนชนิดขอมูลที่มีโครงสรางแบบเชิงเสน ที่สรางมาจากตัวแปรชนิดพอยน เตอร วัตถุประสงค หลังจากศึกษาบทเรียนที่ 4 แลว นักศึกษาสามารถ 1. เปรียบเทียบขอแตกตางระหวางการจัดสรรเนื้อที่ในหนวยความจําแบบสแตติกและแบบไดนา มิกได

Upload: suhatt-jantorn

Post on 12-Mar-2016

212 views

Category:

Documents


0 download

DESCRIPTION

ตอนที่ 4.2 ลิงคลิสต (2 คาบ) เรื่องที่ 4.2.1 การกําหนดคุณลักษณะเฉพาะของลิงคลิสตอยางงาย เรื่องที่ 4.2 2 การสรางลิงคลิสตอยางงาย เรื่องที่ 4.2.3 การใชลิงคลิสตอยางงาย ประเมินผล 1. ประเมินผลจากกิจกรรมที่ทํา 2. ประเมินผลจากคําถามทายบทเรียน เอกสารประกอบการสอน 1. เอกสารชุดวิชา หัวเรื่อง เรื่องที่ 4.1.1 การจัดสรรเนื้อที่แบบสแตติก เรื่องที่ 4.1.2 การจัดเนื้อที่แบบไดนามิก ตอนที

TRANSCRIPT

Page 1: data structure lesson04

!"

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

รายช่ืออาจารยผูจัดทํา สุณี รักษาเกียรติศักดิ ์

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

ตอนที ่4.1 การจัดสรรเนื้อที่ในหนวยความจําใหกับตัวแปร (1 คาบ) เร่ืองท่ี 4.1.1 การจัดสรรเน้ือท่ีแบบสแตติก เร่ืองท่ี 4.1.2 การจัดเนื้อที่แบบไดนามิก

ตอนที ่4.2 ลิงคลิสต (2 คาบ) เร่ืองท่ี 4.2.1 การกําหนดคุณลักษณะเฉพาะของลิงคลิสตอยางงาย เร่ืองท่ี 4.2 2 การสรางลิงคลิสตอยางงาย เร่ืองท่ี 4.2.3 การใชลิงคลิสตอยางงาย

แนวคดิ 1. การจัดสรรเนื้อที่ในหนวยความจําแบงเปน 2 แบบคือ การจัดสรรเนื้อที่ในหนวยความจําแบบ สแตติกและแบบไดนามิก

2. ชนิดของตัวแปรสวนใหญที่เราใช เชน integer, boolean, char, real, array, และ record จะเปนชนิดที่มีการจัดสรรเนื้อที่หนวยความจําใหกับตัวแปรระหวางการคอมไพล ซ่ึงเราเรียกวาการจัดสรรเนื้อที่หนวยความจําแบบสแตติก

3. ในภาษาคอมพิวเตอรภาษาสูงสวนใหญมักจะมีชนิดของตัวแปรอีกชนิดหนึ่งคือตัวแปรพอยนเตอร ซึ่งเนื้อที่ในหนวยความจําจะถูกจัดสรรเมื่อมีการใชงานตัวแปรนั้นจริง ๆ น้ันคือเน้ือท่ีจะถูกจดัสรรเมือ่มีการเรียกใชระหวางการประมวลผลโปรแกรม ซ่ึงเราเรียกวาเปนการจัดสรรเน้ือที่หนวยความจําแบบไดนามิก

4. ลิงคลิสตอยางงายเปนชนิดขอมูลที่มีโครงสรางแบบเชิงเสน ที่สรางมาจากตัวแปรชนิดพอยนเตอร

วัตถุประสงค หลังจากศึกษาบทเรียนที่ 4 แลว นักศึกษาสามารถ 1. เปรียบเทียบขอแตกตางระหวางการจัดสรรเนื้อที่ในหนวยความจําแบบสแตติกและแบบไดนามิกได

Page 2: data structure lesson04

!#

1. บอกคุณลักษณะเฉพาะของชนิดขอมูลแบบลิงคลิสตอยางงายได 2. สรางชนิดขอมูลแบบลิงคลิสตอยางงายได

กิจกรรมการเรียนการสอน กิจกรรมท่ีนักศึกษาตองทําสําหรับการเรียนการสอน ไดแก 1. ศึกษาเอกสารชดุวิชา/โฮมเพจชุดวิชา ตอนที่ 4.1 และตอนที ่4.2 2. ทํากิจกรรมของบทเรียนที่ 4 3. ทําแบบประเมินผลของบทเรียนที่ 4

เอกสารประกอบการสอน 1. เอกสารชดุวิชา

สื่อการสอน 1. โฮมเพจชุดวิชา 2. สไลดประกอบการบรรยาย (Powerpoint) 3. โปรแกรมคอมพิวเตอร

ประเมินผล 1. ประเมินผลจากกิจกรรมที่ทํา 2. ประเมินผลจากคําถามทายบทเรียน

Page 3: data structure lesson04

!$

ตอนท่ี 4.1 การจัดสรรเนื้อที่ในหนวยความจําใหกับตัวแปร

หัวเรื่อง เร่ืองท่ี 4.1.1 การจัดสรรเน้ือท่ีแบบสแตติก เร่ืองท่ี 4.1.2 การจัดเนื้อที่แบบไดนามิก

แนวคดิ 1. การจัดสรรเนื้อที่ในหนวยความจําแบงเปน 2 แบบคือ การจัดสรรเนื้อที่ในหนวยความจําแบบ สแตติกและแบบไดนามิก

2. ชนิดของตัวแปรสวนใหญที่เราใช เชน integer, boolean, char, real, array, และ record จะเปนชนิดที่มีการจัดสรรเนื้อที่หนวยความจําใหกับตัวแปรระหวางการคอมไพล ซ่ึงเราเรียกวาการจัดสรรเนื้อที่หนวยความจําแบบสแตติ เชนตัวแปรชนิดอะเรย จะตองมีการกําหนดขนาดของอะเรยลวงหนาวาจะมีขนาดเทาใด ซึ่งโดยปกติแลวมักจะเปนขนาดใหญสุดที่คาดวาจะตองใชงาน ซ่ึงในบางคร้ังถาขอมูลของอะเรยมีนอย เนื้อที่ที่จองไวก็จะเสียประโยชน

3. ในภาษาคอมพิวเตอรภาษาสูงสวนใหญมักจะมีชนิดของตัวแปรอีกชนิดหนึ่งคือตัวแปรพอยนเตอร ซึ่งเนื้อที่ในหนวยความจําจะถูกจัดสรรเมื่อมีการใชงานตัวแปรนั้นจริง ๆ น้ันคือเน้ือท่ีจะถูกจดัสรรเมือ่มีการเรียกใชระหวางการประมวลผลโปรแกรม ซ่ึงเราเรียกวาเปนการจัดสรรเน้ือที่หนวยความจําแบบไดนามิก

วัตถุประสงค หลังจากที่ศึกษาตอนที่ 4.1 แลว นักศึกษาสามารถ

1. เปรียบเทียบขอแตกตางของการจัดสรรเนื้อที่หนวยความจําแบบสแตติกและแบบไดนามิกได 2. ใชพอยนเตอรสําหรับตัวแปรแบบไดนามิกได

เรื่องที่ 4.1.1 การจัดสรรเนื้อที่แบบสแตติก

การจัดสรรเนื้อที่ในหนวยความจําแบบสแตติก หมายถึงเนื้อที่ในหนวยความจําจะถูกจัดสรรใหแกใหแกตัวแปรกอนการประมวลผล (execute) น่ันคือระหวางการแปลโปรแกรม (compile) ตัวแปรที่นิยามไวในสวนของการนิยามจะไดรับการจัดสรรเนื้อที่ในหนวยความจําทันที ถึงแมตัวแปรเหลานั้นจะไมไดถูกใชในการเขียนคําส่ัง ซึ่งจะทําใหเสียเนื้อที่ในหนวยความจํา

ตัวแปรแบบอะเรยจะเปนตัวแปรแบบมีโครงสรางซึ่งจะมีการจัดสรรเนื้อที่หนวยความจําแบบสแตติก นั้นคือเนื่อที่ในหนวยความจําจะถูกจัดสรรเทากับขนาดที่กําหนดไวในอะเรย เชน

Page 4: data structure lesson04

!%

TYPE StdElement = RECORD

Key : KeyType;

Data : DataType;

END;

VAR A1 : ARRAY[1..100] OF StdElement;

A2 : ARRAY[1..50,1..100] OF integer;!

จะมีการจัดสรรเนื้อที่ในหนวยความจําใหกับตัวแปร A1 100 ตัว ไดแก A1[1], A1[2], A1[3], … A1[100] และจะมีการจัดสรรเนื้อที่ในหนวยความจําใหกับตัวแปร A2 5000 ตัว ไดแก A2[1,1], A2[1,2], …A2[1,100], A2[2,1], A2[2,2], …A2[2,100],……….A2[50,1], A2[50,2], …..A2[50,100]

ถึงแมเมื่อรันโปรแกรมกับขอมูลจริงจะมีขอมูลสําหรับ A1 เพียง 25 ตัวและทําใหเราตองเสียเนื้อที่ที่จองไวสําหรับตัวแปรตัวที่ A1[26], A1[27], …A1[100] ก็ตาม เราก็ตองจองเน้ือท่ีสูงสุดท่ีเราคาดวาโปรแกรมของเราจะรองรับขอมูลได

การจัดสรรเนื้อที่หนวยความจําแบบสแตติกจะจัดสรรจากหนวยความจําที่เราเรียกวาสแตก (ดูการประยุกตใชสแตกของบทเรียนที่ 5)

กิจกรรม 4.1 ถามีการนิยามตัวแปรแบบอะเรย ดังนี้

VAR A3 : ARRAY[5..10, 3..5] OF real;

A3 จะมีตัวแปรทั้งหมดกี่ตัว และชือ่อะไรบาง หากตองการกําหนดใหตัวแปรดัชนีที่ 3 ของมิติ 1 และดัชนีที่ 4 ของมิติ 2 มีคาเปน 12.5 จะเขียนคําสั่งอยางไร

เรื่องที่ 4.1.2 การจัดสรรเนื้อที่แบบไดนามิก

การจัดสรรเนื้อที่ในหนวยความจําแบบไดนามิก เปนการจัดสรรเนื้อที่หนวยความจําใหกับตัวแปรระหวางการประมวลผล ตัวแปรที่มีคุณสมบัติดังกลาวนี้คือ ตัวแปรแบบพอยนเตอร ดังตัวอยาง

TYPE StdElement = RECORD

Key : KeyType;

Data : DataType;

END;

TYPE pointer = ^StdElement

VAR P : pointer!

จากตัวอยางขางตน เมื่อมีการนิยามหรือประกาศตัวแปร P ซึ่งมีชนิดเปน pointer น้ัน เม่ือคอมไพล

โปรแกรมเสร็จจะยังไมมีการจัดสรรเนื้อที่หนวยความจําใหกับตัวแปร P หนวยความจําจะถูกจัดสรรใหกับตัวแปร P ก็ตอเมื่อมีการรองขอหนวยความจําในระหวางการประมวลผลโปรแกรมดวยคําสั่ง new(P)

Page 5: data structure lesson04

!&

หลังจากคําส่ัง new(P) ส่ิงท่ีเกิดข้ึนคือ ระบบปฏิบัติการจะจัดสรรเนื้อที่จากฮีปชนิด StdElement ใหสมมติที่เริ่มจากตําแหนง (address) ที ่188 ดังน้ัน P จะเก็บคาของตําแหนงหนวยความจํา คือ 188 (จริง ๆ แลว P จะไดรับการจัดสรรเนื้อที่แบบสแตติกหลังจากที่คอมไพลโปรแกรมแลวแต P ยังไมมีคา เมื่อมีการประมวลผลคําส่ัง new(P) จะมีการจัดสรรเนื้อที่ในหนวยความจําจากฮีปใหมีชนิดเปน StdElement ตัวแปรนี้จะชื่อ P^ ซึ่งเปนตัวแปรชนิดระเบียนประกอบดวยตัวแปรยอย 2 ตัวคือ P^.Key และ P^.Data แตตัวแปรทั้งสองนี้ยังไมมีคา P P^ Key Data

188 ถาสมมติวา StdElement มีชนิดเปน StudentRec (จากตัวอยาง 3.8) ซึ่งนิยามดังนี้

TYPE StudentRec = RECORD

Id : string[9]; {Key part}

Name : string[20];

Math, Stat, Comp : integer;

END;

เมือ่มีการเรียกใช new(P) และสมมติวาเนื้อที่ที่จัดสรรใหในฮีปเริ่มที่ตําแหนง 200 P จะมีคาเปน 200 และตัวแปร P^ ซึ่งมีชนิดเปน StudentRec ยังไมมีคา

P P^ Id Name Math Stat Comp

200

หากมีการกําหนดคาใหกับตัวแปร P^ ดังน้ี P^.Id := ‘411021003’; P^.Name := ‘Krisada’; P^.Math := 70; P^.Stat := 65; P^.Comp := 85; ผลท่ีเกิดข้ึนจะเปนดังน้ี P P^ Id Name Math Stat Comp

200 411021003 Krisada 70 65 85

Page 6: data structure lesson04

!!

หากเราไมมีความจําเปนตองใชเนื้อที่นี้อีกแลว เราก็ควรคืนเนื้อที่ในหนวยความจําใหกับระบบปฏิบัติการไปโดยใชคําสั่ง dispose เชน dispose(P) เปนตน

กิจกรรม 4.2 หากมีการนิยามดังนี ้

TYPE StudentRec = RECORD

Id : string[9]; {Key part}

Name : string[20];

Math, Stat, Comp : integer;

END;

pointer = ^StudentRec;

VAR Q : pointer;!

จงเขียนคําสั่งเพื่อเก็บคาของขอมูลชนิด StudentRec ใหมีคาดังนี้ Id = 411021005 Name = Worrawut Math = 60 Stat = 75 Comp = 81

Page 7: data structure lesson04

!'

ตอนท่ี 4.2 ลิงคลิสต

หัวเรื่อง เร่ืองท่ี 4.2.1 การกําหนดคุณลักษณะเฉพาะของลิงคลิสตอยางงาย เร่ืองท่ี 4.2 2 การสรางลิงคลิสตอยางงาย เร่ืองท่ี 4.2.3 การใชลิงคลิสตอยางงาย

แนวคดิ 1. ลิงคลิสตอยางงายเปนชนิดขอมูลที่มีโครงสรางแบบเชิงเสน ที่สรางมาจากตัวแปรชนิดพอยนเตอร

2. ลิงคลิสตอยางงายเปนชนิดขอมูลท่ีเปรียบไดกับอะเรย โดยท่ีอะเรยจะเปนการจัดสรรเน้ือท่ีหนวยความจําแบบสแตติก แตลิงคลิสตจะเปนการจัดสรรเนื้อที่หนวยความจําแบบไดนามิก

3. ในที่นี้จะนําเสนอชนิดขอมูลแบบลิงคลิสตอยางงายดวยหลักการของขอมูลแบบคัดยอ น้ันคือ การกําหนดคุณลักษณะเฉพาะของลิงคลิสตอยางงาย (โดยกําหนดการดําเนินงานหลัก ๆ บางตัวเทานั้น) การสรางลิงคลิสตอยางงาย และทดสอบการใชงาน

วัตถุประสงค หลังจากที่ศึกษาตอนที่ 4.2 แลว นักศึกษาสามารถ 1. เขียนคุณลักษณะเฉพาะของลิงคลิสตอยางงายได 2. สรางลิงคลิสตอยางงายได 3. ทดสอบการใชงานของลิงคลิสตอยางงายได

เรื่องที่ 4.2.1 การกําหนดคุณลักษณะเฉพาะของลิงคลิสตอยางงาย

คุณลักษณะเฉพาะ 4.1 : คุณลักษณะเฉพาะของลิงคลิสตอยางงาย สมาชิก: โหนดซ่ึงเปนเรคคอรดของ 2 สวน คือ สวนของขอมูล (El ซึ่งมีชนิดเปน StdElement ) และ

สวนของพอยนเตอร ซึ่งชี้ไปที่ (หรือเก็บตําแหนงหนวยความจํา) สมาชิกหรือโหนดตัวถัดไป

โครงสราง: ความสัมพันธระหวางสมาชิกเปนแบบเชิงเสน (linear) การดําเนินงาน: ในท่ีน้ีจะกลาวถึงการดําเนินงานบางสวนเทาน้ัน สวนการดําเนินงานท้ังหมดจะไดกลาวถึง

ในรายละเอียดอีกคร้ังหน่ึงเม่ือเรียนถึงชนิดขอมูลแบบลิสต ในบทเรียนที่ 7 สัญลักษณ: ให L–pre แทน ลิสตกอนการดําเนินงาน

Page 8: data structure lesson04

!(

C–pre แทน โหนดปจจุบัน กอนการดําเนินงาน C-next แทน โหนดถัดจากโหนดปจจุบัน กอนการดําเนินงาน C-prior แทน โหนดกอนโหนดปจจุบัน กอนการดําเนินงาน Create {สรางลิสตข้ึนเปนลิสตวาง} Pre: ไมมี Post: สรางลิสตข้ึน ซ่ึงเปนลิสตวาง Insert (E : StdElemant ) {ใส E หลังสมาชิกตัวปจจุบัน} Pre: ไมมี Post: E เปนสมาชิกตัวถัดจากตัวปจจุบันของลิสต และ E จะเปนสมาชิกตัวปจจุบัน 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: C–pre มีคาเทากับ E Findfirst {ใหโหนดแรกเปนโหนดปจจุบัน} Pre: ลิสตตองไมเปนลิสตวาง Post: - โหนดแรกจะเปนโหนดปจจุบัน Findnext (VAR Fail : boolean) {ใหโหนดถัดไปเปนโหนดปจจุบัน} Pre: ลิสตตองไมเปนลิสตวาง Post: ถา C-pre ไมใชโหนดสุดทายแลว C–next จะเปนโหนดปจจุบัน

ไมเชนนั้น Fail จะเปนจริง Empty : boolean { ทดสอบวาเปนลิสตวางหรือไม }

Page 9: data structure lesson04

!)

Pre: ไมมี Post: ถาลิสตไมมีโหนดเลยแลว Empty จะเปนจริง ไมเชนนั้น Empty จะเปนเท็จ

เรื่องที่ 4.2.2 การสรางลิงคลิสตอยางงาย

ในการสรางลิงคลิสตอยางงายน้ัน เราตองคํานึงถึงสองส่ิง คือ การเลือกการแทนท่ีขอมูลของลิงคลิสต และการสรางการดําเนินงานของลิงคลิสต

ใหสมาชิกของลิสตมีชนิดเปน StdElement เราสามารถนิยามการแทนท่ีขอมูลของลิงคลิสต เปนดังน้ี

TYPE pointer = ^Node

Node = RECORD

El : StdElement;

Next : pointer

END

VAR Head, Current : pointer

แผนภาพของลิงคลิสตอยางงาย แทนไดดังน้ี

Head Current

ในสวนของการดําเนินงานแตละการดําเนินงาน สามารถจะนําเสนอในรูปของแผนภาพและโปรแกรมไดดังน้ี Create L-post: Head nil , Current nil

PROCEDURE Create;

BEGIN

Head := nil;

Current := nil;

END;!

Insert (E)

E : Key Data = 5

Page 10: data structure lesson04

'*

Current

L – pre : Head 4 7 8 nil L – post : Current

Head 4 7 5 8 nil แผนภาพแสดงข้ันตอนการทํางานเปนดังน้ี new ( p )

P กําหนดคาใหกับโหนด โดยมีคาเทากับ E

P 5 nil ใสโหนด P หลังโหนด Current และใหโหนด Current เปนโหนด P L – post : Current P

Head 4 7 5 8 nil

PROCEDURE Insert (E:StdElement);

VAR P : pointer;

BEGIN

new(P);

P^.El := E;

IF Head = nil THEN

Head := P;

ELSE BEGIN

P^.Next := Current^.Next;

Current^.Next := P;

END;

Current := P;

END;

Page 11: data structure lesson04

'"

Delete L – pre: Current Head 1 2 3 4 nil L – post: Current Head 1 2 3 4 nil dispose

ในการเขียนโคตนั้น จะตองพิจารณาสถานะท่ีเปนไปไดใหครอบคลุม ไดแก Current อยูที่โหนดใด ๆ นอกจากโหนดสุดทาย หรือ Current อยูที่โหนดสุดทาย หรือ Current อยูที่โหนดเดียวกับ Head เปนตน

PROCEDURE Delete;

VAR P : pointer;

BEGIN

IF Current <> Head THEN

{Find the predecessor of the current node}

BEGIN

P := Head;

WHILE P^.Next <> Current Do

P := P^.Next;

{Link it to the successor of the current}

P^.Next := Current^.Next;

dispose(Current);

Current := Head;

END

ELSE

BEGIN

P := Head;

Head := Head^.Next;

Current := Head;

dispose(P);

END;

END;

Retrieve (E)

Page 12: data structure lesson04

'#

L – pre: Current Head 1 2 3 4 nil L – post: Current Head 1 2 3 4 nil

E : 3

PROCEDURE Retrive(VAR E:StdElement);

BEGIN

E := Current^.El;

END;

Update (E)

E : Key Data = 7 L – pre: Current Head 1 2 3 4 nil L – post: Current Head 1 2 7 4 nil

PROCEDURE Update(E:StdElement);

BEGIN

Current^.El:=E;

END;

Page 13: data structure lesson04

'$

Findfirst L – pre: Current Head 1 2 3 4 nil L – post: Current Head 1 2 7 4 nil

PROCEDURE FindFirst;

BEGIN

Current := Head;

END;

FindNext L – pre: Current Head 1 2 3 4 nil L – post: Current Head 1 2 7 4 nil

PROCEDURE Findnext(VAR Fail:boolean );

BEGIN

Fail:=flase;

IF Current^.Next <> nil THEN

Current := Current^.Next

ELSE Fail := true;

END;

Empty L – pre : Head nil , Current nil

Page 14: data structure lesson04

'%

Empty : true L – pre: Current Head 1 2 3 4 nil Empty : false

FUNCTION Empty : boolean;

BEGIN

IF Head <> nil THEN

Empty := false

ELSE Empty := true;

END;

การสรางชนิดขอมูลลิงคลิสตอยางงายตามคุณลักษณะเฉพาะท่ีระบุขางตน ไดแสดงไวในโปรแกรมที่ 4.1

UNIT LinkLisU;

INTERFACE

TYPE StudentRec = RECORD

Id :integer;

Name : string[15];

Math,Stat,Comp : integer;

END;

Node = RECORD

EL : StudentRec;

Next : pointer;

END;

pointer = ^Node;

VAR Head, Current : pointer;

PROCEDURE Create;

PROCEDURE Insert(E : StudentRec);

PROCEDURE Delete;

PROCEDURE Retrive(VAR E : StudentRec);

PROCEDURE Update(E : StudentRec);

PROCEDURE FindFirst;

PROCEDURE FindNext(VAR Fail : boolean);

FUNCTION Empty:boolean;

IMPLEMENTATION

PROCEDURE Create;

BEGIN

Page 15: data structure lesson04

'&

Head := nil;

Current := nil;

END;

PROCEDURE Insert(E : StudentRec);

VAR P:pointer;

BEGIN

new(P);

P^.El := E;

IF Head = nil THEN

Head := P;

ELSE

BEGIN

P^.Next := Current^.Next;

Current^.Next := P;

END;

Current := P;

END;

PROCEDURE Delete;

VAR P : pointer;

BEGIN

IF Current <> Head THEN

{Find the predecessor of the current node}

BEGIN

P := Head;

WHILE P^.Next <> Current Do

P := P^.Next;

{Link it to the successor of the current}

P^.Next := Current^.Next;

dispose(Current);

Current := Head;

END

ELSE

BEGIN

P := Head;

Head := Head^.Next;

Current := Head;

dispose(P);

END;

END;

PROCEDURE Retrive(VAR E : StudentRec);

BEGIN

E := Current^.El;

END;

PROCEDURE Update(E : StudentRec);

BEGIN

Page 16: data structure lesson04

'!

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 := false

ELSE Empty := true;

END;

END.

โปรแกรม 4.1 การสรางชนิดขอมูลแบบลิงคลิสต

กิจกรรม 4.3 การทดสอบการสรางขอมูลแบบลิงคลิสต จงทดสอบโปรแกรม 4.1

เรื่องที่ 4.2.3 การใชลิงคลิสตอยางงาย

จากตัวอยางในเรื่องที่ 3.3.2 ใหดําเนินการในลักษณะเดียวกันแตใชลิงคลิสตอยางงายในการจัดเก็บขอมูลแทนการใชอะเรย

สมมติมีขอมูลแสดงถึงคะแนนสอบของนิสิต 3 วิชา ของนักเรียนชั้นหนึ่งในไฟลชื่อ Student.dat จงเขียนโปรแกรมเพ่ือพิมพรายงานผลการสอบของนักเรียนในช้ันน้ี พรอมทั้งหาคาเฉลี่ยของแตละรายวิชา ตัวอยางโปรแกรมการใชแสดงในโปรแกรม 4.2

กิจกรรม 4.4 การทดสอบการใชลิงคลิสตอยางงาย จงเขียนโปรแกรม 4.2 ใหสมบูรณ พรอมทดสอบการใชงาน

Page 17: data structure lesson04

''

PROGRAM LinkListTest(InFile);

USES wincrt, LinkLisU;

CONST Size = 100;

VAR E : StudentRec;

SumMath, SumStat, SumComp : integer;

MeanMath, MeanStat, MeanComp : real;

InFile:text;

PROCEDURE ReadData;

PROCEDURE ReadElement(VAR E:StudentRec);

BEGIN

WITH E DO

readln(InFile,Id,Name,Math,Stat,Comp);

END;

BEGIN

WHILE NOT EOF(InFile) DO

BEGIN

ReadElement(E);

Insert(E);

END;

END;

PROCEDURE PrintData;

VAR Fail : boolean;

BEGIN

writeln('Id':5,' Name ':15,'Math':5,'Stat':5,'Comp':5);

writeln('-------------------------------------');

FindFirst;

REPEAT

Retrive(E);

WITH E DO writeln(Id:5,Name:15,Math:5,Stat:5,Comp:5);

FindNext(Fail);

UNTIL Fail;

END;

PROCEDURE CalculateMean;

BEGIN

END;

BEGIN

create;

assign(InFile,'Data.Dat');

reset(InFile);

ReadData;

PrintData;

CalculateMean;

END.

โปรแกรม 4.2 โปรแกรมทดสอบการใชลิงคลิสตอยางงาย