hạng ~ _ Các phép toán trong giải thuật luôn được xác định rõ ràng , không mập mờ, ai cũng có thể hiểu được cách thực của ~ _ Chú ý: Giải thuật có thể thay đổi khi cấu trúc dữ liệu th
Trang 1BỘ GIAO THÔNG VẬN TẢI
TRUONG CAO DANG GIAO THONG VAN TAI TRUNG UONGI
Ban hành theo Quyết định số 498/GĐ-CĐGTVTTWI-ĐT ngày 25/03/2019
của Hiệu trưởng Trường Cao đẳng GTVT Trung ương l
Trang 3TUYEN BO BAN QUYEN
Tải liệu này thuộc loại sách giáo trình nên các nguồn thông tin có thể được phép dùng nguyên bản hoặc trích dẫn dùng cho các mục đích về đảo tạo và tham khảo
Mọi mục đích khác mang tính lệch lạc hoặc sử dụng với mục đích kinh doanh thiếu
lành mạnh sẽ bị nghiêm cắm
Mã tài liệu: THUD - MH1S
Trang 4LỜI NÓI ĐÀU
Giáo trình này là một trong những giáo trình chính yếu của ngành Tin học ứng
dụng Giáo trình được xây dựng theo phương châm vừa đáp ứng yêu cầu chuẩn mực của
sách giáo khoa, vừa có giá trị thực tiễn, đồng thời tăng cường khả năng tự học, tự nghiên cứu của sinh viên Trên cơ sở đó, chúng tôi đã nghiên cứu & tham khảo nhiều tài liệu có
gi trị của các tắc giả trong và ngoài nước
Giáo trình được dùng làm tải liệu học tập cho sinh viên ngành Tin học ứng dụng
“Trình độ Cao đẳng - Trường Cao đẳng GTVT Trung wong I
‘Va làm tài liệu tham khảo nội bộ cho Giáo viên
Trong quá trình biên soạn, sẽ không thể tránh khỏi những thiếu sót Chúng tôi rất
mong nhận được các ý kiến đóng góp để giáo trình ngày càng hoàn thiện hơn
“Xin chân thành cảm ơn!
NHÓM BIÊN SOẠN
Trang 5MỤC LỤC
CHƯƠNG 1: GIẢI THUẬT
11 Cấu trúc dữ liệu và giải thuật
12 Ned ng dif gs
122 Kj tyrva bidu thie
2.32, Tim kiếm trên cấu trúe mảng ———
CHƯƠNG 3: DANH SÁCH
3.2 Lưutrữ kế tiếm đối với danh sách ‘i nee “ „26
3⁄3 Lưu trữ móc nỗi đối với danh sách
Trang 6'CHƯƠNG 4: NGĂN XẾP (Stack) VÀ HÀNG ĐỢI (Queue)
'CHƯƠNG 5 : CẤU TRÚC CÂY(Tree)
5.1 Binh nghĩa và một số khái niệm:
5.2 Cây nhị phân: „ 3.2.1 Định nghĩa „41
5.3 Biểu diễn trong máy của các cây nhị phân — 43
5.4 Phép duyệt cây nhị phân sec 7 —
5.5 Biểu diễn cây tổng quát bằng cây nhị phân is 48
5.6 Ap dung
CHƯƠNG 6: ĐỒ THỊ (GRAPH)
'6.1 Định nghĩa và một số khái niệm,
6.2 Biéu diễn trong máy tính của đồ thị -.-55
Trang 7CHUONG 1: GIAI THUAT
Giới thiệu về môn học:
thuật là một trong những môn học cơ bản của sinh viên
nghành CNTT khi muốn tiếp cận với lập trình và xây dựng phần mềm Cấu trúc dữ liệu và các giải thuật được xem như là yếu tố quan trọng nhất trong lập trình Chương trình phần mềm = Cấu trúc + Giải thuật
Cấu trúc dữ liệu có thể được xem như là một phương pháp lưu trữ dữ liệu trong
1.1 Cấu trúc dữ liệu và giải thuật
~ _ Giải thuật (Thuật toán): Giải thuật là một tập hữu hạn các phép toán cơ sở được sắp đặt theo quy tắc chính xác, nhằm giải một bài toán
~ _ Các phép toán cơ sở là các phép toán đơn giản mà thời gian thực hiện nó luôn là một hằng số, nghĩa là nó không phụ thuộc vào kích thước của toán hạng
~ _ Các phép toán trong giải thuật luôn được xác định rõ ràng , không mập mờ,
ai cũng có thể hiểu được cách thực của
~ _ Chú ý: Giải thuật có thể thay đổi khi cấu trúc dữ liệu thay đổi
1.2 Ngôn ngữ diễn giả:
~ _ Nếu sử dụng đến một ngôn ngữ lập trình cấp cao nào đó chẳng hạn như Pascal, C .Nhur vậy sẽ gặp một số hạn chế sau:
+ Phải luôn tuân thủ cú pháp chặt chẽ của ngôn ngữ đó, khiến cho việc trình
bày giải thật và cấu trúc dữ liệu có thiên hướng nặng nề, gò bỏ
+ Phải phụ thuộc vào cấu trúc dữ liệu tiền định (Mỗi một ngôn ngữ dữ liệu
đề ấn định sẵn những cấu trúc dữ liệu cho riêng mình)của ngôn ngữ lên không thể hiện được dầy đủ các ý của từng giải thuật
+ Ngôn ngữ đã chọn không phải ai cũng ưa thích và sử dụng
- Như vậy ở đây ta sẽ dùng ngôn ngữ thô hơn có đủ khả năng diễn đặt đc giải
thuật ta tạm gọi bằng các tên ngôn ngữ tựa Pascal.Các quy tác bắt đầu
8
Trang 8121 Quy tác về cấu trúc chương trình:
Mỗi chương trình đều được ngắn một tên đẻ phân biệt, tên này được viết
bằng chữ in hoa, có thể thêm dấu gạch nối và bắt đầu bằng từ khóa
Program
VD: Program TEN_CHUONG_TRINH
Độ dài tên không bị bạn chế
Sau tên có thể kèm theo lời thuyết minh (Ở đây ta quy ước dùng tiếng việt)
Phần thuyết minh được đặt giữa 2 đấu { }
'Ký tự và biểu thức
Ký tự dùng ở đây giống như các ngôn ngữ chuẩn
26 chữ cái Latinh in hoa hoặc in thường
10 chữ số thập phân
Các dấu phép toán số học + , - , *, /, † (Lũy thừa)
Các dấu phép toán quan hệ: <, >, =, <>, #
Giá trị logic: True, false
Dấu phép toán logic: and, or, not
Tên biến: Dãy chữ bắt đầu bằng chữ cái
Biến chỉ số có hạng: A[i], B[ij] vv
Trang 9S¡ i=1, „n là các câu lệnh
Nó chõ phép nghép nhiều câu lệnh lại để thành một câu lệnh
Câu lệnh điền kiện
Trang 10Câu lệnh này cho phép phân biệt các tình huống xử lý khác nhau trong các điều kiện khác nhau mà không cần dùng đến câu lệnh iF
lồng nhau Có thể điễn tả bởi sơ đồ
Nhằm thực hiện câu lệnh S với ¡ lất giá trị nguyên từ m tới n (n>=m) với
bước nhay tăng =1
Hoặc :
For ï:=n down to m do S
Tương tự như câu lệnh trên với bước nhay giảm 1
b Với số lần lặp không biết trước
Trang 11Chừng nào B có giá trị true thì thực hiện S
Hoặc;
Repeat § until B Lap S cho tới khi B có giá trị đúng (S có thể là một dãy lệnh)
Read ( <Danh sách bién>)
'Write(<Danh sách biến hoặc dòng ký tự>)
Các biến trong danh sách cách nhau bởi dấu phẩy
Dòng ký tự là một dãy các ký tự đặt giữa 2 dấu °*
Trang 12Từkhóa oc u thaychofunetion
Trong cấu tạo của chương trình con hàm bao giờ cũng có câu lệnh gắn
mà tên hàm nằm ở vế trái Còn đối với tên hàm con thủ tục thì không có
Lời gọi chương trình con hàm thể hiện bằng tên hàm
Lời gọi của chương trình con thủ tục thể hiện bằng câu lệnh call có dạng: 'Call<Tên thủ tục>(<Danh sách tham số thực>)
1.3 Thiết kế giải thuật
~ _ Thiết kể kiểu top-down (Cách thiết kế đi
~_ Để giải quyết được yêu cầu thì phải làm gì
~ _ Với mỗi công việc ấy thì phải làm thể nào?
VD: Ta xét bai toán sau : Sắp xếp dãy số (ai, 8a,
«Để có đc kết quả output như vậy thì phải làm gì?
Có thể thấy rằng sắp xếp theo kiểu tăng dần nghĩa là:
+ Số bé nhất trong N số phải được đặt ở vị trí đầu tiên
+ Số bé nhất trong (N-1) số còn lại phải đc đặt vào vị trị thứ 2
+o
Như vậy có 2 công việc chính phải làm:
+ Chọn số bé nhất trong dãy số chưa được sắp xếp
1
Trang 13+ Đặt nó vào vị trí sau phần tử cuối của dãy số đã được sắp xép
Chú ý: Lúc đầu dãy số còn rỗng, sau đó nó được bổ xung dần dần các phần
1 2 công việc được lặp lại n-1 lần
For i=1 to (n-1) đo begin
2 Chọn số nhỏ nhất A[k] trong dãy các số
Ali, Ali#1], Abn]
3 Hoán vj gitta A[k] va A[i]
4 Reture
5 End;
Bây giời ta đi sâu vào từng công việc
+ Chọn số nhỏ nhất trong dãy số: Ai], A[i+1], A[n]
K;=l ;{Coi phần tử đầu là nhỏ nhất lúc đó, và giữ lại chỉ số của nó}
For j:= i+ ton do
If Afj]l<A(k] then k=
+ Hoán đồi cị trí cho nhau:
'Hoán đổi giữa 2 vị trí A[k] va A[i]
LOC :=A[K]; A[KEAIH]; AIII:=LOC;
Tổng hợp những ghi nhận ở trên ta di tới một thủ tục thể hiện giải thuật sắp xếp, bằng ngôn ngữ tựa pascal như sau:
Procedure Selection_sort (A,n);
1
Trang 144 IfAGj] < Ak] then k:=j;
5 Loe:=A[k]; A[k]:= Ali]; Afi] =
6 And;
7 Reture
1.4 Đánh giá giải thuật
~ Khi một giải thuật được thực hiện thường nó liên quan đến 2 yếu tố
+ Không gian nhớ cần thiết cho những cấu trúc lưu trữ
+ Thời gian cần thiết để thực hiện
Nếu Thời gian thực hiện giải thuật càng nhanh thì không gian nhớ cần thiết cho cầu trúc lưu trữ dữ liệu càng lớn Thông thường thời gian thực hiện giải thuật vẫn được chú ý nhiều hơn Vì vậy ta sét tới việc đánh giá thời gian thực hiện giải thuật
~ Cùng một bải toán nếu giải thuật A1 có thời gian thực hiện là :
Ti(n)=8n
- Giải thuật A2 có thời gian thực hiện 1a : T,(n)=2n?
~_ Ta thấy khi n đủ lớn thì T;(n) < T›(n) (Chi edn n=4) và n càng lớn thì
sự chênh lệnh cảng rõ Như vậy lúc đó ta có thể nói:
- Khin dd l6n thì giải thuật A1 nhanh hơn giải thuật A2
1.5 Giải thuật đệ quy
1.5.1 Định nghĩa:
~- Đệ quy là một khái niệm rất qua trọng trong tin học
~_ Một đối tượng gọi là đệ quy nếu nó bao gồm chính nó như một bộ phận
~_ Một hằm gọi là đệ quy nếu trong định nghĩa của nó lại có dạng là chính nó
thì
VD: Hàm tính giai thừa của một số nguyên dương với quy ước 0!='
hàm này sẽ được định nghĩa như sau:
Trang 15VD: Ta muốn tính 4! Theo định nghĩa ta có:
4-4431
3153.2!
22.1
1I=L01 Nhu vay 4!= 4.3.2.1=24
Với số đầu là 1 và 1 thì số sau là tổng của hai số đứng trước nó Các
số này được cai là giá trị của hàm Eib với đối số là số nguyên dương n
mà ta gọi là him Fibonacci, Ta cé thể định nghĩa hàm này như sau: -_Nếu n=l hoạc n=2 thì Fib(n)=1
~_ Nếu n>2 thì Fib(n)=Fib(n-1) + Fib (n-2)
~ Từ đó ta có thể viết giải thuật tính giá trị của Fib(n) dưới đạng thủ túc đệ quy như sau
Function Fib(n)
TỶ n<=2 then Fil
:=Fib(n-1)+Fib(n-2)
3 Bài toán tháp Hà Nội
Đây là một bài toán mang tính chất một trò chơi và có nội dung như sau:
16
Trang 16Có n đĩa kích thước nhỏ dần , đĩa có lỗ ở giữa , có thể sắp xếp chúng chồng lên nhau xuyên qua một cọc, to ở dưới , nhỏ ở trên , để cuối cùng có một
chồng đĩa giống như cái tháp (Như dạng táp rùa ở hồ gương Hà Nội)
- Cón cọc A, B, C Hiện N đĩa đang được xếp ở cột A yêu cầu đặt ra: Chuyển
cọc đĩa từ cọc A sang cọc C, theo những điều kiện sau
1
+
3
Mỗi lần chỉ được chuyền 1 đĩa
Không khi nào có tình huống đĩa to ở trên , đĩa nhỏ ở dưới
Được phép sửa dụng 1 cọc làm cọc trung chuyển Chẳng hạn khi chuyển
từ A sang cọc C thì cọc B được làm cọc trung chuyển
Ta xét một vài trường hợp đơn giản
a, N=l(Chỉ có một đĩa) thì ta chỉ cần 1 phép chuyển
Chuyển đĩa đang ở A sang C (Ký hiệu là A->C)
b N=2 phải thực hiện 3 phép chuyển
+ Chuyển đĩa thứ nhất từ cọc A sang cọc B (A->B)
+ Chuyển đĩa thứ 2 từ cọc A sang cọc C (A->C)
+ Chuyển đĩa từ cọn B sang cọc C (B->C)
e Trường hợp N>2
Ta thấy nếu coi (n-1) đãi ở trên đóng vai trò như đĩa thứ nhất thì có thể hình dung như đang có 2 đĩa ở cọc A Nếu vậy ta có thể có giải thuật như sau:
+ Chuyển (n-1) đĩa trên từ A->B
+ Chuyển đĩa thứ n từ AC
+ Chuyển (n-1) đĩa tir BC
Vay cach giả này mang tính chất để quy và giải thuật tương ứng sẽ
được thể hiện qua thủ tục đệ quy như sau:
Procedure HaNoi(n, A, B, C)
1 Ifn=l then chuyển đĩa từ A sang C
2 Else begin call HaNoi(n-1,A ,C, B)
Call HaNoi (1, A,B, C)
”
Trang 17Call HaNoi (n-1, B,A, C) End
Trang 182 Giải thuật đệ quy thường gắn gọn và cách viết khá đơn giản đó là điều kiện thuận lợi cho người lập trình nếu như họ biết cách khai thác được tỉnh đệ quy trong phép giải Tuy nhiên điều đó không có nghĩa là chúng ta thực hiện nhanh Với him giai thừa hoặc him Fibonacci néu ở trên ta có thể lập được
giải thuật không đệ quy (Dùng phép lặp để tính) mà thời gian thực hiện sẽ
nhanh hơn
3 Vì vậy chỉ lên coi dé quy là một công cụ để giải bài toán Đối với người làm tin học cũng lên làm quen với cách tiếp cận đệ quy, khi thiết lập giải thuật,
và đánh giá được thời gian thực hiện giải thuật
4 Ngôn ngữ pascal , hay C vv đều cho phép viết thủ tục dưới dạng đệ quy
Có nghĩa là chương trình dịch của ngôn ngữ này sẽ dảm nhiệm việc chuyển thủ tục đó sang một thủ tục tương đương mà không phải là để quy (Gọi là
khử đệ quy) vì trong máy tính điện tử không hề có phép tính đệ quy
CHƯƠNG 2: CÁU TRÚC MĂNG
2.1 Định nghĩa:
Mang là tập hợp các ký tự , bao gồm một số xác định N phẫn từ (n được gọi là
độ dai hay kích thước của mảng) Ngoài giá trị mỗi phần tử của mảng còn được đặc trưng bàng chỉ số index, thể hiện thứ tự của phần tử đó trong mảng
Các giá trị của phần tử mảng đều cùng một loại
Đối với mảng thường có các phép toán sau:
+ Tạo lập một mảng
+ Duyệt qua các phần tử của mảng
+ Tìm kiếm một phần tư của mảng
+ Sắp xếp các phần tử trong mảng theo một thứ tự ấn định vv
'Vì số phần từ của mảng là cố định lên không có phép bồ xung phần tử mới
vào bảng hoặc loại bỏ phần tử ra khỏi mảng
~_ Vectơ là mảng một chiều, mỗi phần tử của nó ứng với một chỉ số
VD: Phan tir vée to A , ký hiệu là A, hoặc A[i] với ¡ là chỉ số
-_ Ma trận là mảng 2 chiều mỗi phần tử của nó ứng với 2 chỉ số
Vd: Phan tir ma tran B , ký hiệu là Bụ hoặc BỊ1Jj] với 1 1a chỉ số hàng, j là chỉ
số cột
19
Trang 19+ C2 Lưu trữ các địa chỉ cần thiết ở một chỗ quy định , khi cần xác định sẽ
lấy từ đó ra Loại đại chỉ này gọi là địa chỉ con trỏ (pointer) hoặc mối nói link
2.2.2 Lưu trữ kế tiếp đối với mảng:
~ Thông thường mảng được lưu trữ trong máy dưới dạng vectơ (Gọi là vecto
ưu tữ ) Đó là một dãy các từ máy kế tiếp nhau vì vậy gọi là các lưu trữ kế
tiếp
‘VD: Luu ming 1 chiều hay 1 vecto A
+ Phần tử mang la Afi] voi I< <n
+ Mỗi phần tử của vecto được lưu trữ trong một ô nhớ gồm có 1 tir may dé
thể hiện nó
+ Vậy để lưu vecto A thì phải dùng đến n từ máy kế tiếp nhau đó chính là n phần tử của vecto lưu trữ V(V là veeto lưu trữ vecto đang xét) Phần tử VỊi]
của vecto V sẽ chứa phần tử A[i] của vecto đang sét
+ Nếu mỗi phần tử của vecto lưu trữ V (Mỗi ô nhớ của V) phải gồm w thừ
máy mới đủ chứa một phần tử A[i] thì lúc đó V phải bao gồm n*w từ máy
kế tiếp Đại chỉ mỗi ô nhớ „ nghĩa là mỗi phan tir V[i] bay giờ là địa chỉ của
từ máy đầu tiên của ô nhớ
'VD: nếu w=3 đại chỉ của VỊI]1000 thi đại chỉ của V[2]=1003, V[3]}=1006
20
Trang 20VỊ] VỊ2) VBI Vial
v[ An [ad | am | : sẽ Am]
= Dai chi cia V[1] goi là đại chỉ gốc ký hiệu là Lạ
~ _ Như vậy việc xác định địa chỉ V{¡] hay nói cách khách là Ai] được tính theo công thức như sau:
¥( By [Ba [Bn] Be [52 [Bol [Bes [Bsa] Bạ [Bạ,| Bạ |
Trang 212.3.1 Sắp xếp trên cấu trúc mảng
~ _ Đặt bài toán: Sắp xếp là quá trình bố trí lại các phần tử của một tập đối
tượng nảo đó theo một thứu tự ấn định
~ _ VD: Cho một dãy số A gồm n phần tửu khác nhau , mà ta coi như là n vecto với n phần tử : A[1], A[2] A[n]
Trong đó A[i]#A[i] với
Hãy sắp sếp các phần tir A dé chuyển nó thành một dãy số có thứ tự tăng
p được minh họa theo bảng sau:
lược §ốnhỏnhấ AI] Al2j A3] Al4j Al5J] A(6] AI ALS]
b Sắp xếp theo kiểu thêm dần
~ _ Như sấp xếp các quân bài trên tay theo 1 trận tự nào đây
~_ Với dãy số A thì hoạt đầu A[1] coi như một dãy con được sắp xếp A[2] sẽ
được xét tới : Nếu A[2]<A[1], thì nó được chèn vào trước A[1], còn nếu
2
Trang 22A[2] > A[I], nó sẽ được giữ nguyên tại chỗ (Coi như nó được chèn vào sau
AU)
- Day con A[1], A[2] bây giờ coi như được sắp xếp, và A[3] được xét tới , tùy
theo kết quả cảu việc so sánh A[3] với A[2], A[1] nó lại được trèn vào hoặc sau A[2], hoặc giữa A[1] và A[2], hoặc trước A[1]
~_ Quá trình tiếp tục với A4], A{S] cho tới khi toàn bộ dãy A được sắp xếp
lợi sốđượcxế AL] AL] AL] AL] AIS] Af6] AI] Als]
Chi day con đã được sap
Sau đây là giải thuật sắp xếp kiểu thêm dần
Procedure insert- sort (A,n)
{Trong thủ tục này người ta dùng X làm một ô nhớ phụ để chứa khóa mới đang đc Xét }
1 {Khởi tạo số giả}
A[0]:= - { -œ ký hiệu chỉ số nhỏ hơn mọi phần tử của A}
Trang 234 {Đưa X vào đúng chỗ của nó}
Ali+ll=x
End ;
Return
e Sắp xếp kiểu đổi chỗ (Giải thuật sắp xếp kiểu nỗi bot)
Giải thuật này duyệt từ đáy lên Dọc đường nếu gặp 2 phần tử ngược thứ tự (Nhĩa là A[L+1] < A[i] ) Như vậy sau lượt đầu phần tử nhỏ nhất của A sẽ ddc
chuyển lên đỉnh Lượt tiếp theo phần tử nhỏ nhất trong (n-1) phần tửu còn lại sẽ đc
Cứ tiếp như vậy sau n-1 lần day A sé đc sắp xép theo thir
| Am | 4s | 43 | 66 | 83 15 75 T5 | 75
AB] | 75 | 73 | 7 | m— 83 | 83 | $3 | 8
Giải thuật nổi bọt đe sắp sếp như sau:
Procedure Bubble ~ Sort
1 For i:=1 to n-l do
2 {Duyệt từ đáy lên}
Forj=n down to i+ do
3 {Nếu ngược thứ tự thì đôi chỗ }
If Afj] < Afj-1] then
24
Trang 24thuật này còn cứng nhắc, Sau mỗi phần tử nó chỉ bớt đi 1 phần tử cho
2.3.2 Tìm kiếm trên cấu trúc mảng
1 Đặt bài toán
Tìm kiếm một phần tử nào đó của một tập đối tượng theo một tiêu trí đã đề ra là một bài toán rất phố biết trong tin học Ở đây ta xét tới một dạng đơn giản của nó Cho một vecto A gồm n phần từ có giá trị là các số khác nhau
Function SEQ (A,n,X);
{Thủ tục này sẽ tìm xem trong các phần tử của A có phần tử nào có giá trị bằng
X hay không Nếu có thì nó ghi nhận lại chỉ số của phần tử đó , nếu không thi
nó ghi nhận số 0 Trong thủ tục này người ta đua vào phần tử giả A[n+1] mà giá
Trang 25'While A[i] # X do E=i+l;
{Thấy hay không thấy}
Trong danh sách luôn có phần tửu đầu (Phần tửu thứ nhất) phần tử cuối
(Phần tửu thứ n) Với mỗi phần tử có phần từ trước nó (Trừ phần tử đầu ) và
phần từ sau nó ( trừ phần tủ cuối) Đối với ds thì thường có phép phải bổ sung thêm phần tử mới loại bỏ đi phần tử cũ ngoài ra có thể còn có các phép như:
+ Tìm kiếm phần tử theo một yêu cầu sác định
+ Cập nhật một phần tử
+ Sắp xếp các phần tử
+ Ghép nhiều danh sách thành 1 danh sách
+ Tách đánh sách thành nhieeud đs con
Lưu trữ kế tiếm đối với danh sách
~ Cũng như đối với mảng , danh sách có thể được lưu trữ trong bộ nhớ bởi ! vecto lưu trữ V gồm n ô nhớ kế tiếp Mỗi phần tửu A, của ds A sẽ de lưu trữ trong một ô nhớ VỊi] (Phần tử thứ I của v) với !<=I <=n
Lưu trữ móc nối đối với danh sách
3.3.1 Giới thiệu phương pháp
26
Trang 26~ _ Mỗi phần tử của đs được lưu trữ trong một ô nhớ ta gọi là nut
~ _ Mỗi nút bao gồn một số từ máy kể tiếp đủ để lưu trữ thông tin cần thiết đó là thông tin ứng với mỗi phần tir cia ds va đại chỉ nút tiếp theo
+ Trường INFO chứa thông tin ứng với phần tử của đs
+ Trường link chứa địa chỉ của nút tiếp theo
Chú ý: Riêng nut cuối cùng thi không có nút tiếp theo nữa lên đường link cảu nó phải chứa một địa đặc biệt , chi mang tinh chất quy ước dùng để đánh
dấu nút kết thúc đs
- Để truy cập vào | mut trong ds thì phải biết được đại chỉ của nút đầu tiên hay nói một cách khác phải nắm đc con trõ L trior tới nót đầu tiên này
~_ Ví dụ ta có một ds sau, ta muốn công bố ds đó theo tử tự từ điển, ta có thể tổ
chức theo kiểu móc nối như sau:
27
Trang 27Mũi tên — : chỉ "mối nổi" : địa chỉ nút tiếp theo
Đấu x : chỉ "mối nối không” (địa chi null)
Ở đây mối nối đã được thay bằng số thứ tự ( có thê coi đây là đc tương đối), mối
không đã được ký hiệu bằng số 0 (Không có stt nào bằng 0 cả) Địa chỉ L ở đây bằng 8 ứng vị it đi của ds, Có inh họa bằng hình anh sau:
28
Trang 28
Nút đầu tiền dau ds nay cé dai chỉ là 8 dựa vào đường link ta có thể biết nút tiếp theo có địa chi la 5
Cần chú ý là: Một cách tổng quát thì mỗi bút của ds móc nối có thể nằm ở bắt ký chỗ nào trong bộ nhớ và nhưu vậy địa chỉ nằm ở đường link ở mỗi nút là địa chỉ
thực cầu nút tiếp theo
Người ta quy ước ds rỗng là ds khong có chứa nút nào Lúc đó L=null
Es Néu P là con trỏ , trỏ đến một nút bắt ký trong ds móc nỗi thì phần thông
tin của phần tử tương ứng sẽ đc ký hiệu là Info(p)
7 Phần địa chỉ của nút tiép theo ksy higu la Link(p)
- Câu lệnh Call new(p): Sẽ cho ta một nút trống với một quy các nhất định
và có địa chỉ p để sử dụng
- Call dispose (p): Tra lại cho ta đs trống rỗng nút có địa chỉ là P
3.3.2 Một số phép toán trên ds móc nối
1 Duyệt qua một đs móc nối
~ _ Phép duyệt một đs móc nối là phép thăm từng nút trong ds đó mỗi nút chỉ thăm một lần , ở mỗi nút ta thực hiện một phép sử lý nào đó Bài toán de phát biểu như sau;
* Cho một ds móc nối , con trỏ L trỏ tới nút dau tién trong ds hy in làn lượt phần thông tin của từng nút trong ds đó”
~ _ Ta dùng một biến p dé ghi nhận địa chỉ của từng nút trong phép duyệt Ban đầu p lấy giá trị của L, sau đó lần lượt lấy giá trị đại chỉ của các nút tiếp theo (P được gọi là biển con trỏ)
Procedure travers (L);
1, If L:=Null then return; {néu ds rỗng thì ko làm gì}
2 PL; {p lấy giá trị của L}
3 While p#null đo begin
Trang 292 Bé sung thêm một nút vào đs
*Cho một ds móc nối có con trỏ L trỏ tới nút đầu tiên Hay bd sung thêm một
nút mớ vào trước nút đầu tiên này (Nếu có) Thông tỉn của nút mới này 1a A” Procedure Insert (L.A)
1 {Tạo một nút mới}
Call new(p);
Info(p):=A {Gán A vào trường info}
Link(p):=L {Gan địa chỉ L vào trường link}
3 Loại bỏ nút ra khỏi ds móc nối
*Cho đs móc nối với L trỏ vào nút đầu tiên trong ds, gid sit ring ds này không rỗng hãy loại bỏ nút cuối cùng của ds”