Danh sách liên kết đơn

Một phần của tài liệu BAI GIANG PASCAL 2 (Trang 28 - 32)

KIỂU CON TRỎ VÀ BIẾN ĐỘNG

10.5 Danh sách liên kết đơn

Danh sách liên kết: cấu trúc dữ liệu thích hợp cho việc thêm, bớt, ghép nối các phần tử.

Tổ chức: vùng liên kết của phần tử thứ i chứa địa chỉ của phần tử thứ i+1 hoặc ngược lại.

Mỗi phần tử của DSLK gồm 2 phần chính: vùng chứa dữ liệu (data) và vùng chứa địa chỉ của phần tử khác (link).

TYPE {Khai báo kiểu DSLK đơn} DataType = ^Real; PtrList = ^Item; Item = RECORD Data: DataType; Link: PtrList; END;

Các loại DSLK đơn: FIFO (First In First Out) - hàng đợi (Queue), LIFO (Last In First Out) -

ngăn xếp (Stack).

Các thao tác cơ bản

VAR

First, Last, p, q: PtrList;

Data Link

Data Link

Data Link

NIL

Tạo DSLK đơn (FIFO):

First:= NIL; {khởi tạo DS} Repeat

New(p);

{ ... nhập/gán giá trị cho p^} p^.Link:= NIL;

if First = NIL then {DS rỗng} begin First:= p; Last:= p; end else Last^.Link:= p; Last:= p; ... Until Ok; • Duyệt DSLK đơn: p:= First; While p <> NIL do begin { ... xử lý p^} p:= p^.Link; end;

Tìm kiếm một phần tử trong DS (key là khóa cần tìm)

OK:= False; p:= First;

While (p <> NIL) and (not OK) do if p^.Data = key then

begin

OK:= True; { ... xử lý p^} end

Thêm một phần tử vào DS

- Thêm p vào đầu DS

b1. Cho vùng liên kết của p trỏ vào First; p^.Link:= First;

b2. Cho First trỏ vào p. First:= p;

- Thêm vào giữa/cuối DS (p là phần tử cần thêm, q phần tử đứng ngay trước p) b1. Cho vùng liên kết của p trỏ vào vùng liên kết của q;

p^.Link:= q^.Link;

b2. Cho vùng liên kết của q trỏ vào p; q^.Link:= p;

Xóa một phần tử khỏi DS

- Xóa phần tử p ở đầu DS

if First <> NIL then begin

p:= First; First:= p^.Link; Dispose(p);

end;

- Xóa phần tử p đứng ngay sau phần tử q

p:= q^.Link; if p <> NIL then begin q^.Link:= p^.Link; Dispose(p); end;  Ứng dụng

VD 10.4 Lập trình sinh ngẫu nhiên DSLK đơn có n phần tử (n <= 1000), mỗi phần tử chứa một số nguyên có trị tuyệt đối < 2008.

a) In DS ra màn hình;

b) Tìm phần tử có giá trị bằng số nguyên x nhập từ bàn phím;

c) Thêm phần tử y vào vị trí k, với y và k nhập từ bàn phím;

d) Xoá khỏi DS các số chính phương;

e) Sắp xếp DS theo thứ tự tăng bằng cách thay đổi mối liên kết thay vì thay đổi giá trị.

TYPE PtrList = ^Item; PtrList = ^Item; Item = RECORD Data: Integer; Link: PtrList; END; VAR First: PtrList; •Thủ tục tạo DS (FIFO): Procedure TaoDS;

var p, Last: PtrList; N, i: Integer; begin

Write(‘N = ‘); Readln(N); Randomize;

First:= NIL; {khoi tao DS} i:= 1;

Repeat

New(p);

p^.Data:= Random(1003)–Random(1003); p^.Link:= NIL;

if First = NIL then begin {DS rong} First:= p; Last:= p; end else Last^.Link:= p; Last:= p; Inc(i); Until i > N; End;

VD 10.5 Lập trình giải bài toán tuyển sinh trong Mục 9.5.

Một phần của tài liệu BAI GIANG PASCAL 2 (Trang 28 - 32)

Tải bản đầy đủ (DOC)

(32 trang)
w