data structure lesson04

Page 1

!"

แผนการสอนประจําบทเรียน รายชือ่ อาจารยผจู ดั ทํา สุณี รักษาเกียรติศักดิ์ หัวขอของเนื้อหา ตอนที่ 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 Id

P^ Name

Math Stat Comp

P^ Name

Math Stat Comp

200 หากมีการกําหนดคาใหกับตัวแปร P^ ดังนี้ P^.Id := ‘411021003’; P^.Name := ‘Krisada’; P^.Math := 70; P^.Stat := 65; P^.Comp := 85; ผลทีเ่ กิดขึน้ จะเปนดังนี้ P Id 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:

สรางลิสตขน้ึ ซึง่ เปนลิสตวา ง {ใส E หลังสมาชิกตัวปจจุบัน}

Insert (E : StdElemant ) 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

PROCEDURE Create; BEGIN Head := nil; Current := nil; END;!

Insert (E) E:

Key

Data

=

5

nil


'* Current L – pre :

Head

4

7

L – post :

8

nil

Current

Head

4

7

5

8

nil

แผนภาพแสดงขัน้ ตอนการทํางานเปนดังนี้ new ( p ) P กําหนดคาใหกับโหนด โดยมีคาเทากับ E P

5

nil

ใสโหนด P หลังโหนด Current และใหโหนด Current เปนโหนด P L – post : Head

Current P 4

7

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;

5

8

nil


'" Delete L – pre: Head

L – post: Head

Current 1

2

3

4

nil

2

3

4

nil

Current 1

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: Head

Current 1

2

L – post: Head

3

4

nil

3

4

nil

3

4

nil

7

4

nil

Current 1

2 E:

3

PROCEDURE Retrive(VAR E:StdElement); BEGIN E := Current^.El; END;

Update (E) E:

Key

Data =

7

L – pre: Head

Current 1

2

L – post: Head

Current 1

2

PROCEDURE Update(E:StdElement); BEGIN Current^.El:=E; END;


'$ Findfirst L – pre: Head L – post: Head

Current 1

2

3

4

nil

2

7

4

nil

4

nil

4

nil

Current 1

PROCEDURE FindFirst; BEGIN Current := Head; END;

FindNext L – pre: Head

Current 1

2

3

L – post: Head

Current 1

2

7

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 PROCEDURE PROCEDURE PROCEDURE PROCEDURE PROCEDURE PROCEDURE FUNCTION

Create; Insert(E : StudentRec); Delete; Retrive(VAR E : StudentRec); Update(E : StudentRec); FindFirst; FindNext(VAR Fail : boolean); 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 โปรแกรมทดสอบการใชลิงคลิสตอยางงาย


Turn static files into dynamic content formats.

Create a flipbook
Issuu converts static files into: digital portfolios, online yearbooks, online catalogs, digital photo albums and more. Sign up and create your flipbook.