data structure lesson04
DESCRIPTION
ตอนที่ 4.2 ลิงคลิสต (2 คาบ) เรื่องที่ 4.2.1 การกําหนดคุณลักษณะเฉพาะของลิงคลิสตอยางงาย เรื่องที่ 4.2 2 การสรางลิงคลิสตอยางงาย เรื่องที่ 4.2.3 การใชลิงคลิสตอยางงาย ประเมินผล 1. ประเมินผลจากกิจกรรมที่ทํา 2. ประเมินผลจากคําถามทายบทเรียน เอกสารประกอบการสอน 1. เอกสารชุดวิชา หัวเรื่อง เรื่องที่ 4.1.1 การจัดสรรเนื้อที่แบบสแตติก เรื่องที่ 4.1.2 การจัดเนื้อที่แบบไดนามิก ตอนทีTRANSCRIPT
!"
แผนการสอนประจําบทเรียน
รายช่ืออาจารยผูจัดทํา สุณี รักษาเกียรติศักดิ ์
หัวขอของเนื้อหา
ตอนที ่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. เปรียบเทียบขอแตกตางระหวางการจัดสรรเนื้อที่ในหนวยความจําแบบสแตติกและแบบไดนามิกได
!#
1. บอกคุณลักษณะเฉพาะของชนิดขอมูลแบบลิงคลิสตอยางงายได 2. สรางชนิดขอมูลแบบลิงคลิสตอยางงายได
กิจกรรมการเรียนการสอน กิจกรรมท่ีนักศึกษาตองทําสําหรับการเรียนการสอน ไดแก 1. ศึกษาเอกสารชดุวิชา/โฮมเพจชุดวิชา ตอนที่ 4.1 และตอนที ่4.2 2. ทํากิจกรรมของบทเรียนที่ 4 3. ทําแบบประเมินผลของบทเรียนที่ 4
เอกสารประกอบการสอน 1. เอกสารชดุวิชา
สื่อการสอน 1. โฮมเพจชุดวิชา 2. สไลดประกอบการบรรยาย (Powerpoint) 3. โปรแกรมคอมพิวเตอร
ประเมินผล 1. ประเมินผลจากกิจกรรมที่ทํา 2. ประเมินผลจากคําถามทายบทเรียน
!$
ตอนท่ี 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) ตัวแปรที่นิยามไวในสวนของการนิยามจะไดรับการจัดสรรเนื้อที่ในหนวยความจําทันที ถึงแมตัวแปรเหลานั้นจะไมไดถูกใชในการเขียนคําส่ัง ซึ่งจะทําใหเสียเนื้อที่ในหนวยความจํา
ตัวแปรแบบอะเรยจะเปนตัวแปรแบบมีโครงสรางซึ่งจะมีการจัดสรรเนื้อที่หนวยความจําแบบสแตติก นั้นคือเนื่อที่ในหนวยความจําจะถูกจัดสรรเทากับขนาดที่กําหนดไวในอะเรย เชน
!%
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)
!&
หลังจากคําส่ัง 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
!!
หากเราไมมีความจําเปนตองใชเนื้อที่นี้อีกแลว เราก็ควรคืนเนื้อที่ในหนวยความจําใหกับระบบปฏิบัติการไปโดยใชคําสั่ง 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
!'
ตอนท่ี 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 แทน ลิสตกอนการดําเนินงาน
!(
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 { ทดสอบวาเปนลิสตวางหรือไม }
!)
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
'*
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;
'"
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)
'#
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;
'$
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
'%
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
'&
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
'!
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 ใหสมบูรณ พรอมทดสอบการใชงาน
''
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 โปรแกรมทดสอบการใชลิงคลิสตอยางงาย