1. Trang chủ
  2. » Giáo Dục - Đào Tạo

Giáo trình cấu trúc dữ liệu và giải thuật (nghề tin học ứng dụng trình độ cao đẳng)

59 3 0
Tài liệu được quét OCR, nội dung có thể không chính xác
Tài liệu đã được kiểm tra trùng lặp

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề Giáo trình cấu trúc dữ liệu và giải thuật (nghề tin học ứng dụng trình độ cao đẳng)
Trường học Trường Cao Đẳng Giao Thông Vận Tải Trung Ương
Chuyên ngành Cấu trúc dữ liệu và giải thuật
Thể loại Giáo trình
Năm xuất bản 2019
Thành phố Hà Nội
Định dạng
Số trang 59
Dung lượng 3,52 MB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

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 1

BỘ 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 3

TUYEN 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 4

LỜ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 5

MỤ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 7

CHUONG 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 8

121 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 9

S¡ 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 10

Câ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 11

Chừ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 12

Từ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 14

4 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 15

VD: 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 16

Có 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 17

Call HaNoi (n-1, B,A, C) End

Trang 18

2 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 20

VỊ] 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 21

2.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 22

A[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 23

4 {Đư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 24

thuậ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 27

Mũ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 29

2 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”

Ngày đăng: 29/12/2022, 15:24

🧩 Sản phẩm bạn có thể quan tâm

w