I cấu trúc dữ liệu động

Một phần của tài liệu tin hoc co ban TH khong chuyen (Trang 90 - 99)

30. I.1. Cấp phát bộ nhớ

Tất cả các kiểu cấu trúc dữ liệu mà ta đã học từ trớc đến giờ nh array, record... đều gọi là tĩnh vì chúng đợc xác định một cách rõ ràng ngay từ khi khai báo biến (kiểu, độ lớn), chúng đợc cung cấp các địa chỉ ngay sau khi có lời gọi chơng trình dịch của Pascal. Thời gian tồn tại của biến tĩnh cũng là thời gian tồn tại cảu khối chơng trình chứa khai báo biến đó.

Việc sử dụng biến tĩnh nh trên dẫn đến hai khó khăn khi lập trình:

1. Độ dài biến là xác định do đó không thể sử dụng biến để lu các giá trị cóp độn dài lớn hơn. VD: mảng 20 phần tử không thể chứa đợc 21 phần tử.

2. Các biến tĩnh chiếm cố định một vùng nhớ, trong đó nhiều biến chỉ sử dụng 1 hoặc vài lần sau đó không dùng đến nữa, vì vậy chiếm bộ nhớ vô ích.

Để tránh các khó khăn trên ngời ta thờng sử dụng các biến có cấu trúc dữ liệu động. Các biến này có u điểm sau:

1. Các biến này đợc tạo ra tại vị trí bất kỳ trong chơng trình theo nhu cầu của ngời sử dụng.

2. Khi không cần sử dụng đến có thể giải phóng biến để giảm thời gian chiếm bộ nhớ.

Các biến động đợc truy nhập thông qua biến con trỏ. Chúng đợc khai báo nh biến tĩnh, nhng khi nào đợc cần đến thì mới cấp phát bộ nhớ cho chúng (thủ tục NEW), khi nào không cần dùng có thể giải phóng (thủ tục DISPOSE). Tuy nhiên, các con trỏ không chứa giá trị của biến động mà chứa địa chỉ của biến động.

31. I.2. Sử dụng con trỏ.

14. a. Khai báo con trỏ

Ta có thể dùng một trong hai cách khai báo sau: Cách 1:

Type

Kiểu con trỏ = ^ kiểu dữ liệu; {dấu ^ khai báo con trỏ}

VAR

Tên biến : Kiểu con trỏ; VD1:

TYPE

VAR

Num : So; {Khai báo biến Num có kiểu con trỏ So} Cách 2:

VAR

Kiểu con trỏ : ^ kiểu dữ liệu; {dấu ^ khai báo con trỏ} VD2:

Num : ^Integer;

Trong các ví dụ trên, Num là biến kiểu con trỏ (gọim tắt là con trỏ), nó chỉ vào địa chỉ biến có kiểu nguyên, gọi là con trỏ kiểu nguyên.

VD3: TYPE NhanSu = RECORD Ten: string [30]; Tuoi: byte; END; Point = ^ NhanSu; VAR P: Point;

P là con trỏ, trỏ đến một biến có kiểu NhanSu.

15. b. Các thao tác đối với con trỏ

* Phép gán := {gán giá trị hai con trỏ cùng kiểu}

* Phép so sánh = (bằng nhau) và <> (khác nhau)

* Chú ý: các giá trị của biến con trỏ không thể đọc trực tiếp từ bàn phím hay in trực tiếp ra màn hình, tức không tồn tại Read(P) hay Write(p);

16. c. Hằng con trỏ NIL

NIL là giá trị hằng đặc biệt dành cho các biến con trỏ, nó đợc dùng để báo rằng con trỏ không trỏ vào đâu cả. NIL đợc đem gán cho bất cứ biến con trỏ nào. (adsbygoogle = window.adsbygoogle || []).push({});

17. d. Cách tạo biến động. Thủ tục NEW

Để tạo ra một biến động (sau khi đã khai báo) ta dùng thủ tục NEW. Cú pháp : NEW(biến con trỏ);

Hoạt động: thủ tục trên tạo cho biến con trỏ một vị trí nhớ trong bộ nhớ. VD: NEW(P);

Chú ý:

- Nếu khởi tạo cùng một con trỏ nhiều lần (N lần), thì ta có N con trỏ, nhng con trỏ chỉ trỏ vào biến động đợc tạo ra cuối cùng.

- Trớc khi dùng chơng trình thì phải dùng thủ tục NEW để khởi tạo con trỏ (cấp phát bộ nhớ). VD: TYPE NhanSu = RECORD Ten: string [30]; Tuoi: byte; END; Point = ^ NhanSu; VAR P: Point; BEGIN NEW(P); WITH P^ DO Begin Ten := ‘Tuan’; Tuoi:=20; End; END. Ta có

Con trỏ P trỏ vào địa chỉ của biến động có giá trị nh trên.

18. e. Giải phóng biến.

Khi một biến không còn đợc dùng nữa ta nên giải phóng vùng nhớ của biến đó để dùng vào việc khác. Ta dùng thủ tục DISPOSE

Cú pháp: DISPOSE(biến con trỏ);

Hoạt động: thủ tục sẽ giải phóng vùng nhớ của con trỏ. Cũng có nghĩa là xoá biến con trỏ đó. Sau đó muốn sử dụng lại con trỏ đó thì phải khởi tạo lại (Cấp phát bộ nhớ).

VD: sau VD trên ta có thể dùng DISPOSE(P) để giải phóng biến P. XLIII. II. danh sách liên kết.

Khi tạo một danh sách, VD nh danh sách nhân viên chẳng hạn, nếu biết trớc số ngời và số ngời là cố định thì hoàn toàn có thể dùng cấu trúc dữ liệu tĩnh nh mảng để lu trữ, tuy nhiên trong thực tế, các danh sách thờng có sự biến động về số lợng và thờng không biết trớc số lợng, trong trờng hợp này nếu đa ra chỉ số mảng quá lớn thì chiếm dụng bộ nhớ vô ích, còn quá bé thì không đủ chỗ chứa. Do đó, ta thờng dùng danh sách

P

Tuan 20

móc nối hay còn gọi là danh sách liên kết, trong đó sử dụng các biến con trỏ để liên kết các phần tử trong danh sách. Các phần tử trong khi nào đợc sinh mới thì tạo ra một biến mới để lu trữ phần tử đó. Nh vậy, mặc dù có thể khai báo một danh sách có độ dài lớn nhng không phải tại bất cứ thời điểm nào cũng chiếm dụng toàn bộ bộ nhớ, các phần tử tạo mới đến đâu thì cấp phát bộ nhớ đến đó, hoặc độ dài danh sách đó có thể không cần nhắc đến nếu dùng liên kết thông qua con trỏ.

Trong bất cứ nào dùng để lu trữ các phần tử của danh sách, phải thực hiện đợc ít nhát các thao tác sau đây nếu thứ tự các phần tử cần đợc biểu diễn.

1. Định vị phần tử đầu tiên trong danh sách.

2. Cho trớc vị trí của phần tử bất kỳ trong danh sách, xác định vị trí của phần tử tiếp theo.

Nh ta đã biết trong cài đặt tuần tự, thứ tự các phần tử đợc cho bởi chỉ số các mảng, phần tử đầu tiên đợc lu ở vị trí 1, các phần tử tiếp theo của vị trí thứ i đợc tìm thấy ở vị trí thú i+1 của mảng.

Một cấu trúc lu trữ các phần tử của danh sách trong đó thứ tự của chúng đợc biểu diễn dới dạng hiển là danh sách liên kết. Nó gồm một tập các phần tử gọi là các nút (node), mỗi nút chứa 2 mục tin, 1 là phần tử của danh sách và 2 là con trỏ chỉ vị trí của phần tử tiếp theo trong danh sách. Việc truy nhập đến các nút tiếp theo của các phần tử trong danh sách cũng phải đợc xử lý.

VD danh sách liên kết chứa các tên: Tuấn, Hng, Nhung, có thể môt tả nh sau:

Trong sơ đồ trên dấu mũi tên thể hiện mối liên kết giữa các nút, và List chỉ vào phần tử đầu tiên trong danh sách. Phần Data của mỗi nút chứa một tên, phần Next chứa con trỏ chỉ đến nút tiếp theo, dấu chấm ở phần tử cuối không chỉ đến đâu biểu diễn con trỏ rỗng và chỉ ra rằng phần tử này không có phần tử tiếp theo. Nếu p là con trỏ chỉ đến một nút bất kỳ trong danh sách, ta có ký hiệu phận dữ liệu là data(p), và con trỏ liên kết là Next(p).

32. II.1. Cài đặt danh sách liên kết.

* Cài đặt danh sách liên kết trên cơ sở mảng, với t tởng nh sau: - Mỗi nút gồm hai phần, phần dữ liệu và phần chứa con trỏ.

- Mỗi nút đợc biểu diễn dới dạng một bản ghi, danh sách liên kết là mảng các bản ghi. Mỗi bản ghi chứa hai trờng: trờng dữ liệu và trờng liên kết. Trờng dữ liệu chứa phần tử của danh sách, trờng liên kết chỉ đến phần tử đứng sau nó bằng

Tuấn Data Next H ng Data Next Nhung Data Next List

- Con trỏ List sẽ chỉ đến phần tử đầu tiên trong danh sách bằng cách lu trữ phần tử mảng.

Cấu trúc:

Const (adsbygoogle = window.adsbygoogle || []).push({});

MaxSize = n {n là độ dài lớn nhất cho phép của danh sách}

Type

ElementType = DataType {Kiểu dữ liệu của các phần tử trong danh sách} PointerType = 0..MaxSize;

NoteType = Record

Data: ElementType; Next: PointerType;

End;

ArrayOfNode = array [1..MaxSize] of NodeType

Var

Node: ArrayOfNode; Free,List: PointerType

* Cài đặt danh sách liên kết trên cơ sở con trỏ, t tởng giống nh cài đặt bằng mảng, nhng sự liên kết ở đây là bằng con trỏ chứ không phải bằng chỉ số mảng.

Cấu trúc:

Type

ElementType = DataType {Kiểu dữ liệu của các phần tử trong danh sách} PointerType= ^NodeType; {Kiểu của con trỏ chỉ đến các nút trong danh sách} NoteType = Record Data: ElementType; Next: PointerType; End; Var List: PointerType

Các thủ tục dùng trong cài đặt bằng mảng chúng tôi không giới thiệu ở đây, phần đó sinh viên có thể tham khảo thêm ở các sách khác.

Sau đây là các thủ tục mô tả các công việc đối với danh sách liên kết sử dụng con trỏ.

33. II.2. Một số thuật toán trên danh sách liên kết.

* Thủ tục tạo danh sách rỗng (các danh sách đều phải bắt đầu từ danh sách rỗng)

Procedure Create(Var List : PointerType); Begin

List := Nil;

End;

*Hàm kiểm tra danh sách có rỗng không (nếu rỗng List = Nil);

Function EmptyList(List: PointerType):Boolean; Begin

EmptyList:= (List=Nil);

End;

*Thủ tục duyệt toàn bộ danh sách (Sử dụng con trỏ P để chỉ đến nút đầu tiên, sau đó đi qua danh sách bằng các trờng liên kết.

Procedure Traverse (List : PointerType); Var P:PointerType; Begin P:=List; While P <> Nil Do Begin {Các lệnh xử lý các nút} End; End;

* Thủ tục xoá một phần tử khỏi danh sách liên kết.

Procedure DeleteNode (var List : PointerType; P:PointerType); Var Temp:PointerType;

Begin

If Empty (List) Then {danh sách rỗng} Halt (adsbygoogle = window.adsbygoogle || []).push({});

Else

Begin

If P:=Nil Then {Xoá nút đầu tiên}

Begin

Temp := List;

Else {Nút có phần tử đứng trớc nó} Begin Temp := P^.Next; P^.Next := Temp^.Next; End Dispose(temp); End; End;

Câu hỏi và bài tập

1. Tập hợp các đoạn chơng trình trên thành chơng trình hoàn chỉnh

2. Viết chơng trình tạo danh sách sinh viên nh trong phần bản ghi, trong đó có sử dụng đầy đủ các thủ tực trên và có tính điểm tổng kết... nh phần bản ghi.

Mục lục

chơng I . Thông tin và máy tính điện tử...4

I. Thông tin và xử lý thông tin...4

1. Thông tin là gì ?...4

2. Xử lý thông tin...4

II. Các thành phần của máy tính điện tử...4

1. Máy tính điện tử là gì...4

3. Phần cứng và phần mềm...5

4. Các bộ phận cơ bản của hệ thống máy tính...6

5. Lịch sử phát triển của máy tính...9

6. Một số vấn đề khi sử dụng máy tính...9

2. Lu trữ thông tin...10

3. Hệ đếm...10

7. Chuyển đổi hệ đếm...11

8. Cách biểu diễn thông tin trong bộ nhớ...11

9. Các phép tính số học trên hệ nhị phân...12

câu hỏi và Bài tập...13

Hệ điều hành ms-dos...14

I. Khái niệm hệ điều hành...14

1. Chức năng của hệ điều hành...14

II. Hệ điều hành MS- DOS...14 (adsbygoogle = window.adsbygoogle || []).push({});

1. Đĩa từ...14

2. Tệp(file) và đặt tên tệp...14

III. Th mục và cấu trúc cây của th mục...15

IV. Nạp hệ điều hành...15

IV. Các câu lệnh thờng dùng của MS-DOS...16

1. Lệnh nội trú và lệnh ngoại trú...16

3. Các lệnh làm việc với th mục...16

a. Lệnh xem th mục trên đĩa...16

b. Lệnh tạo th mục...17

c. Chuyển th mục chủ...17

d. Xoá th mục...17

V. Các lệnh làm việc với tệp (file)...18

a. Lệnh tạo tệp...18

b. Xoá tệp...18

c. Đổi tên tệp...18

d. Sao tệp...18

e. Xem nội dung một tệp văn bản...19

VI. Các lệnh hệ thống...19

a. Xoá màn hình...19

b. Lệnh chuyển ổ đĩa chủ...19

c. Lệnh xem thời gian hệ thống...19

d. Lệnh xem ngày hệ thống...19

e. Xem version của DOS...19

f. Thực hiện một chơng trình...19

g. Lệnh tạo khuôn đĩa...19

a.Tìm kiếm:...24

b. Tìm kiếm và thay thế:...24

c.Lặp lại lệnh tìm kiếm hoặc thay thế trớc đó:...25

a. Phơng pháp đơn giản:...25

Chơng 1: Các thành phần cơ bản của ngôn ngữ Pascal...29 (adsbygoogle = window.adsbygoogle || []).push({});

IV. I. Bộ kí tự, từ khoá, tên gọi...29

V. II. Ngăn cách các lệnh...30

VI. III. Lời chú thích (Comment)...30

VII. IV. Cấu trúc chung của chơng trình Pascal...30

VIII. V. Các bớc cơ bản khi soạn thảo một chơng trình...32

Chơng 2: Các kiểu dữ liệu cơ sở...33

IX. I. Kiểu Logic (Boolean)...33

X. II. Kiểu số nguyên (Integer)...33

XII. IV. Kiểu ký tự (character)...35

XIII. V. Mô tả số nguyên với Word, Shortint, Longint...36

XIV. VI. Mở rộng khai báo kiểu số thực...37

Chơng 3: Khai báo, biểu thức và câu lệnh...39

XV. I. khai báo hằng...39

XVI. II. Khai báo biến...39

XVII. III. Định nghĩa kiểu...39

XVIII. IV. Biểu thức (Expression)...40

XIX. IV. Câu lệnh (Instruction, Statemment)...41

Chơng 4: Thủ tục vào, ra dữ liệu...43

XX. I. Thủ tục hiển thị dữ liệu ra màn hình: Write và Writeln.43 12. I.1. Viết ra kiểu số nguyên...44

13. I.2. Viết ra kiểu số thực...45

14. I.3. Hiển thị kiểu ký tự:...46

15. I.4. Viết ra kiểu Boolean...46

16. I.5. In ra máy in...47

17. I.6. Trình bày màn hình:...47

XXI. II. Vào dữ liệu: Read và Readln...49

18. II.1. Read và Readln:...49

19. II. 2. Kết hợp Write và Readln để tạo giao diện ngời - máy...51

20. II.3. Một số thủ tục nhập đặc biệt:...51

Chơng 5: Các câu lệnh điều Khiển...53

XXII. I. Câu lệnh điều kiện IF...THEN...ELSE...53 (adsbygoogle = window.adsbygoogle || []).push({});

XXIII. II. Câu lệnh chọn CASE...OF...54

XXIV. III. Vòng lặp có số bớc lặp xác định FOR...56

XXV. IV. Vòng lặp có số bớc lặp không xác định Repeat và While...58

XXVI. V. Lệnh nhảy vô điều kiện GOTO...59

Chơng 6. Dữ liệu có cấu trúc - chơng trình con...62

XXVII. I. Xâu ký tự...62

21. I.1. Định nghĩa xâu ký tự...62

22. I.2. Các thao tác với xâu ký tự...63

XXVIII. II. Kiểu Mảng...65

23. II.1. Mảng một chiều...65

24. II.2. mảng hai chiều...69

XXIX. III. dữ liệu kiểu tập hợp (set)...70

25. III.1. Kiểu tập hợp...70

26. III.2. Xác lập một tập...70

27. III.3. Các phép toán trên tập hợp...70

Chơng 7: chơng trình con (thủ tục và hàm):...73

XXX. I. Khái quát về chơng trình con: (Sub-program)...73

XXXII. II. Procedure và Function (Thủ tục và hàm)...73

XXXIII. III. Chuyển tham số cho chơng trình con...76

28. III.1. Không cần biến cục bộ...76

29. III.2. Dùng biến cục bộ và truyền tham số...77

XXXIV. IV. Sự khác nhau giữa Function và Procedure...78

XXXV. V. Biến toàn cục, biến cục bộ và tầm hoạt động của biến...79

XXXVI. V. Tính đệ quy của chơng trình con...80

XXXVII. VI. Chơng trình con là thành phần của Turbo Pascal. ...81

Chơng 8: Kiểu bản ghi (Record)...84

XXXVIII. I. Record là gì?...84

XXXIX. II. Mô tả Record...84

XL. II. Vào - Ra Record...85

XLI. III. mảng các Record...87 (adsbygoogle = window.adsbygoogle || []).push({});

Chơng 9. Cấu trúc dữ liệu động...90

XLII. I. cấu trúc dữ liệu động...90

30. I.1. Cấp phát bộ nhớ...90

31. I.2. Sử dụng con trỏ...90

XLIII. II. danh sách liên kết...92

32. II.1. Cài đặt danh sách liên kết...93

Một phần của tài liệu tin hoc co ban TH khong chuyen (Trang 90 - 99)