Nói cách khác độ phức tạp tính toán của giải thuật là một hàm chặn trên của hàm thời gian.Vì hằng nhân tử C trong hàm chặn trên không có ý nghĩa nên ta có thể bỏ qua vì vậy hàm thể hiện
Trang 1- -BÀI TIỂU LUẬN
cho doanh nghiệp Việt Nam tăng khả năng cạnh tranh trong
quá trình hội nhập
Trang 2M ục lục
Chương 1: TỔNG QUAN VỀ CẤU TRÚC DỮ LIỆU 3
1.1 Khái niệm về cấu trúc dữ liệu 3
1.2 Các cấu trúc dữ liệu căn bản 3
1.2.1 Các kiểu dữ liệu căn bản 3
1.2.2 Các kiểu dữ liệu có cấu trúc 4
* Các thủ tục và hàm trên xâu ký tự 6
- Hàm lấy chiều dài của xây ký tự 6
1.3 Thuật toán và đánh giá độ phức tạp thuật toán 8
1.3.1 Thuật toán 8
Chương 2: DANH SÁCH 14
2.1 Định nghĩa danh sách 14
2.2 Danh sách đặc 14
2.2.3 Các phép toán trên danh sách: 14
2.3 Danh sách liên kết, các phép toán 16
2.3.1 Định nghĩa 16
Trang 3Chương 1: TỔNG QUAN VỀ CẤU TRÚC DỮ LIỆU
o0o 1.1 Khái niệm về cấu trúc dữ liệu.
Cấu trúc dữ liệu (CTDL) là một cách tổ chức dữ liệu của bài toán CTDL có thể dongôn ngữ lập trình định nghĩa trước hoặc có thể do người sử dụng định nghĩa
Cấu trúc dữ liệu tốt thì thuật toán xử lý bài toán mới tối ưu Chính vì vậy, Niklaus wirth
đã tổng kết:
“Cấu trúc dữ liệu + thuật toán = Chương trình”.
Cách biểu diễn tối ưu một cấu trúc dữ liệu trong bộ nhớ được gọi là cấu trúc lưu trữ(storage structure) Có thể có nhiều cấu trúc lưu trữ cho cùng một cấu trúc dữ liệu
Cấu trúc dữ liệu tương ứng với bộ nhớ gọi là lưu trữ trong hay tương ứng với bộ nhớ ngoàigọi là lưu trữ ngoài
Thông thường một kiểu dữ liệu được định nghĩa như sau:
Một kiểu dữ liệu T là một cặp T = <V,O> trong đó:
- V (value) : Là một tập các trị mà một biến có kiểu T nhận được
- O (Operator) : Là tập hợp các thao tác trên V
Ví dụ:
a T Integer = <V,O>
V={-32768, ,32767} ; O={+,-,*,/,mod,div,xor,<,>, }
b T Boolean = <V,O>
V={True, False}; O = { And, Or, Xor, Not, <, >, =,…}
Một cấu trúc dữ liệu là một kiểu dữ liệu được xây dựng từ những kiểu dữ liệu đã biết,trong trường hợp này cho ta một CTDL tương ứng với một kiểu dữ liệu đã cho
1.2 Các cấu trúc dữ liệu căn bản.
1.2.1 Các kiểu dữ liệu căn bản.
- Kiểu Integer (nguyên – 2 byte, -32768 32767) Gồm tập hợp con các số nguyên Tất cả
các phép toán trên dữ liệu integer đều tuân thủ các qui tắc số học Các toán tử chuẩn gồmbốn phép toán số học cơ bản: cộng (+), trừ (-), nhân (*), chia nguyên (div)
- Kiểu Real (thực – 6 byte,2.9E-39 1.7E38) Gồm tập hợp con của các số thực, các toán
tử chuẩn gồm bốn phép toán số học cơ bản là: công (+), trừ (-), nhân (/)
- Kiểu Boolean (luận lý – 1 bit) Gồm hai giá trị luân lý true (đúng) và false (sai) Các toán
tử luận lý gồm ba phép toán cơ bản: not (phủ định), and (và) và or (hay)
Các phép toán so sánh cho kết quả là một giá trị luận lý Các phép toán so sánhgồm:
= bằng
<> khác bằng (khác)
< nhỏ hơn
<= nhỏ hơn hoặc bằng
Trang 4>= lớn hơn hoặc bằng
- Kiểu char ( kí tự – 1 byte): Gồm tập hợp các kí tự in được Các kí tự thường dùng là:
+ Kiểu char gồm 26 chữ Latin ((‘A’<=x) and (x<=’Z’)), 10 ký số( 0 9) và một số
ký tự đặc biệt, ký tự trắng
- Kiểu liệt kê (Enuerated Types)
Kiểu liệt kê gồm một tập hợp các giá trị bằng cách liệt kê các danh hiệu (identifier)
chỉ định các giá trị này Thứ tự của các kiểu liệt kê được định nghĩa như sau:
Type T = (c1,c2,…, cn) trong đó c1,c2,…, cn là các danh hiệu chỉ định các giá trị của kiểuliệt kê
Ví dụ:
Type shape = (rectange, square, ellipse, circle)
- Kiểu miền con (Subrange Types) là trường hợp một biến có giá trị chỉ nằm trong một
khoảng xác định nào đó của một kiểu Điều này có thể được biểu diễn bằng cách địnhnghĩa biến thuộc kiểu miền con theo dạng:
Type T= min … max
- Kiểu chuỗi (string) Gồm một tập hợp các kí tự Các chuỗi kí tự này được ghi trong hai
dấu nháy đơn (‘) và có tối đa 255 ký tự Số ký tự của chuỗi được gọi là chiều dài củachuỗi, được khai báo như sau:
Bao gồm có tên của mảng và chỉ số tương ứng
Ví dụ: Mảng một chiều a(n) với n là số nguyên nào đó, cho xác định số phần tử của
mảng, phần tử của mảng được xác định theo chỉ số, chẳng hạn phần tử thứ 3 của mảng a taghi a[3] (dấu ngoặc vuông)
Mảng hai chiều a(n,m) thường có nxm phần tử, gồm có n hàng, m cột, một phần tử thứi,j nào đó có nghĩa là phần tử ở hàng thứ i, cột thứ j
* Mảng một chiều.
- Cú pháp:
+ Khai báo gián tiếp:
Kiểu TYPE <mảng> = Array[ Chỉ số] OF <Kiểu dữ liệu>;
VAR <Biến mảng>:<Kiểu mảng>;
+ Khai báo trực tiếp:
VAR <Biến mảng> : ARRAY [chỉ số] OF <Kiểu dữ liệu>;
Chú ý: Chỉ số trong khai báo đối với Pascal phải được xác định trước ở khai báo hằng hoặcghi cụ thể
Trang 5- Cú pháp:
+ Khai báo gián tiếp:
TYPE <Kiểu mảng> = ARRAY [chỉ số1, chỉ số 2] OF <Kiểu dữ liệu>;
VAR <Biến mảng>:<Kiểu mảng>;
+ Khai báo trực tiếp:
VAR <Biến mảng> : ARRAY [chỉ số1, chỉ số 2] OF <Kiểu dữ liệu>;
Ví dụ:
TYPE Mangnguyen = Array[1 100] of Integer;
Matrix = Array[1 10,1 10] of Integer;
MangKytu = Array[Byte] of Char;
Ví dụ ta khai báo biến A có kiểu là tập những kí tự như sau:
VAR A : STRING ; máy dành cho biến A có thể lưu giữ được một tập có không quá
255 kí tự
Hằng văn bản phải để trong cặp dấu nháy cao (‘)
* Khai báo.
TYPETênKiểu = STRING[Max];
VAR Tên biến : TênKiểu;
hoặc khai báo biến trực tiếp:
VAR Tên biến : STRING[Max];
Trong đó Max là số ký tự tối đa có thể chứa trong chuỗi (Max [0,255]) Nếu không cókhai báo [Max] thì số ký tự mặ mặc định trong chuỗi là 255
Ví dụ:
Type Hoten = String[30];
St80 = String[80];
Line : St80; St : String; {St có tối đa là 255 ký tự}
Trang 6- Có thể sử dụng các thủ tục xuất nhập Write, Writeln, Readln để truy xuất các biếnkiểu String
- Để truy xuất đến ký tự thứ k của xâu ký tự, ta sử dụng cú pháp sau: Tênbiến[k].
* Các thủ tục và hàm trên xâu ký tự
- Hàm lấy chiều dài của xây ký tự
LENGTH(St : String):Integer;
- Hàm COPY(St : String; Pos, Num: Byte): String;
Lấy ra một xâu con từ trong xâu St có độ dài Num ký tự bắt đầu từ vị trí Pos
- Hàm POS(SubSt, St :String):Byte;
Kiểm tra xâu con SubSt có nằm trong xâu St hay không? Nếu xâu SubSt nằm trong xâu Stthì hàm trả về vị trí đầu tiên của xâu con SubSt trong xâu St, ngược lại hàm trả về giá trị 0
- Thủ tục DELETE(Var St:String; Pos, Num: Byte);
Xoá trong xâu St Num ký tự bắt đầu từ vị trí Pos
- Thủ tục INSERT(SubSt: String; Var St: String; Pos: Byte);
Chèn xâu SubSt vào xâu St bắt đầu tại vị trí Pos
- Thủ tục STR(Num; Var St:String);
Đổi số nguyên hay thực Num thành dạng xâu ký tự, kết quả lưu vào biến St
- Thủ tục VAL(St:String; Var Num; Var Code:Integer);
Đổi xâu số St thành số và gán kết quả lưu vào biến Num Nếu việc chuyển đổi thành công thì biến Code có giá trị là 0, ngược lại biến Code có giá trị khác 0 (vị trí của lỗi)
c Kiểu bản ghi.
Như ta đã biết các kiểu dữ liệu đã có, mỗi biến thuộc một loại kiểu nào đó thì giá trịcủa chúng chỉ thuộc một kiểu đó: Chẳng hạn kiểu số nguyên, kiểu mảng…Trong khi đókiểu bản ghi có thể coi như sự mở rộng các khái niệm biến và mảng, nó cho phép lưu trữ
và xử lý các dạng thông tin phức tạp hơn RECORD là một tập hợp các biến, các mảng vàđược hiển thị bằng một tên duy nhất
Trang 7TYPE HocSinh = Record
* Làm việc với biến động
- Cấp phát vùng nhớ
Dùng thủ tục New theo cú pháp:
New(<biến trỏ>);
- Giải phóng vùng nhớ
Trang 8Trong đó p là một biến con trỏ Thủ tục Dispose cho phép trả lại bộ nhớ động đã được cấp phát bởi thủ tục New.
1.3 Thuật toán và đánh giá độ phức tạp thuật toán
1.3.1 Thuật toán
a Khái niệm thuật toán (hay Giải thuật).
Thuật toán hay giải thuật là một hệ thống chặc chẽ và rõ ràng các quy tắc nhằm xácđịnh một dãy các thao tác trên những đối tượng, sao cho sau một số hữu hạn bước thựchiện các thao tác thì cho kết quả
b Các đặc trưng của giải thuật.
Sau khi thực hiện các bước của giải thuật phải cho được kết quả mong muốn, kết quả
đó được xác định theo định nghĩa có trước
* Tính phổ dụng
Giải thuật phải giải quyết được cho một lớp bài toán
* Tính có đại lượng vào và ra
Bắt đầu một giải thuật là việc nhận dữ liệu vào (Input) – kết thúc giải thuật là một sốkết quả (dữ liệu ra Output)
* Tính hiệu quả
Tính hiệu quả của một giải thuật được đánh giá dựa trên các tiêu chuẩn sau:
- Dung lượng bộ cần thiết
- Số lượng phép tính cần thực hiện
- Thời gian cần thiết để chạy
- Dễ hiểu và dễ cài đặt
c Biểu diễn thuật toán
Thường có hai cách biểu diễn một thuật toán, cách thứ nhất là mô tả các bước thực hiệncủa thuật toán, cách thứ hai là sử dụng sơ đồ giải thuật
- Mô tả các bước thực hiện.
Để biểu diễn thuật toán người ta mô tả chính xác các bước thực hiện của thuật toán,ngôn ngữ dùng để mô tả thuật toán có thể là ngôn ngữ tự nhiên hoặc một ngôn ngữ laighép giữa ngôn ngữ tự nhiên với một ngôn ngữ lập trình nào đó gọi là các đoạn giả mãlệnh
Ví dụ 1: mô tả thuật toán tìm ước số chung lớn nhất của hai số nguyên.
Trang 9Output: Ước số chung lớn nhất của a, b.
Thuật toán:
Bước 1: Nếu a=b th́ USCLN(a, b)=a
Bước 2: Nếu a > b th́ t́m USCLN của a-b và b, quay lại bước 1;
Bước 3: Nếu a < b th́ t́m USCLN của a và b-a, quay lại bước 1;
Ví dụ 2: Để giải phương trình bậc hai ax2 + bx +c = 0, ta có thể mô tả thuật toán bằng ngôn ngữ liệt kê như sau:
Bước 1: Xác định các hệ số a,b,c
Bước 2 :Kiểm tra xem các hệ số a,b,c có khác 0 hay không ?
Nếu a=0 quay lại thực hiện bước 1
Bước 3: Tính biểu thức = b2 – 4*a*c
Bước 4:Nếu D <0 thông báo phương trình vô nghiệm và chuyển sang bước 8
Bước 5:Nếu D=0,tính x1=x2=2*b a và chuyển sang bước 7
Bước 6: Tính x1=
a
b
* 2
D
và chuyển sang bước 7
Bước 7: Thông báo các nghiệm x1 , x2
Bước 8: Kết thúc thuật toán
- Sử dụng lưu đồ giải thuật.
Sử dụng các kư hiệu h́nh khối cơ bản để tạo thành một mô tả mang tính h́nh thức
(cách này rơ ràng hơn so với việc mô tả các bước thực hiện thuật toán)
Khối 1: Khối bắt đầu thuật toán, chỉ có duy nhất một đường ra.
Khối 2: Khối kết thúc thuật toán, có thể có nhiều đường vào.
Nhập, XuấtBắt đầu
Trang 10một đường ra.
Khối 4: Rẽ nhánh, kiểm tra biểu thức điều kiện (biểu thức Boolean), nếu biểu thức đúng
thuật toán sẽ đi theo nhánh Đúng (True), nếu biểu thức sai thuật toán sẽ đi theo nhánh Sai(False)
Khối 5: Các câu lệnh nhập và xuất dữ liệu.
d Phân tích thời gian thực hiện giải thuật.
Một giải thuật cho một lời giải thỏa đáng đối với một bài toán phải thỏa:
- Đúng
- Hiệu quả
Thước đo về tính hiệu quả thường là thời gian mà máy sử dụng để giải quyết bàitoán, khi các giá trị đầu vào có một kích thước xác định Thước đo thứ hai là dung lượng
bộ nhớ đòi hỏi để thực hiện giải thuật ứng với giá trị đầu vào có kích thước xác định
Sự phân tích thời gian cần thiết để giải một bài toán có kích thước nào đó, liên quanđến độ phức tạp thời gian của giải thuật Sự phân tích bộ nhớ cần thiết của máy tính liênquan đến độ phức tạp không gian của giải thuật
Sự xem xét độ phức tạp không gian gắn với cấu trúc dữ liệu được dùng để thực hiệngiải thuật Trong phần này ta xét đến độ phức tạp thời gian
Độ phức tạp thời gian là một hàm tỷ lệ với kích thước dữ liệu, ký hiệu là T(n), trong
đó n là kích thước dữ liệu vào
Tuy nhiên T(n) không thể biểu diễn thành đơn vị thời gian là giây, phút…(do cácmáy tính có cấu hình khác nhau, hệ thống khác nhau…) Mặc dù vậy, chúng ta hoàn toàn
có thể so sánh được dựa vào các giá trị của hàm Ví dụ:
Giải thuật 1: - Độ phức tạp thời gian T1(n) = an2
Giải thuật : - Độ phức tạp thời gian T2(n) = kn
Khi n lớn rõ ràng là T1(n) >=T2(n) Vậy giải thuật 1 chậm hơn giải thuật 2
1.3.2 Đánh giá độ phức tạp của giải thuật.
Giả sử ta có hai giải thuật P1 và P2 với thời gian thực hiện tương ứng là T1(n) = 100n2
(với tỷ suất tăng là n2) và T2(n) = 5n 3(với tỷ suất tăng là n3) Giải thuật nào sẽ thực hiệnnhanh hơn? Câu trả lời phụ thuộc vào kích thước dữ liệu vào Với n < 20 thì P2 sẽ nhanhhơn P1 (T2<T1), do hệ số của 5n3 nhỏ hơn hệ số của 100n2 (5<100) Nhưng khi n > 20 thìngươc lại do số mũ của 100n2 nhỏ hơn số mũ của 5n3 (2<3) Ở đây chúng ta chỉ nên quantâm đến trường hợp n>20 vì khi n<20 thì thời gian thực hiện của cả P1 và P2 đều khônglớn và sự khác biệt giữa T1 và T2 là không đáng kể Như vậy một cách hợp lý là ta xét tỷsuất tăng của hàm thời gian thực hiện chương trình thay vì xét chính bản thân thời gianthực hiện
Cho một hàm T(n), T(n) gọi là có độ phức tạp f(n) nếu tồn tại các hằng C, N 0 sao cho T(n)
≤ Cf(n) với mọi n ≥ N 0 (tức là T(n) có tỷ suất tăng là f(n)) và kí hiệu T(n) là O(f(n)) (đọc là
“ô của f(n)”)
Ví dụ 1: T(n)= (n+1) 2có tỷ suất tăng là n2 nên T(n)= (n+1)2 là O(n2)
Trang 11Nói cách khác độ phức tạp tính toán của giải thuật là một hàm chặn trên của hàm thời gian.
Vì hằng nhân tử C trong hàm chặn trên không có ý nghĩa nên ta có thể bỏ qua vì vậy hàm thể hiện độ phức tạp có các dạng thường gặp sau:
Trang 13Ví dụ 1 : Trong một chương trình có 3 bước thực hiện mà thời gian thực hiện từng
bước lần lượt là O(n2), O(n3) và O(nlog2n) thì thời gian thực hiện 2 bước đầu là:
O(max(n2,n3) = O(n3)
Thời gian thực hiện chương trình sẽ là : O(n3,nlog2n) = O(n3)
- Một ứng dụng khác của quy tắc này là nếu g(n) ≤ f(n) với mọi n≤ no thì O(f(n) = g(n)) cũng là O(f(n)) Chẳng hạn : O(n4 + n2) = O(n4) và O(n+Log2) = O(n)
Ví dụ 2: Lệnh gán x:=15 tốn một hằng thời gian hay O(1), Lệnh đọc dữ liệu
READ(x) tốn một hằng thời gian hay O(1).Vậy thời gian thực hiện cả hai lệnh trênnối tiếp nhau là O(max(1,1))=O(1)
* Quy tắc nhân :
Nếu T1(n) và T2(n) là thời gian thực hiện của hai đoạn chương trình P1và P2
và T1(n) = O(f(n)), T2(n) = O(g(n)) thì thời gian thực hiện của đoạn hai đoạn
chương trình đó lồng nhau là T(n) = O(f(n).g(n)).
Qui tắc tổng quát để phân tích một chương trình:
- Thời gian thực hiện của mỗi lệnh gán, READ, WRITE là O(1)
- Thời gian thực hiện của một chuỗi tuần tự các lệnh được xác định bằng quitắc cộng Như vậy thời gian này là thời gian thi hành một lệnh nào đó lâu nhấttrong chuỗi lệnh
- Thời gian thực hiện cấu trúc IF là thời gian lớn nhất thực hiện lệnh sau THENhoặc sau ELSE và thời gian kiểm tra điều kiện Thường thời gian kiểm tra điềukiện là O(1)
Trang 14- Thời gian thực hiện vòng lặp là tổng (trên tất cả các lần lặp) thời gian thựchiện thân vòng lặp Nếu thời gian thực hiện thân vòng lặp không đổi thì thời gianthực hiện vòng lặp là tích của số lần lặp với thời gian thực hiện thân vòng lặp
Trang 15Chương 2: DANH SÁCH
-o0o -2.1 Định nghĩa danh sách.
Danh sách là một tập hữu hạn các phần tử (element) a1, a2, …, an, giữa các phần
tử có mối quan hệ tương đối: Nếu biết phần tử ai thì sẽ định được vị trí phần tử ai+1.Nói cách khác hơn, các phần tử thuộc một danh sách có thể sắp xếp tuyến tính
Ví dụ 1: - Danh sách sinh viên là một danh sách
- Kiểu dữ liệu mảng trong pascal là một danh sách
a: aray [1 elemno] of integer;
2.2.3 Các phép toán trên danh sách:
a Khởi tạo danh sách:
Khi khởi tạo danh sách, nếu danh sách là rỗng ta cho số phần tử bằng 0
* Thuật toán
Procedure Initialize;
Trang 16n :=0;
End;
b Thêm một phần tử vào danh sách:
Khi thêm một phần tử vào danh sách tại vị trí thứ i thì các phần tử cũ từ a[i]đến a[n] được di chuyển về phía sau 1 bước
Thuật toán:
Procedure Insert_element(i : integer; Newinfo : integer);
Var
j : integer ;Begin
For j:= n downto i do a[j+1] := a[j];
a[j] := Newinfo ;n:= n +1 ;
end;
c Loại bỏ một phần tử của danh sách:
Khi loại bỏ phần tử a[i] của danh sách, các phần tử còn lại từ a[i+1] đếna[n] được di chuyển về phía trước một bước
d Tìm kiếm một phần tử trong danh sách:
Khi tìm kiếm một phần tử trong danh sách đặc có khoá là k, ta có thể dùngthuật toán tìm kiếm tuần tự với danh sách chưa có thứ tự, hay thuật toán tìm kiếm
nhị phân với danh sách đã có thứ tự Ta sẽ nghiên cứu kĩ hơn trong bài 4.
2.2.4 Ưu nhược điểm và ứng dụng.
- Ưu điểm:
+ Mật độ sử dụng là 100%
+ Dễ dàng truy xuất đến phần tử a[i] nhờ địa chỉ
Trang 17+ Sử dụng các thuật toán hiệu năng để tìm kiếm (thuật toán tìm kiếm nhị phân).
- Khuyết điểm:
+ Không gian nhớ cố định, vùng nhớ liên tục
+ Việc thêm là loại bỏ một phần tử vào danh sách thời gian thực hiện tỷ lệ với
số lượng phần tử của danh sách T(n)max = O(n)
+ Lãng phí khi số lượng các phần tử có cùng giá trị cao
+ Bộ nhớ được quản lý kém linh động
2.3 Danh sách liên kết, các phép toán.
2.3.1 Định nghĩa
Danh sách liên kết là danh sách mà các phần tử được nối kết nhau nhờ vào
vùng liên kết của chúng.
Danh sách liên kết là một loại cấu trúc đơn giản và thích hợp với các phép
thêm vào, phép loại bỏ, phép ghép nhiều danh sách mà các phép toán này lại
không thích hợp cho danh sách đặc.
2.3.2 Danh sách liên kết đơn.
2.3.2.1 Tổ chức cấu trúc dữ liệu.
Danh sách liên kết là danh sách mà mỗi phần tử của danh sách được lưu trữtrong một phần tử nhớ mà ta gọi là nút (node) Các nút này có thể nằm bất kỳtrong bộ nhớ Trong mỗi nút, ngoài phần thông tin ứng với một phần tử còn cóchứa địa chỉ của phần tử đứng sau nó trong danh sách Qui cách của mỗi nút có thểhình dung như sau:
Trường INFO chứa thông tin của phần tử
Trường LINK chứa địa chỉ của nút tiếp theo
Riêng nút cuối cùng trong danh sách thì không có nút đứng sau nó nên mối nối
ở nút này phải là một “địa chỉ đặc biệt” đỉ dùng để đánh dấu nút kết thúc danhsách chứ không như các địa chỉ ở các nút khác ta gọi là “mối nối không” và kýhiệu là nill
Để có thể truy nhập vào mọi nút trong danh sách, tất nhiên là phải truy nhậpđược vào nút đầu tiên, nghĩa là cần có một con trỏ First trỏ tới nút đầu tiên này
INFO LINK
Trang 18Nếu dùng mũi tên để chỉ mối nối, ta sẽ có một hình ảnh danh sách móc nối đơnnhư sau:
Dấu chỉ mối nối không Người ta quy ước: Nếu danh sách rỗng thì First=null
Ví dụ: Danh sách sinh viên bao gồm những sinh viên mà mỗi sinh viên có kiểu dữ
liệu record như sau:
2.3.2.2 Các thao tác trên danh sách liên kết đơn.
a Khởi tạo danh sách.
Khi khởi tạo danh sách liên kết, danh sách là rỗng, ta cho First là nil.
First
Trang 19Procedure khoitao;
Begin
First:=nil;
End;
b Tìm kiếm một phần tử trong danh sách.
Tìm kiếm một phần tử có vùng Info là x Phép tìm kiếm được bắt đầu từ phần
tử đầu tiên rồi tuần tự theo vùng liên kết để đến phần tử kế tiếp Thuật toán kết
thúc khi tìm thấy phần tử có vùng Info là x hoặc đi hết danh sách mà không tìm
thấy Nếu danh sách có thứ tự thì việc tìm kiếm sẽ kết thúc sớm hơn
Hàm Search trả về địa chỉ của phần tử tìm thấy đầu tiên hoặc trả về giá trị nil
nếu không tìm thấy
* Trường hợp danh sách chưa có thứ tự:
Ta phải tìm kiếm khoá x bắt đầu từ phần tử đầu tiên cho đến khi tìm thấy
khoá này trong danh sách hoặc cho đến khi hết danh sách nếu không tìm thấy
Hàm Search trả về địa chỉ của phần tử đầu tiên có nội dung là x (tìm thấy) hoặc trả về giá trị nil (không tìm thấy).
while ( p<> nil) and ( not found) do
if p^.info = x then found := trueelse p := p^.Link;
Search := p;
end;
* Trường hợp có thứ tự:
- Dạng lặp:
Trang 20Vì danh sách đã có thứ tự nên ta chỉ cần tìm kiếm khoá x cho đến khi tìm thấykhoá này trong danh sách hoặc cho đến khi khoá của phần tử hiện tại luôn lớn hơn
x nếu không tìm thấy
Hàm Search trả về giá trị của phần tử đầu tiên có nội dung là x (tìm gặp) hoặc
trả về giá trị nil (không tìm gặp)
while (p<> nil) and (p^.info <x) do p:= p^.Link;
if (p<> nil) and (p^.info >x) then p := nil;
Search := p;
End;
c Thêm một phần tử vào danh sách :
Trường hợp 1 : Phần tử p được thêm vào đầu danh sách Ta cho vùng liên kết
của p chỉ vào First, sau đó cho First chỉ vào p
Trang 21Trường hợp 2: Phần tử p được thêm vào giữa hoặc cuối danh sách.
Gọi q là phần tử đứng ngay trước p Ta cho vùng liên kết của p chỉ vào liên kết của
q, sau đó vùng liên kết của q chỉ vào p
Trang 22
Hàm Insert_list trả về địa chỉ của phần tử mới có nội dung là NewInfo
được thêm vào một danh sách liên kết đã có thứ tự tăng dần
before – phần tử đứng ngay trước phần tử p theo liên kết
Trang 23Trường hợp 1 : Phần tử p là phần tử đầu tiên của danh sách Ta cho chỉ điểm
First chỉ vào liên kết của p rồi giải phóng p
Thủ tục Delete_First thực hiện xoá phần tử đầu tiên của danh sách:
Procedure Delete_First(Var First:Tro);
Trường hợp 2 : Phần tử p là phần tử giữa hay cuối của danh sách Gọi q là
phần tử đứng trước p Ta cho vùng liên kết của q chỉ vào liên kết của p và giảiphóng p
Thủ tục Delete_element thực hiện xoá nút đứng kế tiếp sau nút q:
Procedure Delete_element(q: tro);
Var
P : tro;
Trang 24e Ghép một danh sách vào một danh sách khác.
Thủ tục Insert thực hiện ghép danh sách First2 vào kế sau nút q của danh sách
First1:
Procedure Insert(q:tro);
Var p : tro;
Begin
{tìm phần tử cuối danh sách First2}
If First2 <> nil thenBegin